diff options
5 files changed, 43 insertions, 12 deletions
diff --git a/services/core/java/com/android/server/pm/ShortcutLauncher.java b/services/core/java/com/android/server/pm/ShortcutLauncher.java index cedf47633c78..0fecb631a182 100644 --- a/services/core/java/com/android/server/pm/ShortcutLauncher.java +++ b/services/core/java/com/android/server/pm/ShortcutLauncher.java @@ -230,7 +230,7 @@ class ShortcutLauncher extends ShortcutPackageItem { out.startTag(null, TAG_ROOT); ShortcutService.writeAttr(out, ATTR_PACKAGE_NAME, getPackageName()); ShortcutService.writeAttr(out, ATTR_LAUNCHER_USER_ID, getPackageUserId()); - getPackageInfo().saveToXml(out, forBackup); + getPackageInfo().saveToXml(mShortcutUser.mService, out, forBackup); for (int i = 0; i < size; i++) { final PackageWithUser pu = mPinnedShortcuts.keyAt(i); diff --git a/services/core/java/com/android/server/pm/ShortcutPackage.java b/services/core/java/com/android/server/pm/ShortcutPackage.java index c11c0990fb12..92e261a72617 100644 --- a/services/core/java/com/android/server/pm/ShortcutPackage.java +++ b/services/core/java/com/android/server/pm/ShortcutPackage.java @@ -1348,7 +1348,7 @@ class ShortcutPackage extends ShortcutPackageItem { ShortcutService.writeAttr(out, ATTR_NAME, getPackageName()); ShortcutService.writeAttr(out, ATTR_CALL_COUNT, mApiCallCount); ShortcutService.writeAttr(out, ATTR_LAST_RESET, mLastResetTime); - getPackageInfo().saveToXml(out, forBackup); + getPackageInfo().saveToXml(mShortcutUser.mService, out, forBackup); for (int j = 0; j < size; j++) { saveShortcut(out, mShortcuts.valueAt(j), forBackup, diff --git a/services/core/java/com/android/server/pm/ShortcutPackageInfo.java b/services/core/java/com/android/server/pm/ShortcutPackageInfo.java index 3d37229642d1..520ed2526b17 100644 --- a/services/core/java/com/android/server/pm/ShortcutPackageInfo.java +++ b/services/core/java/com/android/server/pm/ShortcutPackageInfo.java @@ -48,6 +48,7 @@ class ShortcutPackageInfo { private static final String ATTR_LAST_UPDATE_TIME = "last_udpate_time"; private static final String ATTR_BACKUP_SOURCE_VERSION = "bk_src_version"; private static final String ATTR_BACKUP_ALLOWED = "allow-backup"; + private static final String ATTR_BACKUP_ALLOWED_INITIALIZED = "allow-backup-initialized"; private static final String ATTR_BACKUP_SOURCE_BACKUP_ALLOWED = "bk_src_backup-allowed"; private static final String ATTR_SHADOW = "shadow"; @@ -187,7 +188,11 @@ class ShortcutPackageInfo { mSigHashes = BackupUtils.hashSignatureArray(pi.signatures); } - public void saveToXml(XmlSerializer out, boolean forBackup) throws IOException { + public void saveToXml(ShortcutService s, XmlSerializer out, boolean forBackup) + throws IOException { + if (forBackup && !mBackupAllowedInitialized) { + s.wtf("Backup happened before mBackupAllowed is initialized."); + } out.startTag(null, TAG_ROOT); @@ -196,6 +201,10 @@ class ShortcutPackageInfo { ShortcutService.writeAttr(out, ATTR_SHADOW, mIsShadow); ShortcutService.writeAttr(out, ATTR_BACKUP_ALLOWED, mBackupAllowed); + // We don't need to save this field (we don't even read it back), but it'll show up + // in the dumpsys in the backup / restore payload. + ShortcutService.writeAttr(out, ATTR_BACKUP_ALLOWED_INITIALIZED, mBackupAllowedInitialized); + ShortcutService.writeAttr(out, ATTR_BACKUP_SOURCE_VERSION, mBackupSourceVersionCode); ShortcutService.writeAttr(out, ATTR_BACKUP_SOURCE_BACKUP_ALLOWED, mBackupSourceBackupAllowed); diff --git a/services/core/java/com/android/server/pm/ShortcutService.java b/services/core/java/com/android/server/pm/ShortcutService.java index 076f81f87340..8c3518831b7b 100644 --- a/services/core/java/com/android/server/pm/ShortcutService.java +++ b/services/core/java/com/android/server/pm/ShortcutService.java @@ -3545,9 +3545,11 @@ public class ShortcutService extends IShortcutService.Stub { // Update the signatures for all packages. user.forAllPackageItems(spi -> spi.refreshPackageSignatureAndSave()); + // Rescan all apps; this will also update the version codes and "allow-backup". + user.forAllPackages(pkg -> pkg.rescanPackageIfNeeded( + /*isNewApp=*/ false, /*forceRescan=*/ true)); + // Set the version code for the launchers. - // We shouldn't do this for publisher packages, because we don't want to update the - // version code without rescanning the manifest. user.forAllLaunchers(launcher -> launcher.ensurePackageInfo()); // Save to the filesystem. @@ -3566,7 +3568,9 @@ public class ShortcutService extends IShortcutService.Stub { Slog.w(TAG, "Backup failed.", e); return null; } - return os.toByteArray(); + byte[] payload = os.toByteArray(); + mShortcutDumpFiles.save("backup-1-payload.txt", payload); + return payload; } } @@ -3846,6 +3850,8 @@ public class ShortcutService extends IShortcutService.Stub { pw.print(next); pw.print("] "); pw.print(formatTime(next)); + pw.println(); + pw.println(); pw.print(" Config:"); pw.print(" Max icon dim: "); @@ -4241,7 +4247,6 @@ public class ShortcutService extends IShortcutService.Stub { } // Injection point. - @VisibleForTesting String injectBuildFingerprint() { return Build.FINGERPRINT; } diff --git a/services/core/java/com/android/server/pm/ShortcutUser.java b/services/core/java/com/android/server/pm/ShortcutUser.java index c044c1ce814d..505e4ee60529 100644 --- a/services/core/java/com/android/server/pm/ShortcutUser.java +++ b/services/core/java/com/android/server/pm/ShortcutUser.java @@ -23,7 +23,6 @@ import android.content.pm.ShortcutManager; import android.text.TextUtils; import android.text.format.Formatter; import android.util.ArrayMap; -import android.util.ArraySet; import android.util.Log; import android.util.Slog; @@ -62,6 +61,7 @@ class ShortcutUser { // Suffix "2" was added to force rescan all packages after the next OTA. private static final String ATTR_LAST_APP_SCAN_TIME = "last-app-scan-time2"; private static final String ATTR_LAST_APP_SCAN_OS_FINGERPRINT = "last-app-scan-fp"; + private static final String ATTR_RESTORE_SOURCE_FINGERPRINT = "restore-from-fp"; private static final String KEY_USER_ID = "userId"; private static final String KEY_LAUNCHERS = "launchers"; private static final String KEY_PACKAGES = "packages"; @@ -128,6 +128,7 @@ class ShortcutUser { private long mLastAppScanTime; private String mLastAppScanOsFingerprint; + private String mRestoreFromOsFingerprint; public ShortcutUser(ShortcutService service, int userId) { mService = service; @@ -340,8 +341,13 @@ class ShortcutUser { mLastAppScanTime); ShortcutService.writeAttr(out, ATTR_LAST_APP_SCAN_OS_FINGERPRINT, mLastAppScanOsFingerprint); + ShortcutService.writeAttr(out, ATTR_RESTORE_SOURCE_FINGERPRINT, + mRestoreFromOsFingerprint); ShortcutService.writeTagValue(out, TAG_LAUNCHER, mLastKnownLauncher); + } else { + ShortcutService.writeAttr(out, ATTR_RESTORE_SOURCE_FINGERPRINT, + mService.injectBuildFingerprint()); } // Can't use forEachPackageItem due to the checked exceptions. @@ -387,6 +393,8 @@ class ShortcutUser { ret.mLastAppScanTime = lastAppScanTime < currentTime ? lastAppScanTime : 0; ret.mLastAppScanOsFingerprint = ShortcutService.parseStringAttribute(parser, ATTR_LAST_APP_SCAN_OS_FINGERPRINT); + ret.mRestoreFromOsFingerprint = ShortcutService.parseStringAttribute(parser, + ATTR_RESTORE_SOURCE_FINGERPRINT); final int outerDepth = parser.getDepth(); int type; while ((type = parser.next()) != XmlPullParser.END_DOCUMENT @@ -524,6 +532,8 @@ class ShortcutUser { restored.mLaunchers.clear(); restored.mPackages.clear(); + mRestoreFromOsFingerprint = restored.mRestoreFromOsFingerprint; + Slog.i(TAG, "Restored: L=" + restoredLaunchers[0] + " P=" + restoredPackages[0] + " S=" + restoredShortcuts[0]); @@ -539,14 +549,21 @@ class ShortcutUser { pw.print(" Last app scan: ["); pw.print(mLastAppScanTime); pw.print("] "); - pw.print(ShortcutService.formatTime(mLastAppScanTime)); - pw.print(" Last app scan FP: "); - pw.print(mLastAppScanOsFingerprint); - pw.println(); + pw.println(ShortcutService.formatTime(mLastAppScanTime)); prefix += prefix + " "; pw.print(prefix); + pw.print("Last app scan FP: "); + pw.println(mLastAppScanOsFingerprint); + + pw.print(prefix); + pw.print("Restore from FP: "); + pw.print(mRestoreFromOsFingerprint); + pw.println(); + + + pw.print(prefix); pw.print("Cached launcher: "); pw.print(mCachedLauncher); pw.println(); |