[pm/incremental] handle package setting nullptr
Due to asynchronous, when a package state change propagates to
package manager service, the package might have been removed already.
Test: atest android.content.pm.cts.PackageManagerShellCommandTest
BUG: 170199764
Change-Id: Iceee3ada587675091488299e769d2894b183ef84
diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java
index 0f9a5cc..7b7fe74 100644
--- a/services/core/java/com/android/server/pm/PackageManagerService.java
+++ b/services/core/java/com/android/server/pm/PackageManagerService.java
@@ -17322,11 +17322,14 @@
mIncrementalManager.unregisterCallback(mPathString, this);
final SparseArray<int[]> newBroadcastAllowList;
synchronized (mLock) {
+ final PackageSetting ps = mSettings.mPackages.get(mPackageName);
+ if (ps == null) {
+ return;
+ }
newBroadcastAllowList = mAppsFilter.getVisibilityAllowList(
- getPackageSettingInternal(mPackageName, Process.SYSTEM_UID),
- mInstalledUserIds, mSettings.mPackages);
+ ps, mInstalledUserIds, mSettings.mPackages);
}
- Bundle extras = new Bundle(1);
+ Bundle extras = new Bundle();
extras.putInt(Intent.EXTRA_UID, mUserId);
extras.putString(Intent.EXTRA_PACKAGE_NAME, mPackageName);
sendPackageBroadcast(Intent.ACTION_PACKAGE_FULLY_LOADED, mPackageName,
@@ -17339,11 +17342,14 @@
public void onPackageUnstartable(int reason) {
final SparseArray<int[]> newBroadcastAllowList;
synchronized (mLock) {
+ final PackageSetting ps = mSettings.mPackages.get(mPackageName);
+ if (ps == null) {
+ return;
+ }
newBroadcastAllowList = mAppsFilter.getVisibilityAllowList(
- getPackageSettingInternal(mPackageName, Process.SYSTEM_UID),
- mInstalledUserIds, mSettings.mPackages);
+ ps, mInstalledUserIds, mSettings.mPackages);
}
- Bundle extras = new Bundle(1);
+ Bundle extras = new Bundle();
extras.putInt(Intent.EXTRA_UID, mUserId);
extras.putString(Intent.EXTRA_PACKAGE_NAME, mPackageName);
extras.putInt(Intent.EXTRA_REASON, reason);
@@ -17358,11 +17364,14 @@
public void onPackageStartable() {
final SparseArray<int[]> newBroadcastAllowList;
synchronized (mLock) {
+ final PackageSetting ps = mSettings.mPackages.get(mPackageName);
+ if (ps == null) {
+ return;
+ }
newBroadcastAllowList = mAppsFilter.getVisibilityAllowList(
- getPackageSettingInternal(mPackageName, Process.SYSTEM_UID),
- mInstalledUserIds, mSettings.mPackages);
+ ps, mInstalledUserIds, mSettings.mPackages);
}
- Bundle extras = new Bundle(1);
+ Bundle extras = new Bundle();
extras.putInt(Intent.EXTRA_UID, mUserId);
extras.putString(Intent.EXTRA_PACKAGE_NAME, mPackageName);
// send broadcast to users with this app installed