diff options
| author | 2015-03-27 05:24:50 +0000 | |
|---|---|---|
| committer | 2015-03-27 05:24:50 +0000 | |
| commit | 8b301dba07b3c3d5bf83f7a22a2ea0b5b2bbdb64 (patch) | |
| tree | 484045f368a1c673dcaefe845c5aa70ba963729f | |
| parent | f67c7bddc382d91c99de1f8d8447f6c4b123992f (diff) | |
| parent | d291cd4040dcaa26d0f5cff637b11011d55fe25b (diff) | |
am dbe0dd16: When scanning unbundled apps, only install the expected APK tree
automerge: d291cd4
* commit 'd291cd4040dcaa26d0f5cff637b11011d55fe25b':
When scanning unbundled apps, only install the expected APK tree
| -rw-r--r-- | services/core/java/com/android/server/pm/PackageManagerService.java | 27 |
1 files changed, 25 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 cc0a30a508e6..6498dcc2a44d 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -271,6 +271,7 @@ public class PackageManagerService extends IPackageManager.Stub { static final int SCAN_TRUSTED_OVERLAY = 1<<9; static final int SCAN_DELETE_DATA_ON_FAILURES = 1<<10; static final int SCAN_REPLACING = 1<<11; + static final int SCAN_REQUIRE_KNOWN = 1<<12; static final int REMOVE_CHATTY = 1<<16; @@ -1646,10 +1647,10 @@ public class PackageManagerService extends IPackageManager.Stub { if (!mOnlyCore) { EventLog.writeEvent(EventLogTags.BOOT_PROGRESS_PMS_DATA_SCAN_START, SystemClock.uptimeMillis()); - scanDirLI(mAppInstallDir, 0, scanFlags, 0); + scanDirLI(mAppInstallDir, 0, scanFlags | SCAN_REQUIRE_KNOWN, 0); scanDirLI(mDrmAppPrivateInstallDir, PackageParser.PARSE_FORWARD_LOCK, - scanFlags, 0); + scanFlags | SCAN_REQUIRE_KNOWN, 0); /** * Remove disable package settings for any updated system @@ -5349,6 +5350,28 @@ public class PackageManagerService extends IPackageManager.Stub { + " already installed. Skipping duplicate."); } + // If we're only installing presumed-existing packages, require that the + // scanned APK is both already known and at the path previously established + // for it. Previously unknown packages we pick up normally, but if we have an + // a priori expectation about this package's install presence, enforce it. + if ((scanFlags & SCAN_REQUIRE_KNOWN) != 0) { + PackageSetting known = mSettings.peekPackageLPr(pkg.packageName); + if (known != null) { + if (DEBUG_PACKAGE_SCANNING) { + Log.d(TAG, "Examining " + pkg.codePath + + " and requiring known paths " + known.codePathString + + " & " + known.resourcePathString); + } + if (!pkg.applicationInfo.getCodePath().equals(known.codePathString) + || !pkg.applicationInfo.getResourcePath().equals(known.resourcePathString)) { + throw new PackageManagerException(INSTALL_FAILED_PACKAGE_CHANGED, + "Application package " + pkg.packageName + + " found at " + pkg.applicationInfo.getCodePath() + + " but expected at " + known.codePathString + "; ignoring."); + } + } + } + // Initialize package source and resource directories File destCodeFile = new File(pkg.applicationInfo.getCodePath()); File destResourceFile = new File(pkg.applicationInfo.getResourcePath()); |