diff options
14 files changed, 152 insertions, 55 deletions
diff --git a/core/java/android/content/Intent.java b/core/java/android/content/Intent.java index bc7620cee3f9..a27d1cb845c8 100644 --- a/core/java/android/content/Intent.java +++ b/core/java/android/content/Intent.java @@ -4471,6 +4471,22 @@ public class Intent implements Parcelable, Cloneable { * @hide */ public static final int FLAG_RECEIVER_BOOT_UPGRADE = 0x02000000; + /** + * If set, the broadcast will always go to manifest receivers in background (cached + * or not running) apps, regardless of whether that would be done by default. By + * default they will only receive broadcasts if the broadcast has specified an + * explicit component or package name. + * @hide + */ + public static final int FLAG_RECEIVER_INCLUDE_BACKGROUND = 0x01000000; + /** + * If set, the broadcast will never go to manifest receivers in background (cached + * or not running) apps, regardless of whether that would be done by default. By + * default they will receive broadcasts if the broadcast has specified an + * explicit component or package name. + * @hide + */ + public static final int FLAG_RECEIVER_EXCLUDE_BACKGROUND = 0x00800000; /** * @hide Flags that can't be changed with PendingIntent. diff --git a/core/java/android/content/pm/ActivityInfo.java b/core/java/android/content/pm/ActivityInfo.java index 4a3c59bd8426..0cb0e9fce251 100644 --- a/core/java/android/content/pm/ActivityInfo.java +++ b/core/java/android/content/pm/ActivityInfo.java @@ -756,13 +756,20 @@ public class ActivityInfo extends ComponentInfo } public void dump(Printer pw, String prefix) { + dump(pw, prefix, DUMP_FLAG_ALL); + } + + /** @hide */ + public void dump(Printer pw, String prefix, int flags) { super.dumpFront(pw, prefix); if (permission != null) { pw.println(prefix + "permission=" + permission); } - pw.println(prefix + "taskAffinity=" + taskAffinity - + " targetActivity=" + targetActivity - + " persistableMode=" + persistableModeToString()); + if ((flags&DUMP_FLAG_DETAILS) != 0) { + pw.println(prefix + "taskAffinity=" + taskAffinity + + " targetActivity=" + targetActivity + + " persistableMode=" + persistableModeToString()); + } if (launchMode != 0 || flags != 0 || theme != 0) { pw.println(prefix + "launchMode=" + launchMode + " flags=0x" + Integer.toHexString(flags) @@ -777,14 +784,17 @@ public class ActivityInfo extends ComponentInfo if (uiOptions != 0) { pw.println(prefix + " uiOptions=0x" + Integer.toHexString(uiOptions)); } - pw.println(prefix + "resizeable=" + resizeable + " supportsPip=" + supportsPip); - pw.println(prefix + "lockTaskLaunchMode=" + lockTaskLaunchModeToString(lockTaskLaunchMode)); + if ((flags&DUMP_FLAG_DETAILS) != 0) { + pw.println(prefix + "resizeable=" + resizeable + " supportsPip=" + supportsPip); + pw.println(prefix + "lockTaskLaunchMode=" + + lockTaskLaunchModeToString(lockTaskLaunchMode)); + } if (layout != null) { pw.println(prefix + "initialLayout=" + layout.width + "|" + layout.widthFraction + ", " + layout.height + "|" + layout.heightFraction + ", " + layout.gravity); } - super.dumpBack(pw, prefix); + super.dumpBack(pw, prefix, flags); } public String toString() { diff --git a/core/java/android/content/pm/ApplicationInfo.java b/core/java/android/content/pm/ApplicationInfo.java index 4c5e76661c43..0633bff7a286 100644 --- a/core/java/android/content/pm/ApplicationInfo.java +++ b/core/java/android/content/pm/ApplicationInfo.java @@ -710,21 +710,30 @@ public class ApplicationInfo extends PackageItemInfo implements Parcelable { public int installLocation = PackageInfo.INSTALL_LOCATION_UNSPECIFIED; public void dump(Printer pw, String prefix) { + dump(pw, prefix, DUMP_FLAG_ALL); + } + + /** @hide */ + public void dump(Printer pw, String prefix, int flags) { super.dumpFront(pw, prefix); - if (className != null) { + if ((flags&DUMP_FLAG_DETAILS) != 0 && className != null) { pw.println(prefix + "className=" + className); } if (permission != null) { pw.println(prefix + "permission=" + permission); } pw.println(prefix + "processName=" + processName); - pw.println(prefix + "taskAffinity=" + taskAffinity); + if ((flags&DUMP_FLAG_DETAILS) != 0) { + pw.println(prefix + "taskAffinity=" + taskAffinity); + } pw.println(prefix + "uid=" + uid + " flags=0x" + Integer.toHexString(flags) + " privateFlags=0x" + Integer.toHexString(privateFlags) + " theme=0x" + Integer.toHexString(theme)); - pw.println(prefix + "requiresSmallestWidthDp=" + requiresSmallestWidthDp - + " compatibleWidthLimitDp=" + compatibleWidthLimitDp - + " largestWidthLimitDp=" + largestWidthLimitDp); + if ((flags&DUMP_FLAG_DETAILS) != 0) { + pw.println(prefix + "requiresSmallestWidthDp=" + requiresSmallestWidthDp + + " compatibleWidthLimitDp=" + compatibleWidthLimitDp + + " largestWidthLimitDp=" + largestWidthLimitDp); + } pw.println(prefix + "sourceDir=" + sourceDir); if (!Objects.equals(sourceDir, publicSourceDir)) { pw.println(prefix + "publicSourceDir=" + publicSourceDir); @@ -739,31 +748,36 @@ public class ApplicationInfo extends PackageItemInfo implements Parcelable { if (resourceDirs != null) { pw.println(prefix + "resourceDirs=" + resourceDirs); } - if (seinfo != null) { + if ((flags&DUMP_FLAG_DETAILS) != 0 && seinfo != null) { pw.println(prefix + "seinfo=" + seinfo); } pw.println(prefix + "dataDir=" + dataDir); - pw.println(prefix + "deviceEncryptedDataDir=" + deviceEncryptedDataDir); - pw.println(prefix + "credentialEncryptedDataDir=" + credentialEncryptedDataDir); - if (sharedLibraryFiles != null) { - pw.println(prefix + "sharedLibraryFiles=" + Arrays.toString(sharedLibraryFiles)); + if ((flags&DUMP_FLAG_DETAILS) != 0) { + pw.println(prefix + "deviceEncryptedDataDir=" + deviceEncryptedDataDir); + pw.println(prefix + "credentialEncryptedDataDir=" + credentialEncryptedDataDir); + if (sharedLibraryFiles != null) { + pw.println(prefix + "sharedLibraryFiles=" + Arrays.toString(sharedLibraryFiles)); + } } pw.println(prefix + "enabled=" + enabled + " targetSdkVersion=" + targetSdkVersion + " versionCode=" + versionCode); - if (manageSpaceActivityName != null) { - pw.println(prefix + "manageSpaceActivityName="+manageSpaceActivityName); - } - if (descriptionRes != 0) { - pw.println(prefix + "description=0x"+Integer.toHexString(descriptionRes)); - } - if (uiOptions != 0) { - pw.println(prefix + "uiOptions=0x" + Integer.toHexString(uiOptions)); - } - pw.println(prefix + "supportsRtl=" + (hasRtlSupport() ? "true" : "false")); - if (fullBackupContent > 0) { - pw.println(prefix + "fullBackupContent=@xml/" + fullBackupContent); - } else { - pw.println(prefix + "fullBackupContent=" + (fullBackupContent < 0 ? "false" : "true")); + if ((flags&DUMP_FLAG_DETAILS) != 0) { + if (manageSpaceActivityName != null) { + pw.println(prefix + "manageSpaceActivityName=" + manageSpaceActivityName); + } + if (descriptionRes != 0) { + pw.println(prefix + "description=0x" + Integer.toHexString(descriptionRes)); + } + if (uiOptions != 0) { + pw.println(prefix + "uiOptions=0x" + Integer.toHexString(uiOptions)); + } + pw.println(prefix + "supportsRtl=" + (hasRtlSupport() ? "true" : "false")); + if (fullBackupContent > 0) { + pw.println(prefix + "fullBackupContent=@xml/" + fullBackupContent); + } else { + pw.println(prefix + "fullBackupContent=" + + (fullBackupContent < 0 ? "false" : "true")); + } } super.dumpBack(pw, prefix); } diff --git a/core/java/android/content/pm/ComponentInfo.java b/core/java/android/content/pm/ComponentInfo.java index ad7ebe5e7fd9..a295cc55b00a 100644 --- a/core/java/android/content/pm/ComponentInfo.java +++ b/core/java/android/content/pm/ComponentInfo.java @@ -150,23 +150,32 @@ public class ComponentInfo extends PackageItemInfo { protected void dumpFront(Printer pw, String prefix) { super.dumpFront(pw, prefix); + if (processName != null && !packageName.equals(processName)) { + pw.println(prefix + "processName=" + processName); + } pw.println(prefix + "enabled=" + enabled + " exported=" + exported - + " encryptionAware=" + encryptionAware + " processName=" + processName); + + " encryptionAware=" + encryptionAware); if (descriptionRes != 0) { pw.println(prefix + "description=" + descriptionRes); } } - + protected void dumpBack(Printer pw, String prefix) { - if (applicationInfo != null) { - pw.println(prefix + "ApplicationInfo:"); - applicationInfo.dump(pw, prefix + " "); - } else { - pw.println(prefix + "ApplicationInfo: null"); + dumpBack(pw, prefix, DUMP_FLAG_ALL); + } + + void dumpBack(Printer pw, String prefix, int flags) { + if ((flags&DUMP_FLAG_APPLICATION) != 0) { + if (applicationInfo != null) { + pw.println(prefix + "ApplicationInfo:"); + applicationInfo.dump(pw, prefix + " ", flags); + } else { + pw.println(prefix + "ApplicationInfo: null"); + } } super.dumpBack(pw, prefix); } - + public void writeToParcel(Parcel dest, int parcelableFlags) { super.writeToParcel(dest, parcelableFlags); if ((parcelableFlags & Parcelable.PARCELABLE_ELIDE_DUPLICATES) != 0) { diff --git a/core/java/android/content/pm/PackageItemInfo.java b/core/java/android/content/pm/PackageItemInfo.java index 22a899cda05b..4df83036daaf 100644 --- a/core/java/android/content/pm/PackageItemInfo.java +++ b/core/java/android/content/pm/PackageItemInfo.java @@ -282,6 +282,21 @@ public class PackageItemInfo { return null; } + /** + * @hide Flag for dumping: include all details. + */ + public static final int DUMP_FLAG_DETAILS = 1<<0; + + /** + * @hide Flag for dumping: include nested ApplicationInfo. + */ + public static final int DUMP_FLAG_APPLICATION = 1<<1; + + /** + * @hide Flag for dumping: all flags to dump everything. + */ + public static final int DUMP_FLAG_ALL = DUMP_FLAG_DETAILS | DUMP_FLAG_APPLICATION; + protected void dumpFront(Printer pw, String prefix) { if (name != null) { pw.println(prefix + "name=" + name); diff --git a/core/java/android/content/pm/ProviderInfo.java b/core/java/android/content/pm/ProviderInfo.java index f6ea058b526f..7e7b32f03fd1 100644 --- a/core/java/android/content/pm/ProviderInfo.java +++ b/core/java/android/content/pm/ProviderInfo.java @@ -115,9 +115,15 @@ public final class ProviderInfo extends ComponentInfo } public void dump(Printer pw, String prefix) { + dump(pw, prefix, DUMP_FLAG_ALL); + } + + /** @hide */ + public void dump(Printer pw, String prefix, int flags) { super.dumpFront(pw, prefix); pw.println(prefix + "authority=" + authority); pw.println(prefix + "flags=0x" + Integer.toHexString(flags)); + super.dumpBack(pw, prefix, flags); } public int describeContents() { diff --git a/core/java/android/content/pm/ResolveInfo.java b/core/java/android/content/pm/ResolveInfo.java index 7bab35ce7e8e..a5fb451db61d 100644 --- a/core/java/android/content/pm/ResolveInfo.java +++ b/core/java/android/content/pm/ResolveInfo.java @@ -260,6 +260,11 @@ public class ResolveInfo implements Parcelable { } public void dump(Printer pw, String prefix) { + dump(pw, prefix, PackageItemInfo.DUMP_FLAG_ALL); + } + + /** @hide */ + public void dump(Printer pw, String prefix, int flags) { if (filter != null) { pw.println(prefix + "Filter:"); filter.dump(pw, prefix + " "); @@ -279,16 +284,16 @@ public class ResolveInfo implements Parcelable { } if (activityInfo != null) { pw.println(prefix + "ActivityInfo:"); - activityInfo.dump(pw, prefix + " "); + activityInfo.dump(pw, prefix + " ", flags); } else if (serviceInfo != null) { pw.println(prefix + "ServiceInfo:"); - serviceInfo.dump(pw, prefix + " "); + serviceInfo.dump(pw, prefix + " ", flags); } else if (providerInfo != null) { pw.println(prefix + "ProviderInfo:"); - providerInfo.dump(pw, prefix + " "); + providerInfo.dump(pw, prefix + " ", flags); } } - + public ResolveInfo() { targetUserId = UserHandle.USER_CURRENT; } diff --git a/core/java/android/content/pm/ServiceInfo.java b/core/java/android/content/pm/ServiceInfo.java index 796c2a422921..74e5c2a65982 100644 --- a/core/java/android/content/pm/ServiceInfo.java +++ b/core/java/android/content/pm/ServiceInfo.java @@ -74,9 +74,15 @@ public class ServiceInfo extends ComponentInfo } public void dump(Printer pw, String prefix) { + dump(pw, prefix, DUMP_FLAG_ALL); + } + + /** @hide */ + void dump(Printer pw, String prefix, int flags) { super.dumpFront(pw, prefix); pw.println(prefix + "permission=" + permission); pw.println(prefix + "flags=0x" + Integer.toHexString(flags)); + super.dumpBack(pw, prefix, flags); } public String toString() { diff --git a/services/core/java/com/android/server/am/BroadcastQueue.java b/services/core/java/com/android/server/am/BroadcastQueue.java index 2fb71c3a8e24..39e25ee482f9 100644 --- a/services/core/java/com/android/server/am/BroadcastQueue.java +++ b/services/core/java/com/android/server/am/BroadcastQueue.java @@ -1086,9 +1086,17 @@ public final class BroadcastQueue { // completely disabled from launches, or it is delayed and the broadcast // was not explicitly sent to it and this would result in a new process // for it being created. - if (allowed == ActivityManager.APP_START_MODE_DISABLED + if (allowed == ActivityManager.APP_START_MODE_DISABLED) { + Slog.w(TAG, "Background execution disabled: receiving " + + r.intent + " to " + + component.flattenToShortString()); + skip = true; + } + if (((r.intent.getFlags()&Intent.FLAG_RECEIVER_EXCLUDE_BACKGROUND) != 0) || (r.intent.getComponent() == null - && r.intent.getPackage() == null && app == null)) { + && r.intent.getPackage() == null && app == null + && ((r.intent.getFlags() + & Intent.FLAG_RECEIVER_INCLUDE_BACKGROUND) == 0))) { Slog.w(TAG, "Background execution not allowed: receiving " + r.intent + " to " + component.flattenToShortString()); diff --git a/services/core/java/com/android/server/am/BroadcastRecord.java b/services/core/java/com/android/server/am/BroadcastRecord.java index b42bcff15f83..1a269cf840f7 100644 --- a/services/core/java/com/android/server/am/BroadcastRecord.java +++ b/services/core/java/com/android/server/am/BroadcastRecord.java @@ -188,7 +188,7 @@ final class BroadcastRecord extends Binder { if (o instanceof BroadcastFilter) ((BroadcastFilter)o).dumpBrief(pw, p2); else if (o instanceof ResolveInfo) - ((ResolveInfo)o).dump(printer, p2); + ((ResolveInfo)o).dump(printer, p2, 0); } } diff --git a/services/core/java/com/android/server/am/UserController.java b/services/core/java/com/android/server/am/UserController.java index f6f82da6f75c..62e78a456c98 100644 --- a/services/core/java/com/android/server/am/UserController.java +++ b/services/core/java/com/android/server/am/UserController.java @@ -253,7 +253,8 @@ final class UserController { final Intent bootIntent = new Intent(Intent.ACTION_BOOT_COMPLETED, null); bootIntent.putExtra(Intent.EXTRA_USER_HANDLE, userId); - bootIntent.addFlags(Intent.FLAG_RECEIVER_NO_ABORT); + bootIntent.addFlags(Intent.FLAG_RECEIVER_NO_ABORT + | Intent.FLAG_RECEIVER_INCLUDE_BACKGROUND); mService.broadcastIntentLocked(null, null, bootIntent, null, null, 0, null, null, new String[] { android.Manifest.permission.RECEIVE_BOOT_COMPLETED }, AppOpsManager.OP_NONE, null, true, false, MY_PID, SYSTEM_UID, userId); diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index 2f8157ef6865..3a8a9882f403 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -9797,6 +9797,15 @@ public class PackageManagerService extends IPackageManager.Stub { if (r1.system != r2.system) { return r1.system ? -1 : 1; } + if (r1.activityInfo != null) { + return r1.activityInfo.packageName.compareTo(r2.activityInfo.packageName); + } + if (r1.serviceInfo != null) { + return r1.serviceInfo.packageName.compareTo(r2.serviceInfo.packageName); + } + if (r1.providerInfo != null) { + return r1.providerInfo.packageName.compareTo(r2.providerInfo.packageName); + } return 0; } }; diff --git a/services/core/java/com/android/server/pm/PackageManagerShellCommand.java b/services/core/java/com/android/server/pm/PackageManagerShellCommand.java index f9ed7607f024..b18c84678a8e 100644 --- a/services/core/java/com/android/server/pm/PackageManagerShellCommand.java +++ b/services/core/java/com/android/server/pm/PackageManagerShellCommand.java @@ -103,11 +103,11 @@ class PackageManagerShellCommand extends ShellCommand { return runUninstall(); case "resolve-activity": return runResolveActivity(); - case "query-intent-activities": + case "query-activities": return runQueryIntentActivities(); - case "query-intent-services": + case "query-services": return runQueryIntentServices(); - case "query-intent-receivers": + case "query-receivers": return runQueryIntentReceivers(); default: return handleDefaultCommands(cmd); @@ -1043,13 +1043,13 @@ class PackageManagerShellCommand extends ShellCommand { pw.println(" -s: short summary"); pw.println(" -d: only list dangerous permissions"); pw.println(" -u: list only the permissions users will see"); - pw.println(" resolve-intent [--user USER_ID] INTENT"); + pw.println(" resolve-activity [--user USER_ID] INTENT"); pw.println(" Prints the activity that resolves to the given Intent."); - pw.println(" query-intent-activities [--user USER_ID] INTENT"); + pw.println(" query-activities [--user USER_ID] INTENT"); pw.println(" Prints all activities that can handle the given Intent."); - pw.println(" query-intent-services [--user USER_ID] INTENT"); + pw.println(" query-services [--user USER_ID] INTENT"); pw.println(" Prints all services that can handle the given Intent."); - pw.println(" query-intent-receivers [--user USER_ID] INTENT"); + pw.println(" query-receivers [--user USER_ID] INTENT"); pw.println(" Prints all broadcast receivers that can handle the given Intent."); pw.println(); Intent.printIntentArgsHelp(pw , ""); diff --git a/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionManagerServiceImpl.java b/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionManagerServiceImpl.java index 109d214e1167..3efd0fb7ad7a 100644 --- a/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionManagerServiceImpl.java +++ b/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionManagerServiceImpl.java @@ -266,8 +266,6 @@ class VoiceInteractionManagerServiceImpl implements VoiceInteractionSessionConne pw.print(" Session service="); pw.println(mInfo.getSessionService()); pw.println(" Service info:"); mInfo.getServiceInfo().dump(new PrintWriterPrinter(pw), " "); - pw.println(" Application info:"); - mInfo.getServiceInfo().applicationInfo.dump(new PrintWriterPrinter(pw), " "); pw.print(" Recognition service="); pw.println(mInfo.getRecognitionService()); pw.print(" Settings activity="); pw.println(mInfo.getSettingsActivity()); pw.print(" Supports assist="); pw.println(mInfo.getSupportsAssist()); |