Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit a70475ac authored by Sudheer Shanka's avatar Sudheer Shanka
Browse files

Specify the reason when sending the PACKAGE_CHANGED broadcast.

Bug: 433392586
Test: atest services/tests/PackageManagerServiceTests/server/src/com/android/server/pm/BroadcastHelperTest.java
Flag: android.content.pm.include_broadcast_debug_reason
Change-Id: I7e1e8f864fdde76e2674594167a18c6edbc02357
parent 9c99fa35
Loading
Loading
Loading
Loading
+10 −0
Original line number Diff line number Diff line
@@ -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
    }
}
+17 −13
Original line number Diff line number Diff line
@@ -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;
        }

@@ -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 */,
@@ -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);
@@ -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 */);
                }
            }
        }
@@ -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 */);
        }
    }

@@ -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);
@@ -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.
@@ -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() {
+12 −2
Original line number Diff line number Diff line
@@ -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 {
@@ -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)
@@ -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 {
@@ -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)
@@ -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);
    }
}