diff options
author | Christopher Tate <ctate@google.com> | 2013-11-14 22:59:20 +0000 |
---|---|---|
committer | Android (Google) Code Review <android-gerrit@google.com> | 2013-11-14 22:59:20 +0000 |
commit | 99437f252b728f4946940f232c4b73b9dda76cfb (patch) | |
tree | 16fc09f101e0dfa8da5d792f1bc756b43b207a34 /services/java/com/android | |
parent | 2e3ede74978d14f7bd853c3228864280d99a438e (diff) | |
parent | ba629da331d01d74067afdda5d4255682d4b24d7 (diff) | |
download | frameworks_base-99437f252b728f4946940f232c4b73b9dda76cfb.zip frameworks_base-99437f252b728f4946940f232c4b73b9dda76cfb.tar.gz frameworks_base-99437f252b728f4946940f232c4b73b9dda76cfb.tar.bz2 |
Merge "Ensure recipient can be launched before attempting broadcast delivery" into klp-dev
Diffstat (limited to 'services/java/com/android')
-rw-r--r-- | services/java/com/android/server/am/BroadcastQueue.java | 21 | ||||
-rwxr-xr-x | services/java/com/android/server/pm/PackageManagerService.java | 18 |
2 files changed, 39 insertions, 0 deletions
diff --git a/services/java/com/android/server/am/BroadcastQueue.java b/services/java/com/android/server/am/BroadcastQueue.java index dd3d8aa..bfb667f 100644 --- a/services/java/com/android/server/am/BroadcastQueue.java +++ b/services/java/com/android/server/am/BroadcastQueue.java @@ -27,6 +27,7 @@ import android.content.ComponentName; import android.content.IIntentReceiver; import android.content.Intent; import android.content.pm.ActivityInfo; +import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import android.content.pm.ResolveInfo; import android.os.Bundle; @@ -814,6 +815,26 @@ public final class BroadcastQueue { + " to " + r.curApp + ": process crashing"); skip = true; } + if (!skip) { + boolean isAvailable = false; + try { + isAvailable = AppGlobals.getPackageManager().isPackageAvailable( + info.activityInfo.packageName, + UserHandle.getUserId(info.activityInfo.applicationInfo.uid)); + } catch (Exception e) { + // all such failures mean we skip this receiver + Slog.w(TAG, "Exception getting recipient info for " + + info.activityInfo.packageName, e); + } + if (!isAvailable) { + if (DEBUG_BROADCAST) { + Slog.v(TAG, "Skipping delivery to " + info.activityInfo.packageName + + " / " + info.activityInfo.applicationInfo.uid + + " : package no longer available"); + } + skip = true; + } + } if (skip) { if (DEBUG_BROADCAST) Slog.v(TAG, diff --git a/services/java/com/android/server/pm/PackageManagerService.java b/services/java/com/android/server/pm/PackageManagerService.java index 7ae9251..24f8ed8 100755 --- a/services/java/com/android/server/pm/PackageManagerService.java +++ b/services/java/com/android/server/pm/PackageManagerService.java @@ -1771,6 +1771,24 @@ public class PackageManagerService extends IPackageManager.Stub { state, userId); } + public boolean isPackageAvailable(String packageName, int userId) { + if (!sUserManager.exists(userId)) return false; + enforceCrossUserPermission(Binder.getCallingUid(), userId, false, "is package available"); + synchronized (mPackages) { + PackageParser.Package p = mPackages.get(packageName); + if (p != null) { + final PackageSetting ps = (PackageSetting) p.mExtras; + if (ps != null) { + final PackageUserState state = ps.readUserState(userId); + if (state != null) { + return PackageParser.isAvailable(state); + } + } + } + } + return false; + } + @Override public PackageInfo getPackageInfo(String packageName, int flags, int userId) { if (!sUserManager.exists(userId)) return null; |