[RESTRICT AUTOMERGE][pm] prevent system app downgrades of versions lower than preload

Also remove misleading commandline output.

BUG: 256202273

Test: manual
1. Install preload system app v90, reboot
2. (W/O data, W/ Flag, 90->80 NOK) adb install -d ~/Downloads/PrivApplication_80.apk
Performing Streamed Install
adb: failed to install /usr/local/google/home/schfan/Downloads/PrivApplication_80.apk: Failure [INSTALL_FAILED_VERSION_DOWNGRADE: System app: com.example.privapplication cannot be downgraded to older than its preloaded version on the system image. Update version code 80 is older than current 90]
3. (90->100) Install data app v100
4. (W/ data, W/O Flag, 100->90 NOK) adb install ~/Downloads/PrivApplication_90.apk
Performing Streamed Install
adb: failed to install /usr/local/google/home/schfan/Downloads/PrivApplication_90.apk: Failure [INSTALL_FAILED_VERSION_DOWNGRADE: Downgrade detected: Update version code 90 is older than current 100]
5. (W/ data, W/ Flag, 100->90 downgrade OK) adb install -d ~/Downloads/PrivApplication_90.apk
Performing Streamed Install
Success
6. (90->100) Install v100
6. (W/data, W/ Flag, 100->80 NOK) adb install -d ~/Downloads/PrivApplication_80.apk
Performing Streamed Install
adb: failed to install /usr/local/google/home/schfan/Downloads/PrivApplication_80.apk: Failure [INSTALL_FAILED_VERSION_DOWNGRADE: System app: com.example.privapplication cannot be downgraded to older than its preloaded version on the system image. Update version code 80 is older than current 90]

Change-Id: I5a8ee9e29a3a58f6e3fd188e0122355744b8b0ce
(cherry picked from commit a4484d7f1b)
This commit is contained in:
Songchun Fan
2023-01-26 17:43:24 -08:00
committed by Song Chun Fan
parent 62c12ffd8e
commit aec76152d6

View File

@@ -14960,10 +14960,10 @@ public class PackageManagerService extends IPackageManager.Stub
// will be null whereas dataOwnerPkg will contain information about the package // will be null whereas dataOwnerPkg will contain information about the package
// which was uninstalled while keeping its data. // which was uninstalled while keeping its data.
AndroidPackage dataOwnerPkg = installedPkg; AndroidPackage dataOwnerPkg = installedPkg;
PackageSetting dataOwnerPs = mSettings.mPackages.get(packageName);
if (dataOwnerPkg == null) { if (dataOwnerPkg == null) {
PackageSetting ps = mSettings.mPackages.get(packageName); if (dataOwnerPs != null) {
if (ps != null) { dataOwnerPkg = dataOwnerPs.pkg;
dataOwnerPkg = ps.pkg;
} }
} }
@@ -14987,12 +14987,32 @@ public class PackageManagerService extends IPackageManager.Stub
if (dataOwnerPkg != null) { if (dataOwnerPkg != null) {
if (!PackageManagerServiceUtils.isDowngradePermitted(installFlags, if (!PackageManagerServiceUtils.isDowngradePermitted(installFlags,
dataOwnerPkg.isDebuggable())) { dataOwnerPkg.isDebuggable())) {
// Downgrade is not permitted; a lower version of the app will not be
// allowed
try { try {
checkDowngrade(dataOwnerPkg, pkgLite); checkDowngrade(dataOwnerPkg, pkgLite);
} catch (PackageManagerException e) { } catch (PackageManagerException e) {
Slog.w(TAG, "Downgrade detected: " + e.getMessage()); Slog.w(TAG, "Downgrade detected: " + e.getMessage());
return PackageHelper.RECOMMEND_FAILED_VERSION_DOWNGRADE; return PackageHelper.RECOMMEND_FAILED_VERSION_DOWNGRADE;
} }
} else if (dataOwnerPs.isSystem()) {
// Downgrade is permitted, but system apps can't be downgraded below
// the version preloaded onto the system image
final PackageSetting disabledPs = mSettings.getDisabledSystemPkgLPr(
dataOwnerPs);
if (disabledPs != null) {
dataOwnerPkg = disabledPs.pkg;
}
try {
checkDowngrade(dataOwnerPkg, pkgLite);
} catch (PackageManagerException e) {
String errorMsg = "System app: " + packageName
+ " cannot be downgraded to"
+ " older than its preloaded version on the system image. "
+ e.getMessage();
Slog.w(TAG, errorMsg);
return PackageHelper.RECOMMEND_FAILED_VERSION_DOWNGRADE;
}
} }
} }