Merge "Support leaving sharedUserId in PackageManagerService"

This commit is contained in:
John Wu
2021-09-17 21:17:04 +00:00
committed by Android (Google) Code Review
2 changed files with 12 additions and 13 deletions

View File

@@ -28,8 +28,8 @@ import static android.content.pm.PackageManager.INSTALL_FAILED_INTERNAL_ERROR;
import static android.content.pm.PackageManager.INSTALL_FAILED_INVALID_APK;
import static android.content.pm.PackageManager.INSTALL_FAILED_INVALID_INSTALL_LOCATION;
import static android.content.pm.PackageManager.INSTALL_FAILED_SESSION_INVALID;
import static android.content.pm.PackageManager.INSTALL_FAILED_SHARED_USER_INCOMPATIBLE;
import static android.content.pm.PackageManager.INSTALL_FAILED_TEST_ONLY;
import static android.content.pm.PackageManager.INSTALL_FAILED_UID_CHANGED;
import static android.content.pm.PackageManager.INSTALL_FAILED_UPDATE_INCOMPATIBLE;
import static android.content.pm.PackageManager.INSTALL_REASON_DEVICE_RESTORE;
import static android.content.pm.PackageManager.INSTALL_REASON_DEVICE_SETUP;
@@ -1204,19 +1204,17 @@ final class InstallParams extends HandlerParams {
}
// Check for shared user id changes
String invalidPackageName = null;
if (!Objects.equals(oldPackage.getSharedUserId(),
parsedPackage.getSharedUserId())
// Don't mark as invalid if the app is trying to
// leave a sharedUserId
&& parsedPackage.getSharedUserId() != null) {
invalidPackageName = parsedPackage.getPackageName();
}
if (invalidPackageName != null) {
throw new PrepareFailure(INSTALL_FAILED_SHARED_USER_INCOMPATIBLE,
"Package " + invalidPackageName + " tried to change user "
+ oldPackage.getSharedUserId());
throw new PrepareFailure(INSTALL_FAILED_UID_CHANGED,
"Package " + parsedPackage.getPackageName()
+ " shared user changed from "
+ (oldPackage.getSharedUserId() != null
? oldPackage.getSharedUserId() : "<nothing>")
+ " to " + parsedPackage.getSharedUserId());
}
// In case of rollback, remember per-user/profile install state

View File

@@ -20,7 +20,7 @@ import static android.content.pm.PackageManager.COMPONENT_ENABLED_STATE_DEFAULT;
import static android.content.pm.PackageManager.COMPONENT_ENABLED_STATE_DISABLED;
import static android.content.pm.PackageManager.COMPONENT_ENABLED_STATE_ENABLED;
import static android.content.pm.PackageManager.INSTALL_FAILED_INSUFFICIENT_STORAGE;
import static android.content.pm.PackageManager.INSTALL_FAILED_SHARED_USER_INCOMPATIBLE;
import static android.content.pm.PackageManager.INSTALL_FAILED_UID_CHANGED;
import static android.content.pm.PackageManager.MATCH_DEFAULT_ONLY;
import static android.content.pm.PackageManager.UNINSTALL_REASON_UNKNOWN;
import static android.content.pm.PackageManager.UNINSTALL_REASON_USER_TYPE;
@@ -1040,14 +1040,15 @@ public final class Settings implements Watchable, Snappable {
@Nullable Set<String> mimeGroupNames, @NonNull UUID domainSetId)
throws PackageManagerException {
final String pkgName = pkgSetting.name;
if (pkgSetting.sharedUser != sharedUser) {
if (!Objects.equals(pkgSetting.sharedUser, sharedUser) && sharedUser != null) {
PackageManagerService.reportSettingsProblem(Log.WARN,
"Package " + pkgName + " shared user changed from "
+ (pkgSetting.sharedUser != null ? pkgSetting.sharedUser.name : "<nothing>")
+ " to " + (sharedUser != null ? sharedUser.name : "<nothing>"));
throw new PackageManagerException(INSTALL_FAILED_SHARED_USER_INCOMPATIBLE,
+ " to " + sharedUser.name);
throw new PackageManagerException(INSTALL_FAILED_UID_CHANGED,
"Updating application package " + pkgName + " failed");
}
pkgSetting.sharedUser = sharedUser;
if (!pkgSetting.getPath().equals(codePath)) {
final boolean isSystem = pkgSetting.isSystem();