diff options
| author | 2015-11-11 13:24:11 -0800 | |
|---|---|---|
| committer | 2015-11-11 13:24:11 -0800 | |
| commit | f36003f620ba5fcb3a30dcdf77adb262b10866ee (patch) | |
| tree | 6297df3ae929aa439f507f9609231809f644f3be | |
| parent | 609b5b8c8e22ab0ea1caca1fed42cdf891c853c6 (diff) | |
Don't send PACKAGE_CHANGED of components to manifest receivers.
To reduce broadcast spam, when we send a PACKAGE_CHANGE filter that
to only go to registered receivers if it is reporting a change in
components of a package (not a change in the overall package). There
should be no reason for apps to launch if component states change
(they can always query the next time they run), and since apps can
change their component state as needed and don't think of this as
an especially expensive operation, we don't want that to result in
a lot of other apps launching.
Change-Id: I5fd005c4ff838b6eade767cf87a928e906f4de63
| -rw-r--r-- | services/core/java/com/android/server/pm/PackageManagerService.java | 37 | ||||
| -rw-r--r-- | services/core/java/com/android/server/pm/Settings.java | 2 |
2 files changed, 22 insertions, 17 deletions
diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index d7664abe6090..9f0475877e2d 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -1415,18 +1415,18 @@ public class PackageManagerService extends IPackageManager.Stub { } } sendPackageBroadcast(Intent.ACTION_PACKAGE_ADDED, - packageName, extras, null, null, firstUsers); + packageName, extras, 0, null, null, firstUsers); final boolean update = res.removedInfo.removedPackage != null; if (update) { extras.putBoolean(Intent.EXTRA_REPLACING, true); } sendPackageBroadcast(Intent.ACTION_PACKAGE_ADDED, - packageName, extras, null, null, updateUsers); + packageName, extras, 0, null, null, updateUsers); if (update) { sendPackageBroadcast(Intent.ACTION_PACKAGE_REPLACED, - packageName, extras, null, null, updateUsers); + packageName, extras, 0, null, null, updateUsers); sendPackageBroadcast(Intent.ACTION_MY_PACKAGE_REPLACED, - null, null, packageName, null, updateUsers); + null, null, 0, packageName, null, updateUsers); // treat asec-hosted packages like removable media on upgrade if (res.pkg.isForwardLocked() || isExternal(res.pkg)) { @@ -9577,8 +9577,8 @@ public class PackageManagerService extends IPackageManager.Stub { } }; - final void sendPackageBroadcast(final String action, final String pkg, - final Bundle extras, final String targetPkg, final IIntentReceiver finishedReceiver, + final void sendPackageBroadcast(final String action, final String pkg, final Bundle extras, + final int flags, final String targetPkg, final IIntentReceiver finishedReceiver, final int[] userIds) { mHandler.post(new Runnable() { @Override @@ -9608,7 +9608,7 @@ public class PackageManagerService extends IPackageManager.Stub { intent.putExtra(Intent.EXTRA_UID, uid); } intent.putExtra(Intent.EXTRA_USER_HANDLE, id); - intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY_BEFORE_BOOT); + intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY_BEFORE_BOOT | flags); if (DEBUG_BROADCASTS) { RuntimeException here = new RuntimeException("here"); here.fillInStackTrace(); @@ -9800,7 +9800,7 @@ public class PackageManagerService extends IPackageManager.Stub { extras.putInt(Intent.EXTRA_UID, UserHandle.getUid(userId, pkgSetting.appId)); sendPackageBroadcast(Intent.ACTION_PACKAGE_ADDED, - packageName, extras, null, null, new int[] {userId}); + packageName, extras, 0, null, null, new int[] {userId}); try { IActivityManager am = ActivityManagerNative.getDefault(); final boolean isSystem = @@ -13117,11 +13117,11 @@ public class PackageManagerService extends IPackageManager.Stub { extras.putBoolean(Intent.EXTRA_REPLACING, true); sendPackageBroadcast(Intent.ACTION_PACKAGE_ADDED, packageName, - extras, null, null, null); + extras, 0, null, null, null); sendPackageBroadcast(Intent.ACTION_PACKAGE_REPLACED, packageName, - extras, null, null, null); + extras, 0, null, null, null); sendPackageBroadcast(Intent.ACTION_MY_PACKAGE_REPLACED, null, - null, packageName, null, null); + null, 0, packageName, null, null); } } // Force a gc here. @@ -13156,14 +13156,14 @@ public class PackageManagerService extends IPackageManager.Stub { extras.putBoolean(Intent.EXTRA_REMOVED_FOR_ALL_USERS, removedForAllUsers); if (removedPackage != null) { sendPackageBroadcast(Intent.ACTION_PACKAGE_REMOVED, removedPackage, - extras, null, null, removedUsers); + extras, 0, null, null, removedUsers); if (fullRemove && !replacing) { sendPackageBroadcast(Intent.ACTION_PACKAGE_FULLY_REMOVED, removedPackage, - extras, null, null, removedUsers); + extras, 0, null, null, removedUsers); } } if (removedAppId >= 0) { - sendPackageBroadcast(Intent.ACTION_UID_REMOVED, null, extras, null, null, + sendPackageBroadcast(Intent.ACTION_UID_REMOVED, null, extras, 0, null, null, removedUsers); } } @@ -14863,7 +14863,12 @@ public class PackageManagerService extends IPackageManager.Stub { extras.putStringArray(Intent.EXTRA_CHANGED_COMPONENT_NAME_LIST, nameList); extras.putBoolean(Intent.EXTRA_DONT_KILL_APP, killFlag); extras.putInt(Intent.EXTRA_UID, packageUid); - sendPackageBroadcast(Intent.ACTION_PACKAGE_CHANGED, packageName, extras, null, null, + // If this is not reporting a change of the overall package, then only send it + // to registered receivers. We don't want to launch a swath of apps for every + // little component state change. + final int flags = !componentNames.contains(packageName) + ? Intent.FLAG_RECEIVER_REGISTERED_ONLY : 0; + sendPackageBroadcast(Intent.ACTION_PACKAGE_CHANGED, packageName, extras, flags, null, null, new int[] {UserHandle.getUserId(packageUid)}); } @@ -15861,7 +15866,7 @@ public class PackageManagerService extends IPackageManager.Stub { } String action = mediaStatus ? Intent.ACTION_EXTERNAL_APPLICATIONS_AVAILABLE : Intent.ACTION_EXTERNAL_APPLICATIONS_UNAVAILABLE; - sendPackageBroadcast(action, null, extras, null, finishedReceiver, null); + sendPackageBroadcast(action, null, extras, 0, null, finishedReceiver, null); } } diff --git a/services/core/java/com/android/server/pm/Settings.java b/services/core/java/com/android/server/pm/Settings.java index de1473943203..1d299d74b2db 100644 --- a/services/core/java/com/android/server/pm/Settings.java +++ b/services/core/java/com/android/server/pm/Settings.java @@ -3861,7 +3861,7 @@ final class Settings { if (pkgSetting.getNotLaunched(userId)) { if (pkgSetting.installerPackageName != null) { yucky.sendPackageBroadcast(Intent.ACTION_PACKAGE_FIRST_LAUNCH, - pkgSetting.name, null, + pkgSetting.name, null, 0, pkgSetting.installerPackageName, null, new int[] {userId}); } pkgSetting.setNotLaunched(false, userId); |