diff options
author | vasilii <vasilii@chromium.org> | 2016-01-15 02:18:45 -0800 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2016-01-15 10:19:30 +0000 |
commit | ac74e7a74cd2e700b1953f0542c09a72c672b1b1 (patch) | |
tree | fadc6afd337641f19b75cc5aff33ca5038c39ef6 /base | |
parent | f795671d8c34bc15ae30a005d38d0a4f5b9fae11 (diff) | |
download | chromium_src-ac74e7a74cd2e700b1953f0542c09a72c672b1b1.zip chromium_src-ac74e7a74cd2e700b1953f0542c09a72c672b1b1.tar.gz chromium_src-ac74e7a74cd2e700b1953f0542c09a72c672b1b1.tar.bz2 |
Revert of [Android] Rework multidex and enable multidex for unit_tests_apk. (patchset #7 id:120001 of https://codereview.chromium.org/1581563003/ )
Reason for revert:
Broke compilation on Android
https://build.chromium.org/p/chromium/builders/Android/builds/50665
FAILED: cd ../../components; python ../build/android/gyp/apk_obfuscate.py --configuration-name Release --android-sdk /b/build/slave/Android/build/src/third_party/android_tools/sdk//platforms/android-23 --android-sdk-tools /b/build/slave/Android/build/src/third_party/android_tools/sdk//build-tools/23.0.1 --android-sdk-jar /b/build/slave/Android/build/src/third_party/android_tools/sdk//platforms/android-23/android.jar "--input-jars-paths=/b/build/slave/Android/build/src/third_party/android_tools/sdk//extras/android/support/multidex/library/libs/android-support-multidex.jar \"../out/Release/lib.java/jsr_305_javalib.jar\" \"../out/Release/lib.java/base_java.jar\" /b/build/slave/Android/build/src/third_party/android_tools/sdk//extras/android/support/annotations/android-support-annotations.jar \"../out/Release/lib.java/cronet_api.jar\" \"../out/Release/lib.java/url_java.jar\" \"../out/Release/lib.java/net_java.jar\" \"../out/Release/lib.java/cronet_java.jar\" \"../out/Release/lib.java/chromium_apk_cronet_perf_test_apk.jar\"" "--proguard-configs=cronet/android/proguard.cfg \"../out/Release/cronet_perf_test_apk/proguard.txt\"" --test-jar-path ../out/Release/test.lib.java/CronetPerfTest.jar --obfuscated-jar-path ../out/Release/cronet_perf_test_apk/obfuscated.jar --proguard-jar-path ../third_party/proguard/lib/proguard.jar --stamp ../out/Release/cronet_perf_test_apk/obfuscate.stamp --testapp --proguard-enabled
Traceback (most recent call last):
File "../build/android/gyp/apk_obfuscate.py", line 185, in <module>
sys.exit(main(sys.argv[1:]))
File "../build/android/gyp/apk_obfuscate.py", line 167, in main
DoProguard(options)
File "../build/android/gyp/apk_obfuscate.py", line 124, in DoProguard
proguard.CheckOutput()
File "/b/build/slave/Android/build/src/build/android/gyp/util/proguard_util.py", line 180, in CheckOutput
stderr_filter=stderr_filter)
File "/b/build/slave/Android/build/src/build/android/gyp/util/build_utils.py", line 162, in CheckOutput
raise CalledProcessError(cwd, args, stdout + stderr)
util.build_utils.CalledProcessError: Command failed: ( cd /b/build/slave/Android/build/src/components; java -jar ../third_party/proguard/lib/proguard.jar -forceprocessing -libraryjars /b/build/slave/Android/build/src/third_party/android_tools/sdk//platforms/android-23/android.jar -injars /b/build/slave/Android/build/src/third_party/android_tools/sdk//extras/android/support/multidex/library/libs/android-support-multidex.jar:../out/Release/lib.java/jsr_305_javalib.jar:../out/Release/lib.java/base_java.jar:/b/build/slave/Android/build/src/third_party/android_tools/sdk//extras/android/support/annotations/android-support-annotations.jar:../out/Release/lib.java/cronet_api.jar:../out/Release/lib.java/url_java.jar:../out/Release/lib.java/net_java.jar:../out/Release/lib.java/cronet_java.jar:../out/Release/lib.java/chromium_apk_cronet_perf_test_apk.jar -include cronet/android/proguard.cfg -include ../out/Release/cronet_perf_test_apk/proguard.txt -outjars ../out/Release/cronet_perf_test_apk/obfuscated.jar -dump ../out/Release/cronet_perf_test_apk/obfuscated.jar.dump -printseeds ../out/Release/cronet_perf_test_apk/obfuscated.jar.seeds -printusage ../out/Release/cronet_perf_test_apk/obfuscated.jar.usage -printmapping ../out/Release/cronet_perf_test_apk/obfuscated.jar.mapping )
Warning: org.chromium.base.multidex.ChromiumMultiDexInstaller: can't find referenced class org.chromium.base.multidex.ChromiumMultiDex
Warning: org.chromium.base.multidex.ChromiumMultiDexInstaller: can't find referenced class org.chromium.base.multidex.ChromiumMultiDex
Warning: there were 2 unresolved references to classes or interfaces.
You may need to specify additional library jars (using '-libraryjars').
Error: Please correct the above warnings first.
Original issue's description:
> [Android] Rework multidex and enable multidex for unit_tests_apk.
>
> This allows multidex to be used in release builds.
>
> BUG=272790
>
> Committed: https://crrev.com/f743bef34d49987c0f1f69e2f0bb6cb8beb03bf5
> Cr-Commit-Position: refs/heads/master@{#369715}
TBR=phajdan.jr@chromium.org,agrieve@chromium.org,dpranke@chromium.org,thakis@chromium.org,yfriedman@chromium.org,jbudorick@chromium.org
# Skipping CQ checks because original CL landed less than 1 days ago.
NOPRESUBMIT=true
NOTREECHECKS=true
NOTRY=true
BUG=272790
Review URL: https://codereview.chromium.org/1587253003
Cr-Commit-Position: refs/heads/master@{#369717}
Diffstat (limited to 'base')
6 files changed, 116 insertions, 142 deletions
diff --git a/base/BUILD.gn b/base/BUILD.gn index 1265df8..5d8510f 100644 --- a/base/BUILD.gn +++ b/base/BUILD.gn @@ -2057,10 +2057,9 @@ if (is_android) { DEPRECATED_java_in_dir = "android/java/src" - # New versions of ChromiumMultiDex.java and NativeLibraries.java - # (with the actual correct values) will be created when creating an apk. + # A new version of NativeLibraries.java (with the actual correct values) + # will be created when creating an apk. jar_excluded_patterns = [ - "*/ChromiumMultiDex.class", "*/NativeLibraries.class", "*/NativeLibraries##*.class", ] @@ -2095,7 +2094,6 @@ if (is_android) { "//third_party/robolectric:android-all-4.3_r2-robolectric-0", "//third_party/robolectric:robolectric_java", ] - srcjar_deps = [ ":base_multidex_gen" ] } # GYP: //base.gyp:base_junit_tests @@ -2130,6 +2128,9 @@ if (is_android) { sources = [ "android/java/templates/ChromiumMultiDex.template", ] + if (is_debug) { + defines = [ "MULTIDEX_CONFIGURATION_Debug" ] + } package_name = "org/chromium/base/multidex" } diff --git a/base/android/java/src/org/chromium/base/BaseChromiumApplication.java b/base/android/java/src/org/chromium/base/BaseChromiumApplication.java index f842a18..e4e6e20 100644 --- a/base/android/java/src/org/chromium/base/BaseChromiumApplication.java +++ b/base/android/java/src/org/chromium/base/BaseChromiumApplication.java @@ -10,7 +10,7 @@ import android.content.Context; import android.os.Bundle; import android.view.Window; -import org.chromium.base.multidex.ChromiumMultiDexInstaller; +import org.chromium.base.multidex.ChromiumMultiDex; /** * Basic application functionality that should be shared among all browser applications. @@ -31,7 +31,7 @@ public class BaseChromiumApplication extends Application { @Override protected void attachBaseContext(Context base) { super.attachBaseContext(base); - ChromiumMultiDexInstaller.install(this); + ChromiumMultiDex.install(this); } /** diff --git a/base/android/java/src/org/chromium/base/multidex/ChromiumMultiDexInstaller.java b/base/android/java/src/org/chromium/base/multidex/ChromiumMultiDexInstaller.java deleted file mode 100644 index e4b30b9..0000000 --- a/base/android/java/src/org/chromium/base/multidex/ChromiumMultiDexInstaller.java +++ /dev/null @@ -1,114 +0,0 @@ -// Copyright 2015 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -package org.chromium.base.multidex; - -import android.app.ActivityManager; -import android.app.ActivityManager.RunningAppProcessInfo; -import android.content.Context; -import android.content.pm.ApplicationInfo; -import android.content.pm.PackageManager; -import android.os.Build; -import android.support.multidex.MultiDex; - -import org.chromium.base.Log; -import org.chromium.base.VisibleForTesting; - -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; - -/** - * Performs multidex installation for non-isolated processes. - */ -public class ChromiumMultiDexInstaller { - - private static final String TAG = "base_multidex"; - - /** - * Suffix for the meta-data tag in the AndroidManifext.xml that determines whether loading - * secondary dexes should be skipped for a given process name. - */ - private static final String IGNORE_MULTIDEX_KEY = ".ignore_multidex"; - - /** - * Installs secondary dexes if possible/necessary. - * - * Isolated processes (e.g. renderer processes) can't load secondary dex files on - * K and below, so we don't even try in that case. - * - * In release builds of app apks (as opposed to test apks), this is a no-op because: - * - multidex isn't necessary in release builds because we run proguard there and - * thus aren't threatening to hit the dex limit; and - * - calling MultiDex.install, even in the absence of secondary dexes, causes a - * significant regression in start-up time (crbug.com/525695). - * - * @param context The application context. - */ - @VisibleForTesting - public static void install(Context context) { - if (!ChromiumMultiDex.isMultidexEnabled()) return; - - // TODO(jbudorick): Back out this version check once support for K & below works. - // http://crbug.com/512357 - if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP - && !shouldInstallMultiDex(context)) { - Log.i(TAG, "Skipping multidex installation: not needed for process."); - } else { - MultiDex.install(context); - Log.i(TAG, "Completed multidex installation."); - } - } - - private static String getProcessName(Context context) { - try { - String currentProcessName = null; - int pid = android.os.Process.myPid(); - - ActivityManager manager = - (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE); - for (RunningAppProcessInfo processInfo : manager.getRunningAppProcesses()) { - if (processInfo.pid == pid) { - currentProcessName = processInfo.processName; - break; - } - } - - return currentProcessName; - } catch (SecurityException ex) { - return null; - } - } - - // Determines whether MultiDex should be installed for the current process. Isolated - // Processes should skip MultiDex as they can not actually access the files on disk. - // Privileged processes need ot have all of their dependencies in the MainDex for - // performance reasons. - private static boolean shouldInstallMultiDex(Context context) { - try { - Method isIsolatedMethod = - android.os.Process.class.getMethod("isIsolated"); - Object retVal = isIsolatedMethod.invoke(null); - if (retVal != null && retVal instanceof Boolean && ((Boolean) retVal)) { - return false; - } - } catch (IllegalAccessException | IllegalArgumentException - | InvocationTargetException | NoSuchMethodException e) { - // Ignore and fall back to checking the app processes. - } - - String currentProcessName = getProcessName(context); - if (currentProcessName == null) return true; - - PackageManager packageManager = context.getPackageManager(); - try { - ApplicationInfo appInfo = packageManager.getApplicationInfo(context.getPackageName(), - PackageManager.GET_META_DATA); - if (appInfo == null || appInfo.metaData == null) return true; - return !appInfo.metaData.getBoolean(currentProcessName + IGNORE_MULTIDEX_KEY, false); - } catch (PackageManager.NameNotFoundException e) { - return true; - } - } - -} diff --git a/base/android/java/templates/ChromiumMultiDex.template b/base/android/java/templates/ChromiumMultiDex.template index 7e70701..5580489 100644 --- a/base/android/java/templates/ChromiumMultiDex.template +++ b/base/android/java/templates/ChromiumMultiDex.template @@ -4,22 +4,115 @@ package org.chromium.base.multidex; +import android.app.ActivityManager; +import android.app.ActivityManager.RunningAppProcessInfo; +import android.content.Context; +import android.content.pm.ApplicationInfo; +import android.content.pm.PackageManager; +import android.os.Build; +import android.os.Process; +import android.support.multidex.MultiDex; + +import org.chromium.base.Log; +import org.chromium.base.VisibleForTesting; + +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; + /** - * Multidex configuration. Generated on a per-target basis. + * Performs multidex installation for non-isolated processes. */ -class ChromiumMultiDex { +public class ChromiumMultiDex { - /** Whether multidex is enabled for this target. + private static final String TAG = "base_multidex"; + + /** + * Suffix for the meta-data tag in the AndroidManifext.xml that determines whether loading + * secondary dexes should be skipped for a given process name. + */ + private static final String IGNORE_MULTIDEX_KEY = ".ignore_multidex"; + + /** + * Installs secondary dexes if possible/necessary. + * + * Isolated processes (e.g. renderer processes) can't load secondary dex files on + * K and below, so we don't even try in that case. * - * This has to be a function instead of a static final boolean s.t. the initial false value - * doesn't get optimized into {@link ChromiumMultiDexInstaller} at base_java compile time. + * In release builds, this is a no-op because: + * - multidex isn't necessary in release builds because we run proguard there and + * thus aren't threatening to hit the dex limit; and + * - calling MultiDex.install, even in the absence of secondary dexes, causes a + * significant regression in start-up time (crbug.com/525695). + * + * @param context The application context. */ - static boolean isMultidexEnabled() { -#if defined(ENABLE_MULTIDEX) - return true; + @VisibleForTesting +#if defined(MULTIDEX_CONFIGURATION_Debug) + public static void install(Context context) { + // TODO(jbudorick): Back out this version check once support for K & below works. + // http://crbug.com/512357 + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP + && !shouldInstallMultiDex(context)) { + Log.i(TAG, "Skipping multidex installation: not needed for process."); + } else { + MultiDex.install(context); + Log.i(TAG, "Completed multidex installation."); + } + } + + private static String getProcessName(Context context) { + try { + String currentProcessName = null; + int pid = android.os.Process.myPid(); + + ActivityManager manager = + (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE); + for (RunningAppProcessInfo processInfo : manager.getRunningAppProcesses()) { + if (processInfo.pid == pid) { + currentProcessName = processInfo.processName; + break; + } + } + + return currentProcessName; + } catch (SecurityException ex) { + return null; + } + } + + // Determines whether MultiDex should be installed for the current process. Isolated + // Processes should skip MultiDex as they can not actually access the files on disk. + // Privileged processes need ot have all of their dependencies in the MainDex for + // performance reasons. + private static boolean shouldInstallMultiDex(Context context) { + try { + Method isIsolatedMethod = + android.os.Process.class.getMethod("isIsolated"); + Object retVal = isIsolatedMethod.invoke(null); + if (retVal != null && retVal instanceof Boolean && ((Boolean) retVal)) { + return false; + } + } catch (IllegalAccessException | IllegalArgumentException + | InvocationTargetException | NoSuchMethodException e) { + // Ignore and fall back to checking the app processes. + } + + String currentProcessName = getProcessName(context); + if (currentProcessName == null) return true; + + PackageManager packageManager = context.getPackageManager(); + try { + ApplicationInfo appInfo = packageManager.getApplicationInfo(context.getPackageName(), + PackageManager.GET_META_DATA); + if (appInfo == null || appInfo.metaData == null) return true; + return !appInfo.metaData.getBoolean(currentProcessName + IGNORE_MULTIDEX_KEY, false); + } catch (PackageManager.NameNotFoundException e) { + return true; + } + } #else - return false; -#endif + public static void install(Context context) { } +#endif } diff --git a/base/base.gyp b/base/base.gyp index 94a1d49..dc484f4 100644 --- a/base/base.gyp +++ b/base/base.gyp @@ -1489,6 +1489,9 @@ 'variables': { 'package_name': 'org/chromium/base/multidex', 'template_deps': [], + 'additional_gcc_preprocess_options': [ + '--defines', 'MULTIDEX_CONFIGURATION_<(CONFIGURATION_NAME)', + ], }, 'includes': ['../build/android/java_cpp_template.gypi'], }, @@ -1507,10 +1510,7 @@ 'type': 'none', 'variables': { 'java_in_dir': 'android/java', - 'jar_excluded_classes': [ - '*/ChromiumMultiDex.class', - '*/NativeLibraries.class', - ], + 'jar_excluded_classes': [ '*/NativeLibraries.class' ], }, 'dependencies': [ 'base_java_application_state', @@ -1522,11 +1522,6 @@ '../third_party/android_tools/android_tools.gyp:android_support_multidex_javalib', '../third_party/jsr-305/jsr-305.gyp:jsr_305_javalib', ], - 'all_dependent_settings': { - 'variables': { - 'generate_multidex_config': 1, - }, - }, 'includes': [ '../build/java.gypi' ], }, { @@ -1588,7 +1583,6 @@ 'target_name': 'base_junit_test_support', 'type': 'none', 'dependencies': [ - 'base_multidex_gen', '../testing/android/junit/junit_test.gyp:junit_test_support', '../third_party/android_tools/android_tools.gyp:android_support_multidex_javalib', ], diff --git a/base/test/android/javatests/src/org/chromium/base/test/BaseInstrumentationTestRunner.java b/base/test/android/javatests/src/org/chromium/base/test/BaseInstrumentationTestRunner.java index 669307c..8bf3d0fb 100644 --- a/base/test/android/javatests/src/org/chromium/base/test/BaseInstrumentationTestRunner.java +++ b/base/test/android/javatests/src/org/chromium/base/test/BaseInstrumentationTestRunner.java @@ -18,7 +18,7 @@ import junit.framework.TestResult; import org.chromium.base.Log; import org.chromium.base.SysUtils; -import org.chromium.base.multidex.ChromiumMultiDexInstaller; +import org.chromium.base.multidex.ChromiumMultiDex; import org.chromium.base.test.util.CommandLineFlags; import org.chromium.base.test.util.DisableIfSkipCheck; import org.chromium.base.test.util.MinAndroidSdkLevel; @@ -37,7 +37,7 @@ public class BaseInstrumentationTestRunner extends InstrumentationTestRunner { @Override public void onCreate(Bundle arguments) { - ChromiumMultiDexInstaller.install(getTargetContext()); + ChromiumMultiDex.install(getTargetContext()); super.onCreate(arguments); } |