From b1e7776e2ca348ad734fdddc68d9bda6eb17c5e0 Mon Sep 17 00:00:00 2001 From: Dianne Hackborn Date: Mon, 13 Feb 2017 11:42:18 -0800 Subject: [PATCH] Fix issue #35309312: Background start not allowed: service... ...Intent { flg=0x100 cmp=com.android.systemui/.SystemUIService } to com.android.systemui/.SystemUIService from pid=28245 uid=1000 pkg=android Rework the persistent app check to just directly look at the package manager (but as efficiently as possible). My idea for trying to keep this in the UidRecord was stupid. :p Test: manually tested it boots Change-Id: I5a88717a27fa3529048d37a853518a3ec04055db --- .../android/content/pm/PackageManagerInternal.java | 5 +++++ .../android/server/am/ActivityManagerService.java | 9 ++++----- .../core/java/com/android/server/am/UidRecord.java | 4 +--- .../com/android/server/pm/PackageManagerService.java | 12 ++++++++++++ 4 files changed, 22 insertions(+), 8 deletions(-) diff --git a/core/java/android/content/pm/PackageManagerInternal.java b/core/java/android/content/pm/PackageManagerInternal.java index e4e0a195cb8dc..7d59bd6194988 100644 --- a/core/java/android/content/pm/PackageManagerInternal.java +++ b/core/java/android/content/pm/PackageManagerInternal.java @@ -274,6 +274,11 @@ public abstract class PackageManagerInternal { public abstract void setExternalSourcesPolicy(ExternalSourcesPolicy policy); + /** + * Return true if the given package is a persistent app process. + */ + public abstract boolean isPackagePersistent(String packageName); + /** * Get all overlay packages for a user. * @param userId The user for which to get the overlays. diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java index a4a4e6271bb64..79dc10305f071 100644 --- a/services/core/java/com/android/server/am/ActivityManagerService.java +++ b/services/core/java/com/android/server/am/ActivityManagerService.java @@ -4227,7 +4227,7 @@ public class ActivityManagerService extends IActivityManager.Stub validateUid = mValidateUids.get(item.uid); if (validateUid == null && change != UidRecord.CHANGE_GONE && change != UidRecord.CHANGE_GONE_IDLE) { - validateUid = new UidRecord(item.uid, false); + validateUid = new UidRecord(item.uid); mValidateUids.put(item.uid, validateUid); } } @@ -6316,7 +6316,7 @@ public class ActivityManagerService extends IActivityManager.Stub } UidRecord uidRec = mActiveUids.get(proc.uid); if (uidRec == null) { - uidRec = new UidRecord(proc.uid, proc.persistent); + uidRec = new UidRecord(proc.uid); // This is the first appearance of the uid, report it now! if (DEBUG_UID_OBSERVERS) Slog.i(TAG_UID_OBSERVERS, "Creating new process uid: " + uidRec); @@ -8115,9 +8115,8 @@ public class ActivityManagerService extends IActivityManager.Stub // some other background operations are not. If we're doing a check // of service-launch policy, allow those callers to proceed unrestricted. int appServicesRestrictedInBackgroundLocked(int uid, String packageName, int packageTargetSdk) { - // Persistent app? NB: expects that persistent uids are always active. - final UidRecord appIdRec = mActiveUids.get(UserHandle.getAppId(uid)); - if (appIdRec != null && appIdRec.persistent) { + // Persistent app? + if (mPackageManagerInt.isPackagePersistent(packageName)) { if (DEBUG_BACKGROUND_CHECK) { Slog.i(TAG, "App " + uid + "/" + packageName + " is persistent; not restricted in background"); diff --git a/services/core/java/com/android/server/am/UidRecord.java b/services/core/java/com/android/server/am/UidRecord.java index 64e34174d1c30..302f628edc44c 100644 --- a/services/core/java/com/android/server/am/UidRecord.java +++ b/services/core/java/com/android/server/am/UidRecord.java @@ -26,7 +26,6 @@ import android.util.TimeUtils; */ public final class UidRecord { final int uid; - final boolean persistent; int curProcState; int setProcState = ActivityManager.PROCESS_STATE_NONEXISTENT; long lastBackgroundTime; @@ -52,9 +51,8 @@ public final class UidRecord { ChangeItem pendingChange; - public UidRecord(int _uid, boolean _persist) { + public UidRecord(int _uid) { uid = _uid; - persistent = _persist; reset(); } diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index 834549111964c..ebd0b343f9cf1 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -22790,6 +22790,18 @@ Slog.v(TAG, ":: stepped forward, applying functor at tag " + parser.getName()); } } + @Override + public boolean isPackagePersistent(String packageName) { + synchronized (mPackages) { + PackageParser.Package pkg = mPackages.get(packageName); + return pkg != null + ? ((pkg.applicationInfo.flags&(ApplicationInfo.FLAG_SYSTEM + | ApplicationInfo.FLAG_PERSISTENT)) == + (ApplicationInfo.FLAG_SYSTEM | ApplicationInfo.FLAG_PERSISTENT)) + : false; + } + } + @Override public List getOverlayPackages(int userId) { final ArrayList overlayPackages = new ArrayList();