summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--services/core/java/com/android/server/pm/PackageManagerService.java5
-rw-r--r--services/core/java/com/android/server/pm/Settings.java28
2 files changed, 30 insertions, 3 deletions
diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java
index f8108cb73252..d2fd762c7f3f 100644
--- a/services/core/java/com/android/server/pm/PackageManagerService.java
+++ b/services/core/java/com/android/server/pm/PackageManagerService.java
@@ -2225,9 +2225,10 @@ public class PackageManagerService extends IPackageManager.Stub {
}
}
- // When upgrading form pre-N, we need to handle package extraction like first boot,
+ // When upgrading from 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;
+ mIsPreNUpgrade = !mSettings.isNWorkDone();
+ mSettings.setNWorkDone();
// Collect vendor overlay packages.
// (Do this before scanning any apps.)
diff --git a/services/core/java/com/android/server/pm/Settings.java b/services/core/java/com/android/server/pm/Settings.java
index fa0eb46fba6c..3c3c576f2587 100644
--- a/services/core/java/com/android/server/pm/Settings.java
+++ b/services/core/java/com/android/server/pm/Settings.java
@@ -190,6 +190,7 @@ final class Settings {
"all-intent-filter-verifications";
private static final String TAG_DEFAULT_BROWSER = "default-browser";
private static final String TAG_VERSION = "version";
+ private static final String TAG_N_WORK = "n-work";
private static final String ATTR_NAME = "name";
private static final String ATTR_USER = "user";
@@ -214,6 +215,7 @@ final class Settings {
private static final String ATTR_VOLUME_UUID = "volumeUuid";
private static final String ATTR_SDK_VERSION = "sdkVersion";
private static final String ATTR_DATABASE_VERSION = "databaseVersion";
+ private static final String ATTR_DONE = "done";
// Bookkeeping for restored permission grants
private static final String TAG_RESTORED_RUNTIME_PERMISSIONS = "restored-perms";
@@ -386,6 +388,17 @@ final class Settings {
public final KeySetManagerService mKeySetManagerService = new KeySetManagerService(mPackages);
+ /**
+ * Used to track whether N+ work has been done. This is similar to the file-system level
+ * and denotes that first-boot or upgrade-to-N work has been done.
+ *
+ * Note: the flag has been added to a) allow tracking while an API level check is impossible
+ * and b) to merge upgrade as well as first boot (because the flag is false, by default).
+ *
+ * STOPSHIP: b/27872764
+ */
+ private boolean mIsNWorkDone = false;
+
Settings(Object lock) {
this(Environment.getDataDirectory(), lock);
}
@@ -2327,6 +2340,10 @@ final class Settings {
mKeySetManagerService.writeKeySetManagerServiceLPr(serializer);
+ serializer.startTag(null, TAG_N_WORK);
+ serializer.attribute(null, ATTR_DONE, Boolean.toString(mIsNWorkDone));
+ serializer.endTag(null, TAG_N_WORK);
+
serializer.endTag(null, "packages");
serializer.endDocument();
@@ -2860,7 +2877,8 @@ final class Settings {
ver.sdkVersion = XmlUtils.readIntAttribute(parser, ATTR_SDK_VERSION);
ver.databaseVersion = XmlUtils.readIntAttribute(parser, ATTR_SDK_VERSION);
ver.fingerprint = XmlUtils.readStringAttribute(parser, ATTR_FINGERPRINT);
-
+ } else if (TAG_N_WORK.equals(tagName)) {
+ mIsNWorkDone = XmlUtils.readBooleanAttribute(parser, ATTR_DONE, false);
} else {
Slog.w(PackageManagerService.TAG, "Unknown element under <packages>: "
+ parser.getName());
@@ -4140,6 +4158,14 @@ final class Settings {
return res;
}
+ public boolean isNWorkDone() {
+ return mIsNWorkDone;
+ }
+
+ void setNWorkDone() {
+ mIsNWorkDone = true;
+ }
+
static void printFlags(PrintWriter pw, int val, Object[] spec) {
pw.print("[ ");
for (int i=0; i<spec.length; i+=2) {