diff options
| author | 2024-01-17 18:28:44 -0800 | |
|---|---|---|
| committer | 2024-01-17 18:30:38 -0800 | |
| commit | 209c5b8b9d11df8cc7d4289cce40830a430795a3 (patch) | |
| tree | 65e69a6437a880ba18eb2938e67d924187b22e85 | |
| parent | f8a667575a3c73888c446485187b675e04bdedb3 (diff) | |
[pm] do not send UID_REMOVED broadcast if shared uid still exists
Fixing a regression from ag/25622404. When the UID is still shared with
other apps, don't send UID_REMOVED broadcast when an app is removed.
BUG: 320657384
Test: atest
android.content.pm.cts.PackageManagerTest#testUidRemovedBroadcastNotReceivedForSharedUid
Change-Id: Ie2d91fa7e85063b2cd929c9d62928d96f7902fe4
| -rw-r--r-- | services/core/java/com/android/server/pm/RemovePackageHelper.java | 3 | ||||
| -rw-r--r-- | services/core/java/com/android/server/pm/Settings.java | 19 |
2 files changed, 13 insertions, 9 deletions
diff --git a/services/core/java/com/android/server/pm/RemovePackageHelper.java b/services/core/java/com/android/server/pm/RemovePackageHelper.java index 7bd6a43969ba..01b25df1cee2 100644 --- a/services/core/java/com/android/server/pm/RemovePackageHelper.java +++ b/services/core/java/com/android/server/pm/RemovePackageHelper.java @@ -394,8 +394,7 @@ final class RemovePackageHelper { // Delete from mSettings final SparseBooleanArray changedUsers = new SparseBooleanArray(); synchronized (mPm.mLock) { - mPm.mSettings.removePackageLPw(packageName); - outInfo.mIsAppIdRemoved = true; + outInfo.mIsAppIdRemoved = mPm.mSettings.removePackageAndAppIdLPw(packageName); if (!mPm.mSettings.isDisabledSystemPackageLPr(packageName)) { final SharedUserSetting sus = mPm.mSettings.getSharedUserSettingLPr(deletedPs); // If we don't have a disabled system package to reinstall, the package is diff --git a/services/core/java/com/android/server/pm/Settings.java b/services/core/java/com/android/server/pm/Settings.java index b286b12dcf7d..a97652c8e167 100644 --- a/services/core/java/com/android/server/pm/Settings.java +++ b/services/core/java/com/android/server/pm/Settings.java @@ -92,7 +92,6 @@ import android.util.proto.ProtoOutputStream; import com.android.internal.annotations.GuardedBy; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.os.BackgroundThread; -import com.android.internal.pm.parsing.pkg.PackageImpl; import com.android.internal.pm.pkg.component.ParsedComponent; import com.android.internal.pm.pkg.component.ParsedIntentInfo; import com.android.internal.pm.pkg.component.ParsedPermission; @@ -1460,22 +1459,28 @@ public final class Settings implements Watchable, Snappable, ResilientAtomicFile return false; } - int removePackageLPw(String name) { + + /** + * Remove package from mPackages and its corresponding AppId. + * + * @return True if the AppId has been removed. + * False if the app doesn't exist, or if the app has a shared UID and there are other apps that + * still use the same shared UID even after the target app is removed. + */ + boolean removePackageAndAppIdLPw(String name) { final PackageSetting p = mPackages.remove(name); if (p != null) { removeInstallerPackageStatus(name); SharedUserSetting sharedUserSetting = getSharedUserSettingLPr(p); if (sharedUserSetting != null) { sharedUserSetting.removePackage(p); - if (checkAndPruneSharedUserLPw(sharedUserSetting, false)) { - return sharedUserSetting.mAppId; - } + return checkAndPruneSharedUserLPw(sharedUserSetting, false); } else { removeAppIdLPw(p.getAppId()); - return p.getAppId(); + return true; } } - return -1; + return false; } /** |