summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Songchun Fan <schfan@google.com> 2024-01-17 18:28:44 -0800
committer Songchun Fan <schfan@google.com> 2024-01-17 18:30:38 -0800
commit209c5b8b9d11df8cc7d4289cce40830a430795a3 (patch)
tree65e69a6437a880ba18eb2938e67d924187b22e85
parentf8a667575a3c73888c446485187b675e04bdedb3 (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.java3
-rw-r--r--services/core/java/com/android/server/pm/Settings.java19
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;
}
/**