blob: 55b65a3a33439508e18e6a6a5f06ba4eb82553fb [file] [log] [blame]
Andrew Grieve7dd4aaf2021-04-27 21:47:081#!/usr/bin/env python3
Ingemar Ådahl6ada47b2017-07-10 17:14:012
Avi Drissman75198092022-09-08 20:33:383# Copyright 2017 The Chromium Authors
Ingemar Ådahl6ada47b2017-07-10 17:14:014# Use of this source code is governed by a BSD-style license that can be
5# found in the LICENSE file.
6
7"""Merges dependency Android manifests into a root manifest."""
8
9import argparse
Andrew Grieve282403e2023-02-06 18:44:5210import collections
Ingemar Ådahl6ada47b2017-07-10 17:14:0111import contextlib
12import os
13import sys
14import tempfile
Ingemar Ådahl6ada47b2017-07-10 17:14:0115
16from util import build_utils
Tibor Goldschwendt228bd4c2019-06-17 20:32:0217from util import manifest_utils
Andrew Grieve0cdf15d2023-03-31 02:25:5718import action_helpers # build_utils adds //build to sys.path.
Ingemar Ådahl6ada47b2017-07-10 17:14:0119
Eric Stevenson80458272019-02-04 20:57:5820_MANIFEST_MERGER_MAIN_CLASS = 'com.android.manifmerger.Merger'
Ingemar Ådahl6ada47b2017-07-10 17:14:0121
Ingemar Ådahl6ada47b2017-07-10 17:14:0122
23@contextlib.contextmanager
Andrew Grieve8abcf5b2023-02-03 14:46:4624def _ProcessMainManifest(manifest_path, min_sdk_version, target_sdk_version,
25 max_sdk_version, manifest_package):
26 """Patches the main Android manifest"""
Tibor Goldschwendt228bd4c2019-06-17 20:32:0227 doc, manifest, _ = manifest_utils.ParseManifest(manifest_path)
Andrew Grieve8abcf5b2023-02-03 14:46:4628 manifest_utils.SetUsesSdk(manifest, target_sdk_version, min_sdk_version,
29 max_sdk_version)
Tibor Goldschwendtfda15942019-06-24 21:57:4730 assert manifest_utils.GetPackage(manifest) or manifest_package, \
31 'Must set manifest package in GN or in AndroidManifest.xml'
Tibor Goldschwendtfda15942019-06-24 21:57:4732 if manifest_package:
33 manifest.set('package', manifest_package)
Andrew Grieveff1bc2e2022-06-13 15:01:1934 tmp_prefix = manifest_path.replace(os.path.sep, '-')
Ingemar Ådahl6ada47b2017-07-10 17:14:0135 with tempfile.NamedTemporaryFile(prefix=tmp_prefix) as patched_manifest:
Tibor Goldschwendt228bd4c2019-06-17 20:32:0236 manifest_utils.SaveManifest(doc, patched_manifest.name)
Tibor Goldschwendtfda15942019-06-24 21:57:4737 yield patched_manifest.name, manifest_utils.GetPackage(manifest)
Ingemar Ådahl6ada47b2017-07-10 17:14:0138
39
Sam Maier9760d5b2022-04-22 21:04:0540@contextlib.contextmanager
Shu Yang3eb3ae62024-08-21 01:29:3541def _ProcessOtherManifest(manifest_path, min_sdk_version, target_sdk_version,
Andrew Grieve282403e2023-02-06 18:44:5242 seen_package_names):
43 """Patches non-main AndroidManifest.xml if necessary."""
44 # 1. Ensure targetSdkVersion is set to the expected value to avoid
45 # spurious permissions being added (b/222331337).
46 # 2. Ensure all manifests have a unique package name so that the merger
47 # does not fail when this happens.
Sam Maier9760d5b2022-04-22 21:04:0548 doc, manifest, _ = manifest_utils.ParseManifest(manifest_path)
Andrew Grieve282403e2023-02-06 18:44:5249
50 changed_api = manifest_utils.SetTargetApiIfUnset(manifest, target_sdk_version)
51
52 package_name = manifest_utils.GetPackage(manifest)
Shu Yang3eb3ae62024-08-21 01:29:3553 # Ignore minSdkVersion from androidx.pdf library. The client code will ensure
54 # not to call into the library API on older Android versions.
Mohamed Heikal19cd45a2024-11-13 16:49:1255 if package_name.startswith('androidx.pdf'):
Shu Yang3eb3ae62024-08-21 01:29:3556 manifest_utils.OverrideMinSdkVersionIfPresent(manifest, min_sdk_version)
57 changed_api = True
Andrew Grieve282403e2023-02-06 18:44:5258 package_count = seen_package_names[package_name]
59 seen_package_names[package_name] += 1
60 if package_count > 0:
61 manifest.set('package', f'{package_name}_{package_count}')
62
63 if package_count > 0 or changed_api:
Andrew Grieve8abcf5b2023-02-03 14:46:4664 tmp_prefix = manifest_path.replace(os.path.sep, '-')
65 with tempfile.NamedTemporaryFile(prefix=tmp_prefix) as patched_manifest:
66 manifest_utils.SaveManifest(doc, patched_manifest.name)
67 yield patched_manifest.name
68 else:
69 yield manifest_path
Sam Maier9760d5b2022-04-22 21:04:0570
71
Ingemar Ådahl6ada47b2017-07-10 17:14:0172def main(argv):
73 argv = build_utils.ExpandFileArgs(argv)
74 parser = argparse.ArgumentParser(description=__doc__)
Andrew Grieve0cdf15d2023-03-31 02:25:5775 action_helpers.add_depfile_arg(parser)
Peter Wenae5986f2022-07-04 15:40:5176 parser.add_argument('--manifest-merger-jar',
77 help='Path to SDK\'s manifest merger jar.',
78 required=True)
Ingemar Ådahl6ada47b2017-07-10 17:14:0179 parser.add_argument('--root-manifest',
80 help='Root manifest which to merge into',
81 required=True)
82 parser.add_argument('--output', help='Output manifest path', required=True)
83 parser.add_argument('--extras',
84 help='GN list of additional manifest to merge')
Tibor Goldschwendt228bd4c2019-06-17 20:32:0285 parser.add_argument(
86 '--min-sdk-version',
87 required=True,
88 help='android:minSdkVersion for merging.')
89 parser.add_argument(
90 '--target-sdk-version',
91 required=True,
92 help='android:targetSdkVersion for merging.')
Tibor Goldschwendtfda15942019-06-24 21:57:4793 parser.add_argument(
Tibor Goldschwendt17604402019-07-11 14:44:1094 '--max-sdk-version', help='android:maxSdkVersion for merging.')
95 parser.add_argument(
Tibor Goldschwendtfda15942019-06-24 21:57:4796 '--manifest-package',
97 help='Package name of the merged AndroidManifest.xml.')
Andrew Grievee9cae1e2020-08-21 18:34:1698 parser.add_argument('--warnings-as-errors',
99 action='store_true',
100 help='Treat all warnings as errors.')
Ingemar Ådahl6ada47b2017-07-10 17:14:01101 args = parser.parse_args(argv)
102
Andrew Grieve0cdf15d2023-03-31 02:25:57103 with action_helpers.atomic_output(args.output) as output:
Sam Maier299c8912023-01-25 18:25:01104 cmd = build_utils.JavaCmd() + [
Eric Stevenson80458272019-02-04 20:57:58105 '-cp',
Peter Wenae5986f2022-07-04 15:40:51106 args.manifest_merger_jar,
Eric Stevenson80458272019-02-04 20:57:58107 _MANIFEST_MERGER_MAIN_CLASS,
108 '--out',
109 output.name,
Tibor Goldschwendt17604402019-07-11 14:44:10110 '--property',
111 'MIN_SDK_VERSION=' + args.min_sdk_version,
112 '--property',
113 'TARGET_SDK_VERSION=' + args.target_sdk_version,
Takuto Ikuta61fee732018-07-06 05:44:45114 ]
Ingemar Ådahl6ada47b2017-07-10 17:14:01115
Tibor Goldschwendt17604402019-07-11 14:44:10116 if args.max_sdk_version:
117 cmd += [
118 '--property',
119 'MAX_SDK_VERSION=' + args.max_sdk_version,
120 ]
121
Andrew Grieve0cdf15d2023-03-31 02:25:57122 extras = action_helpers.parse_gn_list(args.extras)
Takuto Ikuta61fee732018-07-06 05:44:45123
Sam Maier9760d5b2022-04-22 21:04:05124 with contextlib.ExitStack() as stack:
125 root_manifest, package = stack.enter_context(
Andrew Grieve8abcf5b2023-02-03 14:46:46126 _ProcessMainManifest(args.root_manifest, args.min_sdk_version,
127 args.target_sdk_version, args.max_sdk_version,
128 args.manifest_package))
Sam Maier9760d5b2022-04-22 21:04:05129 if extras:
Andrew Grieve282403e2023-02-06 18:44:52130 seen_package_names = collections.Counter()
Sam Maier9760d5b2022-04-22 21:04:05131 extras_processed = [
Andrew Grieve8abcf5b2023-02-03 14:46:46132 stack.enter_context(
Shu Yang3eb3ae62024-08-21 01:29:35133 _ProcessOtherManifest(e, args.min_sdk_version,
134 args.target_sdk_version,
Andrew Grieve282403e2023-02-06 18:44:52135 seen_package_names)) for e in extras
Sam Maier9760d5b2022-04-22 21:04:05136 ]
137 cmd += ['--libs', ':'.join(extras_processed)]
Tibor Goldschwendt228bd4c2019-06-17 20:32:02138 cmd += [
139 '--main',
140 root_manifest,
141 '--property',
142 'PACKAGE=' + package,
Mohamed Heikal9ec8d822021-05-11 19:18:20143 '--remove-tools-declarations',
Tibor Goldschwendt228bd4c2019-06-17 20:32:02144 ]
Andrew Grievee9cae1e2020-08-21 18:34:16145 build_utils.CheckOutput(
146 cmd,
147 # https://issuetracker.google.com/issues/63514300:
148 # The merger doesn't set a nonzero exit code for failures.
149 fail_func=lambda returncode, stderr: returncode != 0 or build_utils.
150 IsTimeStale(output.name, [root_manifest] + extras),
151 fail_on_output=args.warnings_as_errors)
Eric Stevenson59bf3c62019-01-23 23:30:49152
Andrew Grieve9ce44b92017-07-25 02:43:05153 if args.depfile:
Andrew Grieve0cdf15d2023-03-31 02:25:57154 action_helpers.write_depfile(args.depfile, args.output, inputs=extras)
Ingemar Ådahl6ada47b2017-07-10 17:14:01155
156
157if __name__ == '__main__':
158 main(sys.argv[1:])