From 095d4125be2117d1bbcdc815dffe6ecc0b7e651f Mon Sep 17 00:00:00 2001 From: Todd Kennedy Date: Tue, 23 Aug 2016 15:38:26 -0700 Subject: [PATCH] use directory timestamp during OTA Previously the timestamp was generated using the directory and not the APK [see b/29575840 and b/29610181 as to why that's bad]. In MR1, the timestamp was generated using the most recent time of any of the APK files. The timestamp discrepancy causes problems during OTA to N MR1. Most apps are incorrectly marked as "changed" which means a full parse and verification pass on all packages. This can be a very lengthy process. Bug: 30930797 Change-Id: Iaef7b318e1c1effbd74d996f88cbf3d6e77736cd Test: manually updated the platform and noticed that existing packages were marked as "not changed" --- .../com/android/server/pm/PackageManagerService.java | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index 2ed64f18349c0..eadf65564133c 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -533,6 +533,7 @@ public class PackageManagerService extends IPackageManager.Stub { final String[] mSeparateProcesses; final boolean mIsUpgrade; final boolean mIsPreNUpgrade; + final boolean mIsPreNMR1Upgrade; /** The location for ASEC container files on internal storage. */ final String mAsecInternalPath; @@ -2239,6 +2240,8 @@ public class PackageManagerService extends IPackageManager.Stub { // as there is no profiling data available. mIsPreNUpgrade = mIsUpgrade && ver.sdkVersion < Build.VERSION_CODES.N; + mIsPreNMR1Upgrade = mIsUpgrade && ver.sdkVersion < Build.VERSION_CODES.N_MR1; + // save off the names of pre-existing system packages prior to scanning; we don't // want to automatically grant runtime permissions for new system apps if (mPromoteSystemApps) { @@ -6613,9 +6616,13 @@ public class PackageManagerService extends IPackageManager.Stub { private void collectCertificatesLI(PackageSetting ps, PackageParser.Package pkg, File srcFile, final int policyFlags) throws PackageManagerException { + // When upgrading from pre-N MR1, verify the package time stamp using the package + // directory and not the APK file. + final long lastModifiedTime = mIsPreNMR1Upgrade + ? new File(pkg.codePath).lastModified() : getLastModifiedTime(pkg, srcFile); if (ps != null && ps.codePath.equals(srcFile) - && ps.timeStamp == getLastModifiedTime(pkg, srcFile) + && ps.timeStamp == lastModifiedTime && !isCompatSignatureUpdateNeeded(pkg) && !isRecoverSignatureUpdateNeeded(pkg)) { long mSigningKeySetId = ps.keySetData.getProperSigningKeySet(); @@ -6637,7 +6644,7 @@ public class PackageManagerService extends IPackageManager.Stub { Slog.w(TAG, "PackageSetting for " + ps.name + " is missing signatures. Collecting certs again to recover them."); } else { - Log.i(TAG, srcFile.toString() + " changed; collecting certs"); + Slog.i(TAG, srcFile.toString() + " changed; collecting certs"); } try {