summaryrefslogtreecommitdiff
path: root/scripts/manifest_check.py
diff options
context:
space:
mode:
author Ulya Trofimovich <skvadrik@google.com> 2022-06-13 09:04:49 +0000
committer Ulya Trofimovich <skvadrik@google.com> 2022-06-13 09:06:44 +0000
commitc68b289125dd187ebeb7a158c13c6e805bb8b3bd (patch)
tree544fd78c34bf5119e468668f3236a343e208621d /scripts/manifest_check.py
parent24abbe85d1f2aae1d7fc9b42c35f9bb28c0a1bb2 (diff)
Revert "manifest_check.py: add uses-libraries propagaged via dex..."
Reason for revert: performance regression on AppStartup. Reverted Changes: I6522319a8:Dexpreopt: prepare to merge class loader context f... Ic8528dffd:manifest_check.py: add uses-libraries propagaged v... Bug: 235304939 Bug: 214255490 Change-Id: I054df19dbddb4897d07d74e51d7b651dfae85fbe
Diffstat (limited to 'scripts/manifest_check.py')
-rwxr-xr-xscripts/manifest_check.py66
1 files changed, 16 insertions, 50 deletions
diff --git a/scripts/manifest_check.py b/scripts/manifest_check.py
index 0216fc0fe..c8d4f76c8 100755
--- a/scripts/manifest_check.py
+++ b/scripts/manifest_check.py
@@ -20,11 +20,9 @@ from __future__ import print_function
import argparse
import json
-import os
import re
import subprocess
import sys
-from collections import OrderedDict
from xml.dom import minidom
from manifest import android_ns
@@ -45,13 +43,11 @@ def parse_args():
'--uses-library',
dest='uses_libraries',
action='append',
- default=[],
help='specify uses-library entries known to the build system')
parser.add_argument(
'--optional-uses-library',
dest='optional_uses_libraries',
action='append',
- default=[],
help='specify uses-library entries known to the build system with '
'required:false'
)
@@ -78,14 +74,9 @@ def parse_args():
help='print the targetSdkVersion from the manifest')
parser.add_argument(
'--dexpreopt-config',
- dest='dexpreopt_config',
- help='a path to dexpreopt.config file for this library/app')
- parser.add_argument(
- '--dexpreopt-dep-config',
- dest='dexpreopt_dep_configs',
+ dest='dexpreopt_configs',
action='append',
- default=[],
- help='a path to dexpreopt.config file for a dependency library')
+ help='a paths to a dexpreopt.config of some library')
parser.add_argument('--aapt', dest='aapt', help='path to aapt executable')
parser.add_argument(
'--output', '-o', dest='output', help='output AndroidManifest.xml file')
@@ -304,53 +295,25 @@ def extract_target_sdk_version_xml(xml):
return target_attr.value
-def remove_duplicates(l):
- return list(OrderedDict.fromkeys(l))
-
-
-def load_dexpreopt_configs(args):
+def load_dexpreopt_configs(configs):
"""Load dexpreopt.config files and map module names to library names."""
module_to_libname = {}
- # Go over dexpreopt.config files for uses-library dependencies and create
- # a mapping from module name to real library name (they may differ).
- for config in args.dexpreopt_dep_configs:
- # Empty dexpreopt.config files are expected for some dependencies.
- if os.stat(config).st_size != 0:
- with open(config, 'r') as f:
- contents = json.load(f)
- module_to_libname[contents['Name']] = contents['ProvidesUsesLibrary']
-
- required = translate_libnames(args.uses_libraries, module_to_libname)
- optional = translate_libnames(args.optional_uses_libraries, module_to_libname)
-
- # Add extra uses-libraries from the library/app's own dexpreopt.config.
- # Extra libraries may be propagated via dependencies' dexpreopt.config files
- # (not only uses-library ones, but also transitively via static libraries).
- if args.dexpreopt_config:
- with open(args.dexpreopt_config, 'r') as f:
- contents = json.load(f)
- for clc in contents['ClassLoaderContexts']['any']:
- ulib = clc['Name']
- if clc['Optional']:
- optional.append(ulib)
- else:
- required.append(ulib)
-
- required = remove_duplicates(required)
- optional = remove_duplicates(optional)
+ if configs is None:
+ configs = []
- # If the same library is both in optional and required, prefer required.
- # This may happen for compatibility libraries, e.g. org.apache.http.legacy.
- for lib in required:
- if lib in optional:
- optional.remove(lib)
+ for config in configs:
+ with open(config, 'r') as f:
+ contents = json.load(f)
+ module_to_libname[contents['Name']] = contents['ProvidesUsesLibrary']
- return required, optional
+ return module_to_libname
def translate_libnames(modules, module_to_libname):
"""Translate module names into library names using the mapping."""
+ if modules is None:
+ modules = []
libnames = []
for name in modules:
@@ -383,7 +346,10 @@ def main():
# `optional_uses_libs`, `LOCAL_USES_LIBRARIES`,
# `LOCAL_OPTIONAL_LIBRARY_NAMES` all contain module names), while
# the manifest addresses libraries by their name.
- required, optional = load_dexpreopt_configs(args)
+ mod_to_lib = load_dexpreopt_configs(args.dexpreopt_configs)
+ required = translate_libnames(args.uses_libraries, mod_to_lib)
+ optional = translate_libnames(args.optional_uses_libraries,
+ mod_to_lib)
# Check if the <uses-library> lists in the build system agree with
# those in the manifest. Raise an exception on mismatch, unless the