diff --git a/services/core/java/com/android/server/pm/ScanPackageUtils.java b/services/core/java/com/android/server/pm/ScanPackageUtils.java index 0dc188b75d5e9..46f0dbcdfe10d 100644 --- a/services/core/java/com/android/server/pm/ScanPackageUtils.java +++ b/services/core/java/com/android/server/pm/ScanPackageUtils.java @@ -427,8 +427,7 @@ final class ScanPackageUtils { pkgSetting.setLastModifiedTime(scanFileTime); // TODO(b/135203078): Remove, move to constructor pkgSetting.setPkg(parsedPackage) - .setFlags(PackageInfoUtils.appInfoFlags(parsedPackage, pkgSetting)) - .setPrivateFlags( + .setPkgFlags(PackageInfoUtils.appInfoFlags(parsedPackage, pkgSetting), PackageInfoUtils.appInfoPrivateFlags(parsedPackage, pkgSetting)); if (parsedPackage.getLongVersionCode() != pkgSetting.getVersionCode()) { pkgSetting.setLongVersionCode(parsedPackage.getLongVersionCode()); diff --git a/services/core/java/com/android/server/pm/SettingBase.java b/services/core/java/com/android/server/pm/SettingBase.java index b952f80850bbc..61a251e19db79 100644 --- a/services/core/java/com/android/server/pm/SettingBase.java +++ b/services/core/java/com/android/server/pm/SettingBase.java @@ -146,6 +146,17 @@ public abstract class SettingBase implements Watchable, Snappable { return this; } + /** + * Unconditionally set both mPkgFlags and mPkgPrivateFlags. + * Should not be used outside pkgSetting initialization or update. + */ + SettingBase setPkgFlags(int flags, int privateFlags) { + this.mPkgFlags = flags; + this.mPkgPrivateFlags = privateFlags; + onChanged(); + return this; + } + public int getFlags() { return mPkgFlags; } diff --git a/services/core/java/com/android/server/pm/Settings.java b/services/core/java/com/android/server/pm/Settings.java index 6400502f1a89d..7437b145189f4 100644 --- a/services/core/java/com/android/server/pm/Settings.java +++ b/services/core/java/com/android/server/pm/Settings.java @@ -987,8 +987,7 @@ public final class Settings implements Watchable, Snappable { // Update new package state. .setLastModifiedTime(codePath.lastModified()) .setDomainSetId(domainSetId); - pkgSetting.setFlags(pkgFlags) - .setPrivateFlags(pkgPrivateFlags); + pkgSetting.setPkgFlags(pkgFlags, pkgPrivateFlags); } else { pkgSetting = new PackageSetting(pkgName, realPkgName, codePath, legacyNativeLibraryPath, primaryCpuAbi, secondaryCpuAbi, @@ -1175,15 +1174,15 @@ public final class Settings implements Watchable, Snappable { .setUsesStaticLibrariesVersions(null); } - // These two flags are preserved from the existing PackageSetting. Copied from prior code, - // unclear if this is actually necessary. - boolean wasExternalStorage = (pkgSetting.getFlags() - & ApplicationInfo.FLAG_EXTERNAL_STORAGE) != 0; - if (wasExternalStorage) { - pkgFlags |= ApplicationInfo.FLAG_EXTERNAL_STORAGE; - } else { - pkgFlags &= ~ApplicationInfo.FLAG_EXTERNAL_STORAGE; - } + // If what we are scanning is a system (and possibly privileged) package, + // then make it so, regardless of whether it was previously installed only + // in the data partition. Reset first. + int newPkgFlags = pkgSetting.getFlags(); + newPkgFlags &= ~ApplicationInfo.FLAG_SYSTEM; + newPkgFlags |= pkgFlags & ApplicationInfo.FLAG_SYSTEM; + // Only set pkgFlags. + pkgSetting.setPkgFlags(newPkgFlags, pkgSetting.getPrivateFlags()); + boolean wasRequiredForSystemUser = (pkgSetting.getPrivateFlags() & ApplicationInfo.PRIVATE_FLAG_REQUIRED_FOR_SYSTEM_USER) != 0; if (wasRequiredForSystemUser) { @@ -1191,9 +1190,7 @@ public final class Settings implements Watchable, Snappable { } else { pkgPrivateFlags &= ~ApplicationInfo.PRIVATE_FLAG_REQUIRED_FOR_SYSTEM_USER; } - - pkgSetting.setFlags(pkgFlags) - .setPrivateFlags(pkgPrivateFlags); + pkgSetting.setPrivateFlags(pkgPrivateFlags); } /**