Fix issue #2512507: Shortcuts and Widgets lost on upgrading from Eclair to FRE70D
Apps on the system partition are now allowed to change their certs, as
long as they are not using a shared user id.
Change-Id: I02ff7ac874dc649b7f8cbb705ae8d7ed31e1d125
diff --git a/core/java/android/content/pm/PackageParser.java b/core/java/android/content/pm/PackageParser.java
index 821d19c..3be4cebd 100644
--- a/core/java/android/content/pm/PackageParser.java
+++ b/core/java/android/content/pm/PackageParser.java
@@ -353,6 +353,7 @@
public final static int PARSE_IGNORE_PROCESSES = 1<<3;
public final static int PARSE_FORWARD_LOCK = 1<<4;
public final static int PARSE_ON_SDCARD = 1<<5;
+ public final static int PARSE_IS_SYSTEM_DIR = 1<<6;
public int getParseError() {
return mParseError;
diff --git a/services/java/com/android/server/PackageManagerService.java b/services/java/com/android/server/PackageManagerService.java
index f854067..05558d4 100644
--- a/services/java/com/android/server/PackageManagerService.java
+++ b/services/java/com/android/server/PackageManagerService.java
@@ -851,7 +851,8 @@
mFrameworkInstallObserver = new AppDirObserver(
mFrameworkDir.getPath(), OBSERVER_EVENTS, true);
mFrameworkInstallObserver.startWatching();
- scanDirLI(mFrameworkDir, PackageParser.PARSE_IS_SYSTEM,
+ scanDirLI(mFrameworkDir, PackageParser.PARSE_IS_SYSTEM
+ | PackageParser.PARSE_IS_SYSTEM_DIR,
scanMode | SCAN_NO_DEX);
// Collect all system packages.
@@ -859,7 +860,8 @@
mSystemInstallObserver = new AppDirObserver(
mSystemAppDir.getPath(), OBSERVER_EVENTS, true);
mSystemInstallObserver.startWatching();
- scanDirLI(mSystemAppDir, PackageParser.PARSE_IS_SYSTEM, scanMode);
+ scanDirLI(mSystemAppDir, PackageParser.PARSE_IS_SYSTEM
+ | PackageParser.PARSE_IS_SYSTEM_DIR, scanMode);
if (mInstaller != null) {
if (DEBUG_UPGRADE) Log.v(TAG, "Running installd update commands");
@@ -2711,8 +2713,6 @@
SharedUserSetting suid = null;
PackageSetting pkgSetting = null;
- boolean removeExisting = false;
-
if ((pkg.applicationInfo.flags&ApplicationInfo.FLAG_SYSTEM) == 0) {
// Only system apps can use these features.
pkg.mOriginalPackages = null;
@@ -2903,7 +2903,7 @@
if (!verifySignaturesLP(pkgSetting, pkg, parseFlags,
(scanMode&SCAN_UPDATE_SIGNATURE) != 0)) {
- if ((parseFlags&PackageParser.PARSE_IS_SYSTEM) == 0) {
+ if ((parseFlags&PackageParser.PARSE_IS_SYSTEM_DIR) == 0) {
mLastScanError = PackageManager.INSTALL_FAILED_UPDATE_INCOMPATIBLE;
return null;
}
@@ -2922,7 +2922,10 @@
return null;
}
}
- removeExisting = true;
+ // File a report about this.
+ String msg = "System package " + pkg.packageName
+ + " signature changed; retaining data.";
+ reportSettingsProblem(Log.WARN, msg);
}
// Verify that this new package doesn't have any content providers
@@ -2955,23 +2958,6 @@
final String pkgName = pkg.packageName;
- if (removeExisting) {
- boolean useEncryptedFSDir = useEncryptedFilesystemForPackage(pkg);
- if (mInstaller != null) {
- int ret = mInstaller.remove(pkgName, useEncryptedFSDir);
- if (ret != 0) {
- String msg = "System package " + pkg.packageName
- + " could not have data directory erased after signature change.";
- reportSettingsProblem(Log.WARN, msg);
- mLastScanError = PackageManager.INSTALL_FAILED_REPLACE_COULDNT_DELETE;
- return null;
- }
- }
- Slog.w(TAG, "System package " + pkg.packageName
- + " signature changed: existing data removed.");
- mLastScanError = PackageManager.INSTALL_SUCCEEDED;
- }
-
if (pkg.mAdoptPermissions != null) {
// This package wants to adopt ownership of permissions from
// another package.
@@ -4500,7 +4486,8 @@
if ((event&ADD_EVENTS) != 0) {
if (p == null) {
p = scanPackageLI(fullPath,
- (mIsRom ? PackageParser.PARSE_IS_SYSTEM : 0) |
+ (mIsRom ? PackageParser.PARSE_IS_SYSTEM
+ | PackageParser.PARSE_IS_SYSTEM_DIR: 0) |
PackageParser.PARSE_CHATTY |
PackageParser.PARSE_MUST_BE_APK,
SCAN_MONITOR | SCAN_NO_PATHS);