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"
This commit is contained in:
Todd Kennedy
2016-08-23 15:38:26 -07:00
parent e24a4590bf
commit 095d4125be

View File

@@ -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 {