Loading services/core/java/com/android/server/pm/BroadcastHelper.java +42 −4 Original line number Diff line number Diff line Loading @@ -53,6 +53,7 @@ import android.os.Handler; import android.os.PowerExemptionManager; import android.os.Process; import android.os.RemoteException; import android.os.Trace; import android.os.UserHandle; import android.os.storage.StorageManager; import android.os.storage.VolumeInfo; Loading Loading @@ -358,9 +359,14 @@ public final class BroadcastHelper { @Nullable int[] instantUserIds, @Nullable SparseArray<int[]> broadcastAllowList, @NonNull AndroidPackage pkg, @NonNull String[] sharedUidPackages) { @NonNull String[] sharedUidPackages, @NonNull String reasonForTrace) { final boolean isForWholeApp = componentNames.contains(packageName); if (isForWholeApp || !android.content.pm.Flags.reduceBroadcastsForComponentStateChanges()) { tracePackageChangedBroadcastEvent( android.content.pm.Flags.reduceBroadcastsForComponentStateChanges(), reasonForTrace, "all" /* targetName */, "whole" /* targetComponent */, componentNames.size()); sendPackageChangedBroadcastWithPermissions(packageName, dontKillApp, componentNames, packageUid, reason, userIds, instantUserIds, broadcastAllowList, null /* targetPackageName */, null /* requiredPermissions */); Loading @@ -382,6 +388,9 @@ public final class BroadcastHelper { // First, send the PACKAGE_CHANGED broadcast to the system. if (!TextUtils.equals(packageName, "android")) { tracePackageChangedBroadcastEvent(true /* applyFlag */, reasonForTrace, "system" /* targetName */, "notExported" /* targetComponent */, notExportedComponentNames.size()); sendPackageChangedBroadcastWithPermissions(packageName, dontKillApp, notExportedComponentNames, packageUid, reason, userIds, instantUserIds, broadcastAllowList, "android" /* targetPackageName */, Loading @@ -390,6 +399,9 @@ public final class BroadcastHelper { } // Second, send the PACKAGE_CHANGED broadcast to the application itself. tracePackageChangedBroadcastEvent(true /* applyFlag */, reasonForTrace, "applicationItself" /* targetName */, "notExported" /* targetComponent */, notExportedComponentNames.size()); sendPackageChangedBroadcastWithPermissions(packageName, dontKillApp, notExportedComponentNames, packageUid, reason, userIds, instantUserIds, broadcastAllowList, packageName /* targetPackageName */, Loading @@ -401,6 +413,9 @@ public final class BroadcastHelper { if (TextUtils.equals(packageName, sharedPackage)) { continue; } tracePackageChangedBroadcastEvent(true /* applyFlag */, reasonForTrace, "sharedUidPackages" /* targetName */, "notExported" /* targetComponent */, notExportedComponentNames.size()); sendPackageChangedBroadcastWithPermissions(packageName, dontKillApp, notExportedComponentNames, packageUid, reason, userIds, instantUserIds, broadcastAllowList, sharedPackage /* targetPackageName */, Loading @@ -410,6 +425,9 @@ public final class BroadcastHelper { } if (!exportedComponentNames.isEmpty()) { tracePackageChangedBroadcastEvent(true /* applyFlag */, reasonForTrace, "all" /* targetName */, "exported" /* targetComponent */, exportedComponentNames.size()); sendPackageChangedBroadcastWithPermissions(packageName, dontKillApp, exportedComponentNames, packageUid, reason, userIds, instantUserIds, broadcastAllowList, null /* targetPackageName */, Loading Loading @@ -751,7 +769,8 @@ public final class BroadcastHelper { sendPackageChangedBroadcast(snapshot, pkg.getPackageName(), dontKillApp, new ArrayList<>(Collections.singletonList(pkg.getPackageName())), pkg.getUid(), null); pkg.getUid(), null /* reason */, "static_shared_library_changed" /* reasonForTrace */); } } } Loading Loading @@ -942,7 +961,8 @@ public final class BroadcastHelper { boolean dontKillApp, @NonNull ArrayList<String> componentNames, int packageUid, @NonNull String reason) { @NonNull String reason, @NonNull String reasonForTrace) { PackageStateInternal setting = snapshot.getPackageStateInternal(packageName, Process.SYSTEM_UID); if (setting == null || setting.getPkg() == null) { Loading @@ -960,7 +980,7 @@ public final class BroadcastHelper { mHandler.post(() -> sendPackageChangedBroadcastInternal( packageName, dontKillApp, componentNames, packageUid, reason, userIds, instantUserIds, broadcastAllowList, setting.getPkg(), sharedUserPackages)); sharedUserPackages, reasonForTrace)); mPackageMonitorCallbackHelper.notifyPackageChanged(packageName, dontKillApp, componentNames, packageUid, reason, userIds, instantUserIds, broadcastAllowList, mHandler); } Loading Loading @@ -1253,4 +1273,22 @@ public final class BroadcastHelper { mPackageMonitorCallbackHelper.notifyResourcesChanged(mediaStatus, replacing, pkgNames, uids, mHandler); } private static void tracePackageChangedBroadcastEvent(boolean applyFlag, String reasonForTrace, String targetName, String targetComponent, int componentSize) { if (!Trace.isTagEnabled(Trace.TRACE_TAG_SYSTEM_SERVER)) { return; } final StringBuilder builder = new StringBuilder(); builder.append("broadcastPackageChanged; "); builder.append("af="); builder.append(applyFlag); builder.append(",rft="); builder.append(reasonForTrace); builder.append(",tn="); builder.append(targetName); builder.append(",tc="); builder.append(targetComponent); builder.append(",cs="); builder.append(componentSize); Trace.instant(Trace.TRACE_TAG_SYSTEM_SERVER, builder.toString()); } } services/core/java/com/android/server/pm/InstallPackageHelper.java +3 −2 Original line number Diff line number Diff line Loading @@ -2983,7 +2983,7 @@ final class InstallPackageHelper { } } public void sendPendingBroadcasts() { public void sendPendingBroadcasts(String reasonForTrace) { String[] packages; ArrayList<String>[] components; int numBroadcasts = 0, numUsers; Loading Loading @@ -3027,7 +3027,8 @@ final class InstallPackageHelper { // Send broadcasts for (int i = 0; i < numBroadcasts; i++) { mBroadcastHelper.sendPackageChangedBroadcast(snapshot, packages[i], true /* dontKillApp */, components[i], uids[i], null /* reason */); true /* dontKillApp */, components[i], uids[i], null /* reason */, reasonForTrace); } } Loading services/core/java/com/android/server/pm/PackageHandler.java +1 −1 Original line number Diff line number Diff line Loading @@ -76,7 +76,7 @@ final class PackageHandler extends Handler { void doHandleMessage(Message msg) { switch (msg.what) { case SEND_PENDING_BROADCAST: { mPm.sendPendingBroadcasts(); mPm.sendPendingBroadcasts((String) msg.obj); break; } case POST_INSTALL: { Loading services/core/java/com/android/server/pm/PackageManagerService.java +15 −8 Original line number Diff line number Diff line Loading @@ -3531,7 +3531,10 @@ public class PackageManagerService implements PackageSender, TestUtilityService mPendingBroadcasts.addComponents(userId, packageName, updatedComponents); if (!mHandler.hasMessages(SEND_PENDING_BROADCAST)) { mHandler.sendEmptyMessageDelayed(SEND_PENDING_BROADCAST, BROADCAST_DELAY); mHandler.sendMessageDelayed( mHandler.obtainMessage(SEND_PENDING_BROADCAST, "reset_component_state_changed" /* obj */), BROADCAST_DELAY); } } Loading Loading @@ -3828,7 +3831,8 @@ public class PackageManagerService implements PackageSender, TestUtilityService mPendingBroadcasts.addComponent(userId, componentPkgName, componentName.getClassName()); if (!mHandler.hasMessages(SEND_PENDING_BROADCAST)) { mHandler.sendEmptyMessageDelayed(SEND_PENDING_BROADCAST, BROADCAST_DELAY); mHandler.sendMessageDelayed(mHandler.obtainMessage(SEND_PENDING_BROADCAST, "component_label_icon_changed" /* obj */), BROADCAST_DELAY); } } Loading Loading @@ -4087,7 +4091,8 @@ public class PackageManagerService implements PackageSender, TestUtilityService final long broadcastDelay = SystemClock.uptimeMillis() > mServiceStartWithDelay ? BROADCAST_DELAY : BROADCAST_DELAY_DURING_STARTUP; mHandler.sendEmptyMessageDelayed(SEND_PENDING_BROADCAST, broadcastDelay); mHandler.sendMessageDelayed(mHandler.obtainMessage(SEND_PENDING_BROADCAST, "component_state_changed" /* obj */), broadcastDelay); } } } Loading @@ -4105,7 +4110,8 @@ public class PackageManagerService implements PackageSender, TestUtilityService final int packageUid = UserHandle.getUid( userId, pkgSettings.get(packageName).getAppId()); mBroadcastHelper.sendPackageChangedBroadcast(newSnapshot, packageName, false /* dontKillApp */, components, packageUid, null /* reason */); false /* dontKillApp */, components, packageUid, null /* reason */, "component_state_changed" /* reasonForTrace */); } } finally { Binder.restoreCallingIdentity(callingId); Loading Loading @@ -4333,7 +4339,7 @@ public class PackageManagerService implements PackageSender, TestUtilityService true /* dontKillApp */, new ArrayList<>(Collections.singletonList(pkg.getPackageName())), pkg.getUid(), Intent.ACTION_OVERLAY_CHANGED); Intent.ACTION_OVERLAY_CHANGED, "overlay_changed" /* reasonForTrace */); } }, overlayFilter); Loading Loading @@ -6384,7 +6390,8 @@ public class PackageManagerService implements PackageSender, TestUtilityService if (pkgUserState != null && pkgUserState.isInstalled()) { final int packageUid = UserHandle.getUid(userIds[i], appId); mBroadcastHelper.sendPackageChangedBroadcast(snapShot, packageName, true /* dontKillApp */, components, packageUid, reason); true /* dontKillApp */, components, packageUid, reason, "mime_group_changed" /* reasonForTrace */); } } }); Loading Loading @@ -8179,8 +8186,8 @@ public class PackageManagerService implements PackageSender, TestUtilityService mRemovePackageHelper.cleanUpForMoveInstall(volumeUuid, packageName, fromCodePath); } void sendPendingBroadcasts() { mInstallPackageHelper.sendPendingBroadcasts(); void sendPendingBroadcasts(String reasonForTrace) { mInstallPackageHelper.sendPendingBroadcasts(reasonForTrace); } void handlePackagePostInstall(@NonNull InstallRequest request, boolean launchedForRestore) { Loading services/tests/PackageManagerServiceTests/server/src/com/android/server/pm/BroadcastHelperTest.java +1 −1 Original line number Diff line number Diff line Loading @@ -233,6 +233,6 @@ public class BroadcastHelperTest { mBroadcastHelper.sendPackageChangedBroadcast(mMockSnapshot, PACKAGE_CHANGED_TEST_PACKAGE_NAME, true /* dontKillApp */, componentNames, UserHandle.USER_SYSTEM, "test" /* reason */); UserHandle.USER_SYSTEM, "test" /* reason */, "test" /* reasonForTrace */); } } Loading
services/core/java/com/android/server/pm/BroadcastHelper.java +42 −4 Original line number Diff line number Diff line Loading @@ -53,6 +53,7 @@ import android.os.Handler; import android.os.PowerExemptionManager; import android.os.Process; import android.os.RemoteException; import android.os.Trace; import android.os.UserHandle; import android.os.storage.StorageManager; import android.os.storage.VolumeInfo; Loading Loading @@ -358,9 +359,14 @@ public final class BroadcastHelper { @Nullable int[] instantUserIds, @Nullable SparseArray<int[]> broadcastAllowList, @NonNull AndroidPackage pkg, @NonNull String[] sharedUidPackages) { @NonNull String[] sharedUidPackages, @NonNull String reasonForTrace) { final boolean isForWholeApp = componentNames.contains(packageName); if (isForWholeApp || !android.content.pm.Flags.reduceBroadcastsForComponentStateChanges()) { tracePackageChangedBroadcastEvent( android.content.pm.Flags.reduceBroadcastsForComponentStateChanges(), reasonForTrace, "all" /* targetName */, "whole" /* targetComponent */, componentNames.size()); sendPackageChangedBroadcastWithPermissions(packageName, dontKillApp, componentNames, packageUid, reason, userIds, instantUserIds, broadcastAllowList, null /* targetPackageName */, null /* requiredPermissions */); Loading @@ -382,6 +388,9 @@ public final class BroadcastHelper { // First, send the PACKAGE_CHANGED broadcast to the system. if (!TextUtils.equals(packageName, "android")) { tracePackageChangedBroadcastEvent(true /* applyFlag */, reasonForTrace, "system" /* targetName */, "notExported" /* targetComponent */, notExportedComponentNames.size()); sendPackageChangedBroadcastWithPermissions(packageName, dontKillApp, notExportedComponentNames, packageUid, reason, userIds, instantUserIds, broadcastAllowList, "android" /* targetPackageName */, Loading @@ -390,6 +399,9 @@ public final class BroadcastHelper { } // Second, send the PACKAGE_CHANGED broadcast to the application itself. tracePackageChangedBroadcastEvent(true /* applyFlag */, reasonForTrace, "applicationItself" /* targetName */, "notExported" /* targetComponent */, notExportedComponentNames.size()); sendPackageChangedBroadcastWithPermissions(packageName, dontKillApp, notExportedComponentNames, packageUid, reason, userIds, instantUserIds, broadcastAllowList, packageName /* targetPackageName */, Loading @@ -401,6 +413,9 @@ public final class BroadcastHelper { if (TextUtils.equals(packageName, sharedPackage)) { continue; } tracePackageChangedBroadcastEvent(true /* applyFlag */, reasonForTrace, "sharedUidPackages" /* targetName */, "notExported" /* targetComponent */, notExportedComponentNames.size()); sendPackageChangedBroadcastWithPermissions(packageName, dontKillApp, notExportedComponentNames, packageUid, reason, userIds, instantUserIds, broadcastAllowList, sharedPackage /* targetPackageName */, Loading @@ -410,6 +425,9 @@ public final class BroadcastHelper { } if (!exportedComponentNames.isEmpty()) { tracePackageChangedBroadcastEvent(true /* applyFlag */, reasonForTrace, "all" /* targetName */, "exported" /* targetComponent */, exportedComponentNames.size()); sendPackageChangedBroadcastWithPermissions(packageName, dontKillApp, exportedComponentNames, packageUid, reason, userIds, instantUserIds, broadcastAllowList, null /* targetPackageName */, Loading Loading @@ -751,7 +769,8 @@ public final class BroadcastHelper { sendPackageChangedBroadcast(snapshot, pkg.getPackageName(), dontKillApp, new ArrayList<>(Collections.singletonList(pkg.getPackageName())), pkg.getUid(), null); pkg.getUid(), null /* reason */, "static_shared_library_changed" /* reasonForTrace */); } } } Loading Loading @@ -942,7 +961,8 @@ public final class BroadcastHelper { boolean dontKillApp, @NonNull ArrayList<String> componentNames, int packageUid, @NonNull String reason) { @NonNull String reason, @NonNull String reasonForTrace) { PackageStateInternal setting = snapshot.getPackageStateInternal(packageName, Process.SYSTEM_UID); if (setting == null || setting.getPkg() == null) { Loading @@ -960,7 +980,7 @@ public final class BroadcastHelper { mHandler.post(() -> sendPackageChangedBroadcastInternal( packageName, dontKillApp, componentNames, packageUid, reason, userIds, instantUserIds, broadcastAllowList, setting.getPkg(), sharedUserPackages)); sharedUserPackages, reasonForTrace)); mPackageMonitorCallbackHelper.notifyPackageChanged(packageName, dontKillApp, componentNames, packageUid, reason, userIds, instantUserIds, broadcastAllowList, mHandler); } Loading Loading @@ -1253,4 +1273,22 @@ public final class BroadcastHelper { mPackageMonitorCallbackHelper.notifyResourcesChanged(mediaStatus, replacing, pkgNames, uids, mHandler); } private static void tracePackageChangedBroadcastEvent(boolean applyFlag, String reasonForTrace, String targetName, String targetComponent, int componentSize) { if (!Trace.isTagEnabled(Trace.TRACE_TAG_SYSTEM_SERVER)) { return; } final StringBuilder builder = new StringBuilder(); builder.append("broadcastPackageChanged; "); builder.append("af="); builder.append(applyFlag); builder.append(",rft="); builder.append(reasonForTrace); builder.append(",tn="); builder.append(targetName); builder.append(",tc="); builder.append(targetComponent); builder.append(",cs="); builder.append(componentSize); Trace.instant(Trace.TRACE_TAG_SYSTEM_SERVER, builder.toString()); } }
services/core/java/com/android/server/pm/InstallPackageHelper.java +3 −2 Original line number Diff line number Diff line Loading @@ -2983,7 +2983,7 @@ final class InstallPackageHelper { } } public void sendPendingBroadcasts() { public void sendPendingBroadcasts(String reasonForTrace) { String[] packages; ArrayList<String>[] components; int numBroadcasts = 0, numUsers; Loading Loading @@ -3027,7 +3027,8 @@ final class InstallPackageHelper { // Send broadcasts for (int i = 0; i < numBroadcasts; i++) { mBroadcastHelper.sendPackageChangedBroadcast(snapshot, packages[i], true /* dontKillApp */, components[i], uids[i], null /* reason */); true /* dontKillApp */, components[i], uids[i], null /* reason */, reasonForTrace); } } Loading
services/core/java/com/android/server/pm/PackageHandler.java +1 −1 Original line number Diff line number Diff line Loading @@ -76,7 +76,7 @@ final class PackageHandler extends Handler { void doHandleMessage(Message msg) { switch (msg.what) { case SEND_PENDING_BROADCAST: { mPm.sendPendingBroadcasts(); mPm.sendPendingBroadcasts((String) msg.obj); break; } case POST_INSTALL: { Loading
services/core/java/com/android/server/pm/PackageManagerService.java +15 −8 Original line number Diff line number Diff line Loading @@ -3531,7 +3531,10 @@ public class PackageManagerService implements PackageSender, TestUtilityService mPendingBroadcasts.addComponents(userId, packageName, updatedComponents); if (!mHandler.hasMessages(SEND_PENDING_BROADCAST)) { mHandler.sendEmptyMessageDelayed(SEND_PENDING_BROADCAST, BROADCAST_DELAY); mHandler.sendMessageDelayed( mHandler.obtainMessage(SEND_PENDING_BROADCAST, "reset_component_state_changed" /* obj */), BROADCAST_DELAY); } } Loading Loading @@ -3828,7 +3831,8 @@ public class PackageManagerService implements PackageSender, TestUtilityService mPendingBroadcasts.addComponent(userId, componentPkgName, componentName.getClassName()); if (!mHandler.hasMessages(SEND_PENDING_BROADCAST)) { mHandler.sendEmptyMessageDelayed(SEND_PENDING_BROADCAST, BROADCAST_DELAY); mHandler.sendMessageDelayed(mHandler.obtainMessage(SEND_PENDING_BROADCAST, "component_label_icon_changed" /* obj */), BROADCAST_DELAY); } } Loading Loading @@ -4087,7 +4091,8 @@ public class PackageManagerService implements PackageSender, TestUtilityService final long broadcastDelay = SystemClock.uptimeMillis() > mServiceStartWithDelay ? BROADCAST_DELAY : BROADCAST_DELAY_DURING_STARTUP; mHandler.sendEmptyMessageDelayed(SEND_PENDING_BROADCAST, broadcastDelay); mHandler.sendMessageDelayed(mHandler.obtainMessage(SEND_PENDING_BROADCAST, "component_state_changed" /* obj */), broadcastDelay); } } } Loading @@ -4105,7 +4110,8 @@ public class PackageManagerService implements PackageSender, TestUtilityService final int packageUid = UserHandle.getUid( userId, pkgSettings.get(packageName).getAppId()); mBroadcastHelper.sendPackageChangedBroadcast(newSnapshot, packageName, false /* dontKillApp */, components, packageUid, null /* reason */); false /* dontKillApp */, components, packageUid, null /* reason */, "component_state_changed" /* reasonForTrace */); } } finally { Binder.restoreCallingIdentity(callingId); Loading Loading @@ -4333,7 +4339,7 @@ public class PackageManagerService implements PackageSender, TestUtilityService true /* dontKillApp */, new ArrayList<>(Collections.singletonList(pkg.getPackageName())), pkg.getUid(), Intent.ACTION_OVERLAY_CHANGED); Intent.ACTION_OVERLAY_CHANGED, "overlay_changed" /* reasonForTrace */); } }, overlayFilter); Loading Loading @@ -6384,7 +6390,8 @@ public class PackageManagerService implements PackageSender, TestUtilityService if (pkgUserState != null && pkgUserState.isInstalled()) { final int packageUid = UserHandle.getUid(userIds[i], appId); mBroadcastHelper.sendPackageChangedBroadcast(snapShot, packageName, true /* dontKillApp */, components, packageUid, reason); true /* dontKillApp */, components, packageUid, reason, "mime_group_changed" /* reasonForTrace */); } } }); Loading Loading @@ -8179,8 +8186,8 @@ public class PackageManagerService implements PackageSender, TestUtilityService mRemovePackageHelper.cleanUpForMoveInstall(volumeUuid, packageName, fromCodePath); } void sendPendingBroadcasts() { mInstallPackageHelper.sendPendingBroadcasts(); void sendPendingBroadcasts(String reasonForTrace) { mInstallPackageHelper.sendPendingBroadcasts(reasonForTrace); } void handlePackagePostInstall(@NonNull InstallRequest request, boolean launchedForRestore) { Loading
services/tests/PackageManagerServiceTests/server/src/com/android/server/pm/BroadcastHelperTest.java +1 −1 Original line number Diff line number Diff line Loading @@ -233,6 +233,6 @@ public class BroadcastHelperTest { mBroadcastHelper.sendPackageChangedBroadcast(mMockSnapshot, PACKAGE_CHANGED_TEST_PACKAGE_NAME, true /* dontKillApp */, componentNames, UserHandle.USER_SYSTEM, "test" /* reason */); UserHandle.USER_SYSTEM, "test" /* reason */, "test" /* reasonForTrace */); } }