diff options
Diffstat (limited to 'chromium/components/module_installer/android')
5 files changed, 73 insertions, 53 deletions
diff --git a/chromium/components/module_installer/android/BUILD.gn b/chromium/components/module_installer/android/BUILD.gn index d072a62d10e..00d7d2a8194 100644 --- a/chromium/components/module_installer/android/BUILD.gn +++ b/chromium/components/module_installer/android/BUILD.gn @@ -59,6 +59,8 @@ junit_binary("module_installer_junit_tests") { "//base:base_java", "//base:base_java_test_support", "//base:base_junit_test_support", + "//third_party/google_android_play_core:com_google_android_play_core_java", + "//third_party/hamcrest:hamcrest_java", ] } diff --git a/chromium/components/module_installer/android/java/src/org/chromium/components/module_installer/engine/FakeEngine.java b/chromium/components/module_installer/android/java/src/org/chromium/components/module_installer/engine/FakeEngine.java index 52c3dae21b8..c129ce772c0 100644 --- a/chromium/components/module_installer/android/java/src/org/chromium/components/module_installer/engine/FakeEngine.java +++ b/chromium/components/module_installer/android/java/src/org/chromium/components/module_installer/engine/FakeEngine.java @@ -36,8 +36,8 @@ class FakeEngine extends SplitCompatEngine { } /** - * Copies {MODULES_SRC_DIRECTORY_PATH}/|moduleName|.apk to the folder where SplitCompat expects - * downloaded modules to be. Then calls SplitCompat to emulate the module. + * Copies {MODULES_SRC_DIRECTORY_PATH}/|package name|/|moduleName|.apk to the folder where + * SplitCompat expects downloaded modules to be. Then calls SplitCompat to emulate the module. * * We copy the module so that this works on non-rooted devices. The path SplitCompat expects * module to be is not accessible without rooting. @@ -65,10 +65,15 @@ class FakeEngine extends SplitCompatEngine { // Get list of all files at path where SplitCompat looks for downloaded modules. // May change in future releases of the Play Core SDK. - File srcModuleDir = new File(MODULES_SRC_DIRECTORY_PATH); + File srcModuleDir = new File(MODULES_SRC_DIRECTORY_PATH, context.getPackageName()); if (!srcModuleDir.exists()) { - Log.e(TAG, "Modules source directory does not exist"); - return false; + // As fallback, check the parent directory (this is the old behavior). + // TODO(huangs): Delete this fallback once catapult/.../device_utils.py is updated. + srcModuleDir = new File(MODULES_SRC_DIRECTORY_PATH); + if (!srcModuleDir.exists()) { + Log.e(TAG, "Modules source directory does not exist"); + return false; + } } if (!srcModuleDir.canRead()) { Log.e(TAG, "Cannot read modules source directory"); diff --git a/chromium/components/module_installer/android/java/src/org/chromium/components/module_installer/logger/SplitAvailabilityLogger.java b/chromium/components/module_installer/android/java/src/org/chromium/components/module_installer/logger/SplitAvailabilityLogger.java index a6274fe5e85..d0b2cf84a81 100644 --- a/chromium/components/module_installer/android/java/src/org/chromium/components/module_installer/logger/SplitAvailabilityLogger.java +++ b/chromium/components/module_installer/android/java/src/org/chromium/components/module_installer/logger/SplitAvailabilityLogger.java @@ -96,7 +96,7 @@ public class SplitAvailabilityLogger { * @param moduleName The module name. */ public void storeRequestStart(String moduleName) { - assert !mInstallTimesMap.containsKey(moduleName); + // Ignore previously failed requests (orphan keys). boolean moduleRequested = storeModuleRequested(moduleName, ONDEMAND_REQ_PREV); mInstallTimesMap.put(moduleName, new InstallTimes(moduleRequested)); } diff --git a/chromium/components/module_installer/android/module_desc_java.gni b/chromium/components/module_installer/android/module_desc_java.gni index 4aba28b6516..edf39d98653 100644 --- a/chromium/components/module_installer/android/module_desc_java.gni +++ b/chromium/components/module_installer/android/module_desc_java.gni @@ -23,32 +23,36 @@ import("//build/config/python.gni") template("module_desc_java") { _target_name = target_name - _libraries = "${target_gen_dir}/${_target_name}.libraries" - _rebased_libraries = rebase_path(_libraries, root_out_dir) + _libraries_file = "${target_gen_dir}/${_target_name}.libraries" generated_file("${_target_name}__libraries") { if (defined(invoker.shared_libraries)) { deps = invoker.shared_libraries } - outputs = [ _libraries ] + outputs = [ _libraries_file ] data_keys = [ "shared_libraries" ] walk_keys = [ "shared_libraries_barrier" ] rebase = root_build_dir - output_conversion = "json" + output_conversion = "value" } _srcjar = "$target_gen_dir/${_target_name}__srcjar.srcjar" action_with_pydeps("${_target_name}__srcjar") { script = "//components/module_installer/android/module_desc_java.py" - deps = [ ":${_target_name}__libraries" ] - inputs = [ _libraries ] outputs = [ _srcjar ] + + # Do not add a dep on the generated_file target in order to avoid having + # to build the native libraries before this target. The dependency is + # instead captured via a depfile. + depfile = "$target_gen_dir/$target_name.d" args = [ "--module", invoker.module_name, - "--libraries", - "@FileArg($_rebased_libraries)", + "--libraries-file", + rebase_path(_libraries_file, root_out_dir), "--output", rebase_path(_srcjar, root_out_dir), + "--depfile", + rebase_path(depfile, root_out_dir), ] if (defined(invoker.load_native_on_get_impl) && diff --git a/chromium/components/module_installer/android/module_desc_java.py b/chromium/components/module_installer/android/module_desc_java.py index 36b0b2f762c..6c74bb4e0bb 100755 --- a/chromium/components/module_installer/android/module_desc_java.py +++ b/chromium/components/module_installer/android/module_desc_java.py @@ -48,45 +48,54 @@ public class ModuleDescriptor_{MODULE} implements ModuleDescriptor {{ def main(): - parser = argparse.ArgumentParser() - parser.add_argument('--module', required=True, help='The module name.') - parser.add_argument( - '--libraries', required=True, help='GN list of native library paths.') - parser.add_argument('--paks', help='GN list of PAK file paths') - parser.add_argument( - '--output', required=True, help='Path to the generated srcjar file.') - parser.add_argument('--load-native-on-get-impl', action='store_true', - default=False, - help='Load module automatically on calling Module.getImpl().') - options = parser.parse_args(build_utils.ExpandFileArgs(sys.argv[1:])) - options.libraries = build_utils.ParseGnList(options.libraries) - options.paks = build_utils.ParseGnList(options.paks) - - libraries = [] - for path in options.libraries: - path = path.strip() - filename = os.path.split(path)[1] - assert filename.startswith('lib') - assert filename.endswith('.so') - # Remove lib prefix and .so suffix. - libraries += [filename[3:-3]] - paks = options.paks if options.paks else [] - - format_dict = { - 'MODULE': options.module, - 'LIBRARIES': ','.join(['"%s"' % l for l in libraries]), - 'PAKS': ','.join(['"%s"' % os.path.basename(p) for p in paks]), - 'LOAD_NATIVE_ON_GET_IMPL': ( - 'true' if options.load_native_on_get_impl else 'false'), - } - with build_utils.AtomicOutput(options.output) as f: - with zipfile.ZipFile(f.name, 'w') as srcjar_file: - build_utils.AddToZipHermetic( - srcjar_file, - 'org/chromium/components/module_installer/builder/' - 'ModuleDescriptor_%s.java' % options.module, - data=_TEMPLATE.format(**format_dict)) + parser = argparse.ArgumentParser() + build_utils.AddDepfileOption(parser) + parser.add_argument('--module', required=True, help='The module name.') + parser.add_argument('--libraries-file', + required=True, + help='Path to file with GN list of library paths') + parser.add_argument('--paks', help='GN list of PAK file paths') + parser.add_argument( + '--output', required=True, help='Path to the generated srcjar file.') + parser.add_argument('--load-native-on-get-impl', action='store_true', + default=False, + help='Load module automatically on calling Module.getImpl().') + options = parser.parse_args() + options.paks = build_utils.ParseGnList(options.paks) + + with open(options.libraries_file) as f: + libraries_list = build_utils.ParseGnList(f.read()) + + libraries = [] + for path in libraries_list: + path = path.strip() + filename = os.path.split(path)[1] + assert filename.startswith('lib') + assert filename.endswith('.so') + # Remove lib prefix and .so suffix. + libraries += [filename[3:-3]] + paks = options.paks if options.paks else [] + + format_dict = { + 'MODULE': options.module, + 'LIBRARIES': ','.join(['"%s"' % l for l in libraries]), + 'PAKS': ','.join(['"%s"' % os.path.basename(p) for p in paks]), + 'LOAD_NATIVE_ON_GET_IMPL': ( + 'true' if options.load_native_on_get_impl else 'false'), + } + with build_utils.AtomicOutput(options.output) as f: + with zipfile.ZipFile(f.name, 'w') as srcjar_file: + build_utils.AddToZipHermetic( + srcjar_file, + 'org/chromium/components/module_installer/builder/' + 'ModuleDescriptor_%s.java' % options.module, + data=_TEMPLATE.format(**format_dict)) + + if options.depfile: + build_utils.WriteDepfile(options.depfile, + options.output, + inputs=[options.libraries_file]) if __name__ == '__main__': - sys.exit(main()) + sys.exit(main()) |