diff options
| -rw-r--r-- | services/core/java/com/android/server/pm/PackageManagerService.java | 5 | ||||
| -rw-r--r-- | services/core/java/com/android/server/pm/Settings.java | 28 |
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) { |