Andrew Grieve | 7dd4aaf | 2021-04-27 21:47:08 | [diff] [blame] | 1 | #!/usr/bin/env python3 |
Ingemar Ådahl | 6ada47b | 2017-07-10 17:14:01 | [diff] [blame] | 2 | |
Avi Drissman | 7519809 | 2022-09-08 20:33:38 | [diff] [blame] | 3 | # Copyright 2017 The Chromium Authors |
Ingemar Ådahl | 6ada47b | 2017-07-10 17:14:01 | [diff] [blame] | 4 | # 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 | |
| 9 | import argparse |
Andrew Grieve | 282403e | 2023-02-06 18:44:52 | [diff] [blame] | 10 | import collections |
Ingemar Ådahl | 6ada47b | 2017-07-10 17:14:01 | [diff] [blame] | 11 | import contextlib |
| 12 | import os |
| 13 | import sys |
| 14 | import tempfile |
Ingemar Ådahl | 6ada47b | 2017-07-10 17:14:01 | [diff] [blame] | 15 | |
| 16 | from util import build_utils |
Tibor Goldschwendt | 228bd4c | 2019-06-17 20:32:02 | [diff] [blame] | 17 | from util import manifest_utils |
Andrew Grieve | 0cdf15d | 2023-03-31 02:25:57 | [diff] [blame] | 18 | import action_helpers # build_utils adds //build to sys.path. |
Ingemar Ådahl | 6ada47b | 2017-07-10 17:14:01 | [diff] [blame] | 19 | |
Eric Stevenson | 8045827 | 2019-02-04 20:57:58 | [diff] [blame] | 20 | _MANIFEST_MERGER_MAIN_CLASS = 'com.android.manifmerger.Merger' |
Ingemar Ådahl | 6ada47b | 2017-07-10 17:14:01 | [diff] [blame] | 21 | |
Ingemar Ådahl | 6ada47b | 2017-07-10 17:14:01 | [diff] [blame] | 22 | |
| 23 | @contextlib.contextmanager |
Andrew Grieve | 8abcf5b | 2023-02-03 14:46:46 | [diff] [blame] | 24 | def _ProcessMainManifest(manifest_path, min_sdk_version, target_sdk_version, |
| 25 | max_sdk_version, manifest_package): |
| 26 | """Patches the main Android manifest""" |
Tibor Goldschwendt | 228bd4c | 2019-06-17 20:32:02 | [diff] [blame] | 27 | doc, manifest, _ = manifest_utils.ParseManifest(manifest_path) |
Andrew Grieve | 8abcf5b | 2023-02-03 14:46:46 | [diff] [blame] | 28 | manifest_utils.SetUsesSdk(manifest, target_sdk_version, min_sdk_version, |
| 29 | max_sdk_version) |
Tibor Goldschwendt | fda1594 | 2019-06-24 21:57:47 | [diff] [blame] | 30 | assert manifest_utils.GetPackage(manifest) or manifest_package, \ |
| 31 | 'Must set manifest package in GN or in AndroidManifest.xml' |
Tibor Goldschwendt | fda1594 | 2019-06-24 21:57:47 | [diff] [blame] | 32 | if manifest_package: |
| 33 | manifest.set('package', manifest_package) |
Andrew Grieve | ff1bc2e | 2022-06-13 15:01:19 | [diff] [blame] | 34 | tmp_prefix = manifest_path.replace(os.path.sep, '-') |
Ingemar Ådahl | 6ada47b | 2017-07-10 17:14:01 | [diff] [blame] | 35 | with tempfile.NamedTemporaryFile(prefix=tmp_prefix) as patched_manifest: |
Tibor Goldschwendt | 228bd4c | 2019-06-17 20:32:02 | [diff] [blame] | 36 | manifest_utils.SaveManifest(doc, patched_manifest.name) |
Tibor Goldschwendt | fda1594 | 2019-06-24 21:57:47 | [diff] [blame] | 37 | yield patched_manifest.name, manifest_utils.GetPackage(manifest) |
Ingemar Ådahl | 6ada47b | 2017-07-10 17:14:01 | [diff] [blame] | 38 | |
| 39 | |
Sam Maier | 9760d5b | 2022-04-22 21:04:05 | [diff] [blame] | 40 | @contextlib.contextmanager |
Shu Yang | 3eb3ae6 | 2024-08-21 01:29:35 | [diff] [blame] | 41 | def _ProcessOtherManifest(manifest_path, min_sdk_version, target_sdk_version, |
Andrew Grieve | 282403e | 2023-02-06 18:44:52 | [diff] [blame] | 42 | 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 Maier | 9760d5b | 2022-04-22 21:04:05 | [diff] [blame] | 48 | doc, manifest, _ = manifest_utils.ParseManifest(manifest_path) |
Andrew Grieve | 282403e | 2023-02-06 18:44:52 | [diff] [blame] | 49 | |
| 50 | changed_api = manifest_utils.SetTargetApiIfUnset(manifest, target_sdk_version) |
| 51 | |
| 52 | package_name = manifest_utils.GetPackage(manifest) |
Shu Yang | 3eb3ae6 | 2024-08-21 01:29:35 | [diff] [blame] | 53 | # Ignore minSdkVersion from androidx.pdf library. The client code will ensure |
| 54 | # not to call into the library API on older Android versions. |
Mohamed Heikal | 19cd45a | 2024-11-13 16:49:12 | [diff] [blame] | 55 | if package_name.startswith('androidx.pdf'): |
Shu Yang | 3eb3ae6 | 2024-08-21 01:29:35 | [diff] [blame] | 56 | manifest_utils.OverrideMinSdkVersionIfPresent(manifest, min_sdk_version) |
| 57 | changed_api = True |
Andrew Grieve | 282403e | 2023-02-06 18:44:52 | [diff] [blame] | 58 | 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 Grieve | 8abcf5b | 2023-02-03 14:46:46 | [diff] [blame] | 64 | 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 Maier | 9760d5b | 2022-04-22 21:04:05 | [diff] [blame] | 70 | |
| 71 | |
Ingemar Ådahl | 6ada47b | 2017-07-10 17:14:01 | [diff] [blame] | 72 | def main(argv): |
| 73 | argv = build_utils.ExpandFileArgs(argv) |
| 74 | parser = argparse.ArgumentParser(description=__doc__) |
Andrew Grieve | 0cdf15d | 2023-03-31 02:25:57 | [diff] [blame] | 75 | action_helpers.add_depfile_arg(parser) |
Peter Wen | ae5986f | 2022-07-04 15:40:51 | [diff] [blame] | 76 | parser.add_argument('--manifest-merger-jar', |
| 77 | help='Path to SDK\'s manifest merger jar.', |
| 78 | required=True) |
Ingemar Ådahl | 6ada47b | 2017-07-10 17:14:01 | [diff] [blame] | 79 | 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 Goldschwendt | 228bd4c | 2019-06-17 20:32:02 | [diff] [blame] | 85 | 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 Goldschwendt | fda1594 | 2019-06-24 21:57:47 | [diff] [blame] | 93 | parser.add_argument( |
Tibor Goldschwendt | 1760440 | 2019-07-11 14:44:10 | [diff] [blame] | 94 | '--max-sdk-version', help='android:maxSdkVersion for merging.') |
| 95 | parser.add_argument( |
Tibor Goldschwendt | fda1594 | 2019-06-24 21:57:47 | [diff] [blame] | 96 | '--manifest-package', |
| 97 | help='Package name of the merged AndroidManifest.xml.') |
Andrew Grieve | e9cae1e | 2020-08-21 18:34:16 | [diff] [blame] | 98 | parser.add_argument('--warnings-as-errors', |
| 99 | action='store_true', |
| 100 | help='Treat all warnings as errors.') |
Ingemar Ådahl | 6ada47b | 2017-07-10 17:14:01 | [diff] [blame] | 101 | args = parser.parse_args(argv) |
| 102 | |
Andrew Grieve | 0cdf15d | 2023-03-31 02:25:57 | [diff] [blame] | 103 | with action_helpers.atomic_output(args.output) as output: |
Sam Maier | 299c891 | 2023-01-25 18:25:01 | [diff] [blame] | 104 | cmd = build_utils.JavaCmd() + [ |
Eric Stevenson | 8045827 | 2019-02-04 20:57:58 | [diff] [blame] | 105 | '-cp', |
Peter Wen | ae5986f | 2022-07-04 15:40:51 | [diff] [blame] | 106 | args.manifest_merger_jar, |
Eric Stevenson | 8045827 | 2019-02-04 20:57:58 | [diff] [blame] | 107 | _MANIFEST_MERGER_MAIN_CLASS, |
| 108 | '--out', |
| 109 | output.name, |
Tibor Goldschwendt | 1760440 | 2019-07-11 14:44:10 | [diff] [blame] | 110 | '--property', |
| 111 | 'MIN_SDK_VERSION=' + args.min_sdk_version, |
| 112 | '--property', |
| 113 | 'TARGET_SDK_VERSION=' + args.target_sdk_version, |
Takuto Ikuta | 61fee73 | 2018-07-06 05:44:45 | [diff] [blame] | 114 | ] |
Ingemar Ådahl | 6ada47b | 2017-07-10 17:14:01 | [diff] [blame] | 115 | |
Tibor Goldschwendt | 1760440 | 2019-07-11 14:44:10 | [diff] [blame] | 116 | if args.max_sdk_version: |
| 117 | cmd += [ |
| 118 | '--property', |
| 119 | 'MAX_SDK_VERSION=' + args.max_sdk_version, |
| 120 | ] |
| 121 | |
Andrew Grieve | 0cdf15d | 2023-03-31 02:25:57 | [diff] [blame] | 122 | extras = action_helpers.parse_gn_list(args.extras) |
Takuto Ikuta | 61fee73 | 2018-07-06 05:44:45 | [diff] [blame] | 123 | |
Sam Maier | 9760d5b | 2022-04-22 21:04:05 | [diff] [blame] | 124 | with contextlib.ExitStack() as stack: |
| 125 | root_manifest, package = stack.enter_context( |
Andrew Grieve | 8abcf5b | 2023-02-03 14:46:46 | [diff] [blame] | 126 | _ProcessMainManifest(args.root_manifest, args.min_sdk_version, |
| 127 | args.target_sdk_version, args.max_sdk_version, |
| 128 | args.manifest_package)) |
Sam Maier | 9760d5b | 2022-04-22 21:04:05 | [diff] [blame] | 129 | if extras: |
Andrew Grieve | 282403e | 2023-02-06 18:44:52 | [diff] [blame] | 130 | seen_package_names = collections.Counter() |
Sam Maier | 9760d5b | 2022-04-22 21:04:05 | [diff] [blame] | 131 | extras_processed = [ |
Andrew Grieve | 8abcf5b | 2023-02-03 14:46:46 | [diff] [blame] | 132 | stack.enter_context( |
Shu Yang | 3eb3ae6 | 2024-08-21 01:29:35 | [diff] [blame] | 133 | _ProcessOtherManifest(e, args.min_sdk_version, |
| 134 | args.target_sdk_version, |
Andrew Grieve | 282403e | 2023-02-06 18:44:52 | [diff] [blame] | 135 | seen_package_names)) for e in extras |
Sam Maier | 9760d5b | 2022-04-22 21:04:05 | [diff] [blame] | 136 | ] |
| 137 | cmd += ['--libs', ':'.join(extras_processed)] |
Tibor Goldschwendt | 228bd4c | 2019-06-17 20:32:02 | [diff] [blame] | 138 | cmd += [ |
| 139 | '--main', |
| 140 | root_manifest, |
| 141 | '--property', |
| 142 | 'PACKAGE=' + package, |
Mohamed Heikal | 9ec8d82 | 2021-05-11 19:18:20 | [diff] [blame] | 143 | '--remove-tools-declarations', |
Tibor Goldschwendt | 228bd4c | 2019-06-17 20:32:02 | [diff] [blame] | 144 | ] |
Andrew Grieve | e9cae1e | 2020-08-21 18:34:16 | [diff] [blame] | 145 | 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 Stevenson | 59bf3c6 | 2019-01-23 23:30:49 | [diff] [blame] | 152 | |
Andrew Grieve | 9ce44b9 | 2017-07-25 02:43:05 | [diff] [blame] | 153 | if args.depfile: |
Andrew Grieve | 0cdf15d | 2023-03-31 02:25:57 | [diff] [blame] | 154 | action_helpers.write_depfile(args.depfile, args.output, inputs=extras) |
Ingemar Ådahl | 6ada47b | 2017-07-10 17:14:01 | [diff] [blame] | 155 | |
| 156 | |
| 157 | if __name__ == '__main__': |
| 158 | main(sys.argv[1:]) |