From 8995b00ce8f68f2a285a97c2ce711bea8c61179e Mon Sep 17 00:00:00 2001 From: Narayan Kamath Date: Wed, 11 May 2016 20:31:09 +0100 Subject: [PATCH] LoadedApk: Avoid unnecessary work when mIncludeCode == false. We don't need to set up JIT profiles and register usage etc when the package context we're trying to construct doesn't request code. This will correct accounting for packages which are only used for resources. bug: 28519185 Change-Id: I849675efa76c8100ae937de478b52254babe384c --- core/java/android/app/LoadedApk.java | 29 ++++++++++++++++++++++------ 1 file changed, 23 insertions(+), 6 deletions(-) diff --git a/core/java/android/app/LoadedApk.java b/core/java/android/app/LoadedApk.java index 752dc1e88e152..7d43a1155e61f 100644 --- a/core/java/android/app/LoadedApk.java +++ b/core/java/android/app/LoadedApk.java @@ -450,9 +450,6 @@ public final class LoadedApk { } } - final List zipPaths = new ArrayList<>(); - final List libPaths = new ArrayList<>(); - if (mRegisterPackage) { try { ActivityManagerNative.getDefault().addPackageDependency(mPackageName); @@ -461,8 +458,10 @@ public final class LoadedApk { } } + final List zipPaths = new ArrayList<>(); + final List libPaths = new ArrayList<>(); makePaths(mActivityThread, mApplicationInfo, zipPaths, libPaths); - final String zip = mIncludeCode ? TextUtils.join(File.pathSeparator, zipPaths) : ""; + final boolean isBundledApp = mApplicationInfo.isSystemApp() && !mApplicationInfo.isUpdatedSystemApp(); @@ -476,10 +475,28 @@ public final class LoadedApk { final String librarySearchPath = TextUtils.join(File.pathSeparator, libPaths); + // If we're not asked to include code, we construct a classloader that has + // no code path included. We still need to set up the library search paths + // and permitted path because NativeActivity relies on it (it attempts to + // call System.loadLibrary() on a classloader from a LoadedApk with + // mIncludeCode == false). + if (!mIncludeCode) { + if (mClassLoader == null) { + StrictMode.ThreadPolicy oldPolicy = StrictMode.allowThreadDiskReads(); + mClassLoader = ApplicationLoaders.getDefault().getClassLoader( + "" /* codePath */, mApplicationInfo.targetSdkVersion, isBundledApp, + librarySearchPath, libraryPermittedPath, mBaseClassLoader); + StrictMode.setThreadPolicy(oldPolicy); + } + + return; + } + /* - * With all the combination done (if necessary, actually - * create the class loader. + * With all the combination done (if necessary, actually create the java class + * loader and set up JIT profiling support if necessary. */ + final String zip = TextUtils.join(File.pathSeparator, zipPaths); if (ActivityThread.localLOGV) Slog.v(ActivityThread.TAG, "Class path: " + zip +