Loading services/core/java/com/android/server/pm/InstallPackageHelper.java +29 −18 Original line number Diff line number Diff line Loading @@ -1801,12 +1801,24 @@ final class InstallPackageHelper { oldPackageState.getRestrictUpdateHash()); } if (oldPackage != null) { // APK should not change its sharedUserId declarations final var oldSharedUid = oldPackage.getSharedUserId() != null ? oldPackage.getSharedUserId() : "<nothing>"; final var newSharedUid = parsedPackage.getSharedUserId() != null final String oldSharedUid; if (mPm.mSettings.getSharedUserSettingLPr(oldPackageState) != null) { oldSharedUid = mPm.mSettings.getSharedUserSettingLPr(oldPackageState).name; } else { oldSharedUid = "<nothing>"; } String newSharedUid = parsedPackage.getSharedUserId() != null ? parsedPackage.getSharedUserId() : "<nothing>"; // If the previously installed app version doesn't have sharedUserSetting, // check that the new apk either doesn't have sharedUserId or it is leaving one. // If it contains sharedUserId but it is also leaving it, it's ok to proceed. if (oldSharedUid.equals("<nothing>")) { if (parsedPackage.isLeavingSharedUser()) { newSharedUid = "<nothing>"; } } if (!oldSharedUid.equals(newSharedUid)) { throw new PrepareFailure(INSTALL_FAILED_UID_CHANGED, "Package " + parsedPackage.getPackageName() Loading @@ -1815,13 +1827,12 @@ final class InstallPackageHelper { } // APK should not re-join shared UID if (oldPackage.isLeavingSharedUser() if (oldPackageState.isLeavingSharedUser() && !parsedPackage.isLeavingSharedUser()) { throw new PrepareFailure(INSTALL_FAILED_UID_CHANGED, "Package " + parsedPackage.getPackageName() + " attempting to rejoin " + newSharedUid); } } // In case of rollback, remember per-user/profile install state installedUsers = ps.queryInstalledUsers(allUsers, true); Loading services/core/java/com/android/server/pm/PackageSetting.java +16 −0 Original line number Diff line number Diff line Loading @@ -98,6 +98,7 @@ public class PackageSetting extends SettingBase implements PackageStateInternal SCANNED_AS_STOPPED_SYSTEM_APP, PENDING_RESTORE, DEBUGGABLE, IS_LEAVING_SHARED_USER, }) public @interface Flags { } Loading @@ -107,6 +108,7 @@ public class PackageSetting extends SettingBase implements PackageStateInternal private static final int SCANNED_AS_STOPPED_SYSTEM_APP = 1 << 3; private static final int PENDING_RESTORE = 1 << 4; private static final int DEBUGGABLE = 1 << 5; private static final int IS_LEAVING_SHARED_USER = 1 << 6; } private int mBooleans; Loading Loading @@ -594,6 +596,20 @@ public class PackageSetting extends SettingBase implements PackageStateInternal return getBoolean(Booleans.DEBUGGABLE); } /** * @see PackageState#isLeavingSharedUser */ public PackageSetting setLeavingSharedUser(boolean value) { setBoolean(Booleans.IS_LEAVING_SHARED_USER, value); onChanged(); return this; } @Override public boolean isLeavingSharedUser() { return getBoolean(Booleans.IS_LEAVING_SHARED_USER); } /** * @see AndroidPackage#getBaseRevisionCode */ Loading services/core/java/com/android/server/pm/ScanPackageUtils.java +1 −0 Original line number Diff line number Diff line Loading @@ -482,6 +482,7 @@ final class ScanPackageUtils { + " to " + volumeUuid); pkgSetting.setVolumeUuid(volumeUuid); } pkgSetting.setLeavingSharedUser(parsedPackage.isLeavingSharedUser()); SharedLibraryInfo sdkLibraryInfo = null; if (!TextUtils.isEmpty(parsedPackage.getSdkLibraryName())) { Loading services/core/java/com/android/server/pm/pkg/PackageState.java +6 −0 Original line number Diff line number Diff line Loading @@ -488,4 +488,10 @@ public interface PackageState { * @hide */ boolean isScannedAsStoppedSystemApp(); /** * see AndroidPackage#isLeavingSharedUser() * @hide */ boolean isLeavingSharedUser(); } Loading
services/core/java/com/android/server/pm/InstallPackageHelper.java +29 −18 Original line number Diff line number Diff line Loading @@ -1801,12 +1801,24 @@ final class InstallPackageHelper { oldPackageState.getRestrictUpdateHash()); } if (oldPackage != null) { // APK should not change its sharedUserId declarations final var oldSharedUid = oldPackage.getSharedUserId() != null ? oldPackage.getSharedUserId() : "<nothing>"; final var newSharedUid = parsedPackage.getSharedUserId() != null final String oldSharedUid; if (mPm.mSettings.getSharedUserSettingLPr(oldPackageState) != null) { oldSharedUid = mPm.mSettings.getSharedUserSettingLPr(oldPackageState).name; } else { oldSharedUid = "<nothing>"; } String newSharedUid = parsedPackage.getSharedUserId() != null ? parsedPackage.getSharedUserId() : "<nothing>"; // If the previously installed app version doesn't have sharedUserSetting, // check that the new apk either doesn't have sharedUserId or it is leaving one. // If it contains sharedUserId but it is also leaving it, it's ok to proceed. if (oldSharedUid.equals("<nothing>")) { if (parsedPackage.isLeavingSharedUser()) { newSharedUid = "<nothing>"; } } if (!oldSharedUid.equals(newSharedUid)) { throw new PrepareFailure(INSTALL_FAILED_UID_CHANGED, "Package " + parsedPackage.getPackageName() Loading @@ -1815,13 +1827,12 @@ final class InstallPackageHelper { } // APK should not re-join shared UID if (oldPackage.isLeavingSharedUser() if (oldPackageState.isLeavingSharedUser() && !parsedPackage.isLeavingSharedUser()) { throw new PrepareFailure(INSTALL_FAILED_UID_CHANGED, "Package " + parsedPackage.getPackageName() + " attempting to rejoin " + newSharedUid); } } // In case of rollback, remember per-user/profile install state installedUsers = ps.queryInstalledUsers(allUsers, true); Loading
services/core/java/com/android/server/pm/PackageSetting.java +16 −0 Original line number Diff line number Diff line Loading @@ -98,6 +98,7 @@ public class PackageSetting extends SettingBase implements PackageStateInternal SCANNED_AS_STOPPED_SYSTEM_APP, PENDING_RESTORE, DEBUGGABLE, IS_LEAVING_SHARED_USER, }) public @interface Flags { } Loading @@ -107,6 +108,7 @@ public class PackageSetting extends SettingBase implements PackageStateInternal private static final int SCANNED_AS_STOPPED_SYSTEM_APP = 1 << 3; private static final int PENDING_RESTORE = 1 << 4; private static final int DEBUGGABLE = 1 << 5; private static final int IS_LEAVING_SHARED_USER = 1 << 6; } private int mBooleans; Loading Loading @@ -594,6 +596,20 @@ public class PackageSetting extends SettingBase implements PackageStateInternal return getBoolean(Booleans.DEBUGGABLE); } /** * @see PackageState#isLeavingSharedUser */ public PackageSetting setLeavingSharedUser(boolean value) { setBoolean(Booleans.IS_LEAVING_SHARED_USER, value); onChanged(); return this; } @Override public boolean isLeavingSharedUser() { return getBoolean(Booleans.IS_LEAVING_SHARED_USER); } /** * @see AndroidPackage#getBaseRevisionCode */ Loading
services/core/java/com/android/server/pm/ScanPackageUtils.java +1 −0 Original line number Diff line number Diff line Loading @@ -482,6 +482,7 @@ final class ScanPackageUtils { + " to " + volumeUuid); pkgSetting.setVolumeUuid(volumeUuid); } pkgSetting.setLeavingSharedUser(parsedPackage.isLeavingSharedUser()); SharedLibraryInfo sdkLibraryInfo = null; if (!TextUtils.isEmpty(parsedPackage.getSdkLibraryName())) { Loading
services/core/java/com/android/server/pm/pkg/PackageState.java +6 −0 Original line number Diff line number Diff line Loading @@ -488,4 +488,10 @@ public interface PackageState { * @hide */ boolean isScannedAsStoppedSystemApp(); /** * see AndroidPackage#isLeavingSharedUser() * @hide */ boolean isLeavingSharedUser(); }