summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--services/core/java/com/android/server/pm/BroadcastHelper.java46
-rw-r--r--services/core/java/com/android/server/pm/InstallPackageHelper.java5
-rw-r--r--services/core/java/com/android/server/pm/PackageHandler.java2
-rw-r--r--services/core/java/com/android/server/pm/PackageManagerService.java23
-rw-r--r--services/tests/PackageManagerServiceTests/server/src/com/android/server/pm/BroadcastHelperTest.java2
5 files changed, 62 insertions, 16 deletions
diff --git a/services/core/java/com/android/server/pm/BroadcastHelper.java b/services/core/java/com/android/server/pm/BroadcastHelper.java
index d78e98bf8e61..67e10953ac91 100644
--- a/services/core/java/com/android/server/pm/BroadcastHelper.java
+++ b/services/core/java/com/android/server/pm/BroadcastHelper.java
@@ -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());
+ }
}
diff --git a/services/core/java/com/android/server/pm/InstallPackageHelper.java b/services/core/java/com/android/server/pm/InstallPackageHelper.java
index 183ceaecb70e..b48b39c2edd5 100644
--- a/services/core/java/com/android/server/pm/InstallPackageHelper.java
+++ b/services/core/java/com/android/server/pm/InstallPackageHelper.java
@@ -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);
}
}
diff --git a/services/core/java/com/android/server/pm/PackageHandler.java b/services/core/java/com/android/server/pm/PackageHandler.java
index 4ea405441030..0a067048be42 100644
--- a/services/core/java/com/android/server/pm/PackageHandler.java
+++ b/services/core/java/com/android/server/pm/PackageHandler.java
@@ -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: {
diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java
index fd0a90c5833a..aadf11227d89 100644
--- a/services/core/java/com/android/server/pm/PackageManagerService.java
+++ b/services/core/java/com/android/server/pm/PackageManagerService.java
@@ -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) {
diff --git a/services/tests/PackageManagerServiceTests/server/src/com/android/server/pm/BroadcastHelperTest.java b/services/tests/PackageManagerServiceTests/server/src/com/android/server/pm/BroadcastHelperTest.java
index acd34e323dc2..0ae7699aeb71 100644
--- a/services/tests/PackageManagerServiceTests/server/src/com/android/server/pm/BroadcastHelperTest.java
+++ b/services/tests/PackageManagerServiceTests/server/src/com/android/server/pm/BroadcastHelperTest.java
@@ -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 */);
}
}