summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--services/core/java/com/android/server/pm/PackageManagerService.java41
-rw-r--r--services/core/java/com/android/server/pm/PackageManagerServiceCompilerMapping.java3
2 files changed, 31 insertions, 13 deletions
diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java
index 64f8c98a082d..a9377387a408 100644
--- a/services/core/java/com/android/server/pm/PackageManagerService.java
+++ b/services/core/java/com/android/server/pm/PackageManagerService.java
@@ -444,13 +444,14 @@ public class PackageManagerService extends IPackageManager.Stub {
}
// Compilation reasons.
- public static final int REASON_BOOT = 0;
- public static final int REASON_INSTALL = 1;
- public static final int REASON_BACKGROUND_DEXOPT = 2;
- public static final int REASON_AB_OTA = 3;
- public static final int REASON_NON_SYSTEM_LIBRARY = 4;
- public static final int REASON_SHARED_APK = 5;
- public static final int REASON_FORCED_DEXOPT = 6;
+ public static final int REASON_FIRST_BOOT = 0;
+ public static final int REASON_BOOT = 1;
+ public static final int REASON_INSTALL = 2;
+ public static final int REASON_BACKGROUND_DEXOPT = 3;
+ public static final int REASON_AB_OTA = 4;
+ public static final int REASON_NON_SYSTEM_LIBRARY = 5;
+ public static final int REASON_SHARED_APK = 6;
+ public static final int REASON_FORCED_DEXOPT = 7;
public static final int REASON_LAST = REASON_FORCED_DEXOPT;
@@ -473,6 +474,7 @@ public class PackageManagerService extends IPackageManager.Stub {
final int mDefParseFlags;
final String[] mSeparateProcesses;
final boolean mIsUpgrade;
+ final boolean mIsPreNUpgrade;
/** The location for ASEC container files on internal storage. */
final String mAsecInternalPath;
@@ -2206,6 +2208,7 @@ public class PackageManagerService extends IPackageManager.Stub {
final VersionInfo ver = mSettings.getInternalVersion();
mIsUpgrade = !Build.FINGERPRINT.equals(ver.fingerprint);
+
// when upgrading from pre-M, promote system app permissions from install to runtime
mPromoteSystemApps =
mIsUpgrade && ver.sdkVersion <= Build.VERSION_CODES.LOLLIPOP_MR1;
@@ -2222,6 +2225,10 @@ public class PackageManagerService extends IPackageManager.Stub {
}
}
+ // When upgrading form pre-N, we need to handle package extraction like first boot,
+ // as there is no profiling data available.
+ mIsPreNUpgrade = ver.sdkVersion <= Build.VERSION_CODES.M;
+
// Collect vendor overlay packages.
// (Do this before scanning any apps.)
// For security and version matching reason, only consider
@@ -6910,10 +6917,18 @@ public class PackageManagerService extends IPackageManager.Stub {
public void extractPackagesIfNeeded() {
enforceSystemOrRoot("Only the system can request package extraction");
- // Extract pacakges only if profile-guided compilation is enabled because
- // otherwise BackgroundDexOptService will not dexopt them later.
- boolean prunedCache = VMRuntime.didPruneDalvikCache();
- if (!isUpgrade() && !prunedCache) {
+ // We need to re-extract after an OTA.
+ boolean causeUpgrade = isUpgrade();
+
+ // First boot or factory reset.
+ // Note: we also handle devices that are upgrading to N right now as if it is their
+ // first boot, as they do not have profile data.
+ boolean causeFirstBoot = isFirstBoot() || mIsPreNUpgrade;
+
+ // We need to re-extract after a pruned cache, as AoT-ed files will be out of date.
+ boolean causePrunedCache = VMRuntime.didPruneDalvikCache();
+
+ if (!causeUpgrade && !causeFirstBoot && !causePrunedCache) {
return;
}
@@ -6945,7 +6960,9 @@ public class PackageManagerService extends IPackageManager.Stub {
// and would have to be patched (would be SELF_PATCHOAT, which is deprecated).
// Instead, force the extraction in this case.
performDexOpt(pkg.packageName, null /* instructionSet */,
- false /* checkProfiles */, REASON_BOOT, prunedCache);
+ false /* checkProfiles */,
+ causeFirstBoot ? REASON_FIRST_BOOT : REASON_BOOT,
+ causePrunedCache);
}
}
}
diff --git a/services/core/java/com/android/server/pm/PackageManagerServiceCompilerMapping.java b/services/core/java/com/android/server/pm/PackageManagerServiceCompilerMapping.java
index 238e410b69df..f1b7991819b7 100644
--- a/services/core/java/com/android/server/pm/PackageManagerServiceCompilerMapping.java
+++ b/services/core/java/com/android/server/pm/PackageManagerServiceCompilerMapping.java
@@ -26,7 +26,8 @@ import dalvik.system.DexFile;
class PackageManagerServiceCompilerMapping {
// Names for compilation reasons.
static final String REASON_STRINGS[] = {
- "boot", "install", "bg-dexopt", "ab-ota", "nsys-library", "shared-apk", "forced-dexopt"
+ "first-boot", "boot", "install", "bg-dexopt", "ab-ota", "nsys-library", "shared-apk",
+ "forced-dexopt"
};
// Static block to ensure the strings array is of the right length.