Loading core/java/android/content/pm/flags.aconfig +10 −0 Original line number Diff line number Diff line Loading @@ -357,3 +357,13 @@ flag { bug: "258223472" is_fixed_read_only: true } flag { name: "include_broadcast_debug_reason" namespace: "package_manager_service" description: "Include the debug reason when sending the package_changed broadcast" bug: "433392586" metadata { purpose: PURPOSE_BUGFIX } } services/core/java/com/android/server/pm/BroadcastHelper.java +17 −13 Original line number Diff line number Diff line Loading @@ -367,17 +367,17 @@ public final class BroadcastHelper { tracePackageChangedBroadcastEvent(true /* applyFlag */, reasonForTrace, packageName, "<implicit>" /* targetPackageName */, "whole" /* targetComponent */, componentNames.size(), callingPackageNameForTrace); Bundle bOptions = null; BroadcastOptions bOptions = null; if (android.content.pm.Flags.mergePackageChangedBroadcast()) { bOptions = new BroadcastOptions() .setDeliveryGroupPolicy(BroadcastOptions.DELIVERY_GROUP_POLICY_MOST_RECENT) .setDeliveryGroupMatchingKey(Intent.ACTION_PACKAGE_CHANGED, packageName + "-" + packageUid) .toBundle(); packageName + "-" + packageUid); } sendPackageChangedBroadcastWithPermissions(packageName, dontKillApp, componentNames, packageUid, reason, userIds, instantUserIds, broadcastAllowList, null /* targetPackageName */, null /* requiredPermissions */, bOptions); null /* targetPackageName */, null /* requiredPermissions */, reasonForTrace, bOptions); return; } Loading Loading @@ -413,10 +413,9 @@ public final class BroadcastHelper { } if (android.content.pm.Flags.consolidatePackageChangedBroadcasts()) { final Bundle bOptions = BroadcastOptions.makeBasic() final BroadcastOptions bOptions = BroadcastOptions.makeBasic() .setIncludedPackages(targetPackages.toArray( new String[targetPackages.size()])) .toBundle(); new String[targetPackages.size()])); tracePackageChangedBroadcastEvent(true /* applyFlag */, reasonForTrace, packageName, "<explicit-pkg-list>" /* targetPackageName */, "notExported" /* targetComponent */, Loading @@ -424,7 +423,7 @@ public final class BroadcastHelper { sendPackageChangedBroadcastWithPermissions(packageName, dontKillApp, notExportedComponentNames, packageUid, reason, userIds, instantUserIds, broadcastAllowList, null /* targetPackageName */, null /* requiredPermissions */, bOptions); null /* requiredPermissions */, reasonForTrace, bOptions); } else { for (int i = 0; i < targetPackages.size(); ++i) { final String targetPackageName = targetPackages.get(i); Loading @@ -435,7 +434,7 @@ public final class BroadcastHelper { sendPackageChangedBroadcastWithPermissions(packageName, dontKillApp, notExportedComponentNames, packageUid, reason, userIds, instantUserIds, broadcastAllowList, targetPackageName, null /* requiredPermissions */, null /* bOptions */); null /* requiredPermissions */, reasonForTrace, null /* bOptions */); } } } Loading @@ -447,7 +446,7 @@ public final class BroadcastHelper { sendPackageChangedBroadcastWithPermissions(packageName, dontKillApp, exportedComponentNames, packageUid, reason, userIds, instantUserIds, broadcastAllowList, null /* targetPackageName */, null /* requiredPermissions */, null /* bOptions */); null /* requiredPermissions */, reasonForTrace, null /* bOptions */); } } Loading @@ -461,7 +460,8 @@ public final class BroadcastHelper { @Nullable SparseArray<int[]> broadcastAllowList, @Nullable String targetPackageName, @Nullable String[] requiredPermissions, @Nullable Bundle bOptions) { @NonNull String broadcastDebugReason, @Nullable BroadcastOptions bOptions) { if (DEBUG_INSTALL) { Log.v(TAG, "Sending package changed: package=" + packageName + " components=" + componentNames); Loading @@ -476,6 +476,10 @@ public final class BroadcastHelper { if (reason != null) { extras.putString(Intent.EXTRA_REASON, reason); } if (android.content.pm.Flags.includeBroadcastDebugReason()) { bOptions = bOptions == null ? BroadcastOptions.makeBasic() : bOptions; bOptions.setDebugReason(broadcastDebugReason); } // 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. Loading @@ -483,8 +487,8 @@ public final class BroadcastHelper { ? Intent.FLAG_RECEIVER_REGISTERED_ONLY : 0; sendPackageBroadcast(Intent.ACTION_PACKAGE_CHANGED, packageName, extras, flags, targetPackageName, null /* finishedReceiver */, userIds, instantUserIds, broadcastAllowList, null /* filterExtrasForReceiver */, bOptions, requiredPermissions); broadcastAllowList, null /* filterExtrasForReceiver */, bOptions == null ? null : bOptions.toBundle(), requiredPermissions); } static void sendDeviceCustomizationReadyBroadcast() { Loading services/tests/PackageManagerServiceTests/server/src/com/android/server/pm/BroadcastHelperTest.java +12 −2 Original line number Diff line number Diff line Loading @@ -122,7 +122,8 @@ public class BroadcastHelperTest { mBroadcastHelper = new BroadcastHelper(mMockPackageManagerServiceInjector); } @EnableFlags(Flags.FLAG_CONSOLIDATE_PACKAGE_CHANGED_BROADCASTS) @EnableFlags({Flags.FLAG_CONSOLIDATE_PACKAGE_CHANGED_BROADCASTS, Flags.FLAG_INCLUDE_BROADCAST_DEBUG_REASON}) @Test public void changeNonExportedComponent_sendPackageChangedBroadcastToSystemAndApplicationItself() throws Exception { Loading @@ -141,6 +142,7 @@ public class BroadcastHelperTest { Bundle actualOptions = captorOptions.getValue(); assertThat(actualOptions).isNotNull(); verifyIncludedPackages(actualOptions, "android", PACKAGE_CHANGED_TEST_PACKAGE_NAME); verifyBroadcastDebugReason(actualOptions, PackageMetrics.STRING_TEST); } @DisableFlags(Flags.FLAG_CONSOLIDATE_PACKAGE_CHANGED_BROADCASTS) Loading @@ -164,7 +166,8 @@ public class BroadcastHelperTest { assertThat(intent2.getPackage()).isEqualTo(PACKAGE_CHANGED_TEST_PACKAGE_NAME); } @EnableFlags(Flags.FLAG_CONSOLIDATE_PACKAGE_CHANGED_BROADCASTS) @EnableFlags({Flags.FLAG_CONSOLIDATE_PACKAGE_CHANGED_BROADCASTS, Flags.FLAG_INCLUDE_BROADCAST_DEBUG_REASON}) @Test public void changeNonExportedComponent_sendPackageChangedBroadcastToSharedUserIdApplications() throws Exception { Loading @@ -184,6 +187,7 @@ public class BroadcastHelperTest { assertThat(actualOptions).isNotNull(); verifyIncludedPackages(actualOptions, "android", PACKAGE_CHANGED_TEST_PACKAGE_NAME, "shared.package"); verifyBroadcastDebugReason(actualOptions, PackageMetrics.STRING_TEST); } @DisableFlags(Flags.FLAG_CONSOLIDATE_PACKAGE_CHANGED_BROADCASTS) Loading Loading @@ -264,4 +268,10 @@ public class BroadcastHelperTest { assertThat(actualBroadcastOptions.getIncludedPackages()) .isEqualTo(expectedIncludedPackages); } private void verifyBroadcastDebugReason(Bundle actualOptions, String expectedReason) { BroadcastOptions actualBroadcastOptions = new BroadcastOptions(actualOptions); assertThat(actualBroadcastOptions.getDebugReason()) .isEqualTo(expectedReason); } } Loading
core/java/android/content/pm/flags.aconfig +10 −0 Original line number Diff line number Diff line Loading @@ -357,3 +357,13 @@ flag { bug: "258223472" is_fixed_read_only: true } flag { name: "include_broadcast_debug_reason" namespace: "package_manager_service" description: "Include the debug reason when sending the package_changed broadcast" bug: "433392586" metadata { purpose: PURPOSE_BUGFIX } }
services/core/java/com/android/server/pm/BroadcastHelper.java +17 −13 Original line number Diff line number Diff line Loading @@ -367,17 +367,17 @@ public final class BroadcastHelper { tracePackageChangedBroadcastEvent(true /* applyFlag */, reasonForTrace, packageName, "<implicit>" /* targetPackageName */, "whole" /* targetComponent */, componentNames.size(), callingPackageNameForTrace); Bundle bOptions = null; BroadcastOptions bOptions = null; if (android.content.pm.Flags.mergePackageChangedBroadcast()) { bOptions = new BroadcastOptions() .setDeliveryGroupPolicy(BroadcastOptions.DELIVERY_GROUP_POLICY_MOST_RECENT) .setDeliveryGroupMatchingKey(Intent.ACTION_PACKAGE_CHANGED, packageName + "-" + packageUid) .toBundle(); packageName + "-" + packageUid); } sendPackageChangedBroadcastWithPermissions(packageName, dontKillApp, componentNames, packageUid, reason, userIds, instantUserIds, broadcastAllowList, null /* targetPackageName */, null /* requiredPermissions */, bOptions); null /* targetPackageName */, null /* requiredPermissions */, reasonForTrace, bOptions); return; } Loading Loading @@ -413,10 +413,9 @@ public final class BroadcastHelper { } if (android.content.pm.Flags.consolidatePackageChangedBroadcasts()) { final Bundle bOptions = BroadcastOptions.makeBasic() final BroadcastOptions bOptions = BroadcastOptions.makeBasic() .setIncludedPackages(targetPackages.toArray( new String[targetPackages.size()])) .toBundle(); new String[targetPackages.size()])); tracePackageChangedBroadcastEvent(true /* applyFlag */, reasonForTrace, packageName, "<explicit-pkg-list>" /* targetPackageName */, "notExported" /* targetComponent */, Loading @@ -424,7 +423,7 @@ public final class BroadcastHelper { sendPackageChangedBroadcastWithPermissions(packageName, dontKillApp, notExportedComponentNames, packageUid, reason, userIds, instantUserIds, broadcastAllowList, null /* targetPackageName */, null /* requiredPermissions */, bOptions); null /* requiredPermissions */, reasonForTrace, bOptions); } else { for (int i = 0; i < targetPackages.size(); ++i) { final String targetPackageName = targetPackages.get(i); Loading @@ -435,7 +434,7 @@ public final class BroadcastHelper { sendPackageChangedBroadcastWithPermissions(packageName, dontKillApp, notExportedComponentNames, packageUid, reason, userIds, instantUserIds, broadcastAllowList, targetPackageName, null /* requiredPermissions */, null /* bOptions */); null /* requiredPermissions */, reasonForTrace, null /* bOptions */); } } } Loading @@ -447,7 +446,7 @@ public final class BroadcastHelper { sendPackageChangedBroadcastWithPermissions(packageName, dontKillApp, exportedComponentNames, packageUid, reason, userIds, instantUserIds, broadcastAllowList, null /* targetPackageName */, null /* requiredPermissions */, null /* bOptions */); null /* requiredPermissions */, reasonForTrace, null /* bOptions */); } } Loading @@ -461,7 +460,8 @@ public final class BroadcastHelper { @Nullable SparseArray<int[]> broadcastAllowList, @Nullable String targetPackageName, @Nullable String[] requiredPermissions, @Nullable Bundle bOptions) { @NonNull String broadcastDebugReason, @Nullable BroadcastOptions bOptions) { if (DEBUG_INSTALL) { Log.v(TAG, "Sending package changed: package=" + packageName + " components=" + componentNames); Loading @@ -476,6 +476,10 @@ public final class BroadcastHelper { if (reason != null) { extras.putString(Intent.EXTRA_REASON, reason); } if (android.content.pm.Flags.includeBroadcastDebugReason()) { bOptions = bOptions == null ? BroadcastOptions.makeBasic() : bOptions; bOptions.setDebugReason(broadcastDebugReason); } // 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. Loading @@ -483,8 +487,8 @@ public final class BroadcastHelper { ? Intent.FLAG_RECEIVER_REGISTERED_ONLY : 0; sendPackageBroadcast(Intent.ACTION_PACKAGE_CHANGED, packageName, extras, flags, targetPackageName, null /* finishedReceiver */, userIds, instantUserIds, broadcastAllowList, null /* filterExtrasForReceiver */, bOptions, requiredPermissions); broadcastAllowList, null /* filterExtrasForReceiver */, bOptions == null ? null : bOptions.toBundle(), requiredPermissions); } static void sendDeviceCustomizationReadyBroadcast() { Loading
services/tests/PackageManagerServiceTests/server/src/com/android/server/pm/BroadcastHelperTest.java +12 −2 Original line number Diff line number Diff line Loading @@ -122,7 +122,8 @@ public class BroadcastHelperTest { mBroadcastHelper = new BroadcastHelper(mMockPackageManagerServiceInjector); } @EnableFlags(Flags.FLAG_CONSOLIDATE_PACKAGE_CHANGED_BROADCASTS) @EnableFlags({Flags.FLAG_CONSOLIDATE_PACKAGE_CHANGED_BROADCASTS, Flags.FLAG_INCLUDE_BROADCAST_DEBUG_REASON}) @Test public void changeNonExportedComponent_sendPackageChangedBroadcastToSystemAndApplicationItself() throws Exception { Loading @@ -141,6 +142,7 @@ public class BroadcastHelperTest { Bundle actualOptions = captorOptions.getValue(); assertThat(actualOptions).isNotNull(); verifyIncludedPackages(actualOptions, "android", PACKAGE_CHANGED_TEST_PACKAGE_NAME); verifyBroadcastDebugReason(actualOptions, PackageMetrics.STRING_TEST); } @DisableFlags(Flags.FLAG_CONSOLIDATE_PACKAGE_CHANGED_BROADCASTS) Loading @@ -164,7 +166,8 @@ public class BroadcastHelperTest { assertThat(intent2.getPackage()).isEqualTo(PACKAGE_CHANGED_TEST_PACKAGE_NAME); } @EnableFlags(Flags.FLAG_CONSOLIDATE_PACKAGE_CHANGED_BROADCASTS) @EnableFlags({Flags.FLAG_CONSOLIDATE_PACKAGE_CHANGED_BROADCASTS, Flags.FLAG_INCLUDE_BROADCAST_DEBUG_REASON}) @Test public void changeNonExportedComponent_sendPackageChangedBroadcastToSharedUserIdApplications() throws Exception { Loading @@ -184,6 +187,7 @@ public class BroadcastHelperTest { assertThat(actualOptions).isNotNull(); verifyIncludedPackages(actualOptions, "android", PACKAGE_CHANGED_TEST_PACKAGE_NAME, "shared.package"); verifyBroadcastDebugReason(actualOptions, PackageMetrics.STRING_TEST); } @DisableFlags(Flags.FLAG_CONSOLIDATE_PACKAGE_CHANGED_BROADCASTS) Loading Loading @@ -264,4 +268,10 @@ public class BroadcastHelperTest { assertThat(actualBroadcastOptions.getIncludedPackages()) .isEqualTo(expectedIncludedPackages); } private void verifyBroadcastDebugReason(Bundle actualOptions, String expectedReason) { BroadcastOptions actualBroadcastOptions = new BroadcastOptions(actualOptions); assertThat(actualBroadcastOptions.getDebugReason()) .isEqualTo(expectedReason); } }