From efb1c943598f4969855b4a8e181921b9b11718b8 Mon Sep 17 00:00:00 2001 From: Calin Juravle Date: Tue, 4 Apr 2017 20:31:44 -0700 Subject: [PATCH] Fix dex flags for secondary dex files getDexFlags should always be called after getRealCompilerFilter. Otherwise public dex files might be considered private and their oat file will not be readable by others. Bug: 36896515 Test: adb shell cmd package compile -r bg-dexopt --secondary-dex com.google.android.gms check that the oat directory and files have the right permissions Change-Id: Ic91957f155c2008ed59a7e2ba14732e5af88d12a --- .../core/java/com/android/server/pm/PackageDexOptimizer.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/services/core/java/com/android/server/pm/PackageDexOptimizer.java b/services/core/java/com/android/server/pm/PackageDexOptimizer.java index d9ea7284616d2..acbd446a967f6 100644 --- a/services/core/java/com/android/server/pm/PackageDexOptimizer.java +++ b/services/core/java/com/android/server/pm/PackageDexOptimizer.java @@ -151,6 +151,7 @@ public class PackageDexOptimizer { // TODO(calin,jeffhao): shared library paths should be adjusted to include previous code // paths (b/34169257). final String sharedLibrariesPath = getSharedLibrariesPath(sharedLibraries); + // Get the dexopt flags after getRealCompilerFilter to make sure we get the correct flags. final int dexoptFlags = getDexFlags(pkg, compilerFilter); int result = DEX_OPT_SKIPPED; @@ -254,6 +255,8 @@ public class PackageDexOptimizer { @GuardedBy("mInstallLock") private int dexOptSecondaryDexPathLI(ApplicationInfo info, String path, Set isas, String compilerFilter, boolean isUsedByOtherApps) { + compilerFilter = getRealCompilerFilter(info, compilerFilter, isUsedByOtherApps); + // Get the dexopt flags after getRealCompilerFilter to make sure we get the correct flags. int dexoptFlags = getDexFlags(info, compilerFilter) | DEXOPT_SECONDARY_DEX; // Check the app storage and add the appropriate flags. if (info.dataDir.equals(info.deviceProtectedDataDir)) { @@ -264,7 +267,6 @@ public class PackageDexOptimizer { Slog.e(TAG, "Could not infer CE/DE storage for package " + info.packageName); return DEX_OPT_FAILED; } - compilerFilter = getRealCompilerFilter(info, compilerFilter, isUsedByOtherApps); Log.d(TAG, "Running dexopt on: " + path + " pkg=" + info.packageName + " isa=" + isas + " dexoptFlags=" + printDexoptFlags(dexoptFlags)