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

Commit f2d99a52 authored by Treehugger Robot's avatar Treehugger Robot Committed by Android (Google) Code Review
Browse files

Merge "Include reasoning for why a PACKAGE_CHANGED broadcast is triggered in the trace" into main

parents bcd1f529 4de87912
Loading
Loading
Loading
Loading
+42 −4
Original line number Diff line number Diff line
@@ -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;
@@ -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 */);
@@ -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 */,
@@ -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 */,
@@ -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 */,
@@ -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 */,
@@ -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 */);
                }
            }
        }
@@ -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) {
@@ -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);
    }
@@ -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());
    }
}
+3 −2
Original line number Diff line number Diff line
@@ -2983,7 +2983,7 @@ final class InstallPackageHelper {
        }
    }

    public void sendPendingBroadcasts() {
    public void sendPendingBroadcasts(String reasonForTrace) {
        String[] packages;
        ArrayList<String>[] components;
        int numBroadcasts = 0, numUsers;
@@ -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);
        }
    }

+1 −1
Original line number Diff line number Diff line
@@ -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: {
+15 −8
Original line number Diff line number Diff line
@@ -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);
        }
    }

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

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

@@ -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 */);
                        }
                    }
                });
@@ -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) {
+1 −1
Original line number Diff line number Diff line
@@ -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 */);
    }
}