}
}
- // 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.)
"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";
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";
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);
}
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();
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());
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) {