diff options
| -rw-r--r-- | services/core/java/com/android/server/am/ActivityManagerConstants.java | 27 | ||||
| -rw-r--r-- | services/core/java/com/android/server/am/ActivityManagerService.java | 7 |
2 files changed, 31 insertions, 3 deletions
diff --git a/services/core/java/com/android/server/am/ActivityManagerConstants.java b/services/core/java/com/android/server/am/ActivityManagerConstants.java index 5e7d814b241b..16fe121fecb7 100644 --- a/services/core/java/com/android/server/am/ActivityManagerConstants.java +++ b/services/core/java/com/android/server/am/ActivityManagerConstants.java @@ -735,6 +735,9 @@ final class ActivityManagerConstants extends ContentObserver { // initialized in the constructor. public int CUR_MAX_EMPTY_PROCESSES; + /** @see mEnforceReceiverExportedFlagRequirement */ + private static final String KEY_ENFORCE_RECEIVER_EXPORTED_FLAG_REQUIREMENT = + "enforce_exported_flag_requirement"; /** @see #mNoKillCachedProcessesUntilBootCompleted */ private static final String KEY_NO_KILL_CACHED_PROCESSES_UNTIL_BOOT_COMPLETED = @@ -744,6 +747,9 @@ final class ActivityManagerConstants extends ContentObserver { private static final String KEY_NO_KILL_CACHED_PROCESSES_POST_BOOT_COMPLETED_DURATION_MILLIS = "no_kill_cached_processes_post_boot_completed_duration_millis"; + /** @see mEnforceReceiverExportedFlagRequirement */ + private static final boolean DEFAULT_ENFORCE_RECEIVER_EXPORTED_FLAG_REQUIREMENT = false; + /** @see #mNoKillCachedProcessesUntilBootCompleted */ private static final boolean DEFAULT_NO_KILL_CACHED_PROCESSES_UNTIL_BOOT_COMPLETED = true; @@ -752,6 +758,15 @@ final class ActivityManagerConstants extends ContentObserver { DEFAULT_NO_KILL_CACHED_PROCESSES_POST_BOOT_COMPLETED_DURATION_MILLIS = 600_000; /** + * If true, enforce the requirement that dynamically registered receivers specify one of + * {@link android.content.Context#RECEIVER_EXPORTED} or + * {@link android.content.Context#RECEIVER_NOT_EXPORTED} if registering for any non-system + * broadcasts. + */ + volatile boolean mEnforceReceiverExportedFlagRequirement = + DEFAULT_ENFORCE_RECEIVER_EXPORTED_FLAG_REQUIREMENT; + + /** * If true, do not kill excessive cached processes proactively, until user-0 is unlocked. * @see #mNoKillCachedProcessesPostBootCompletedDurationMillis */ @@ -1010,6 +1025,9 @@ final class ActivityManagerConstants extends ContentObserver { case KEY_NO_KILL_CACHED_PROCESSES_UNTIL_BOOT_COMPLETED: updateNoKillCachedProcessesUntilBootCompleted(); break; + case KEY_ENFORCE_RECEIVER_EXPORTED_FLAG_REQUIREMENT: + updateEnforceReceiverExportedFlagRequirement(); + break; case KEY_NO_KILL_CACHED_PROCESSES_POST_BOOT_COMPLETED_DURATION_MILLIS: updateNoKillCachedProcessesPostBootCompletedDurationMillis(); break; @@ -1482,6 +1500,13 @@ final class ActivityManagerConstants extends ContentObserver { DEFAULT_DEFER_BOOT_COMPLETED_BROADCAST); } + private void updateEnforceReceiverExportedFlagRequirement() { + mEnforceReceiverExportedFlagRequirement = DeviceConfig.getBoolean( + DeviceConfig.NAMESPACE_ACTIVITY_MANAGER, + KEY_ENFORCE_RECEIVER_EXPORTED_FLAG_REQUIREMENT, + DEFAULT_ENFORCE_RECEIVER_EXPORTED_FLAG_REQUIREMENT); + } + private void updateNoKillCachedProcessesUntilBootCompleted() { mNoKillCachedProcessesUntilBootCompleted = DeviceConfig.getBoolean( DeviceConfig.NAMESPACE_ACTIVITY_MANAGER, @@ -1819,6 +1844,8 @@ final class ActivityManagerConstants extends ContentObserver { pw.print("="); pw.println(mPrioritizeAlarmBroadcasts); pw.print(" "); pw.print(KEY_NO_KILL_CACHED_PROCESSES_UNTIL_BOOT_COMPLETED); pw.print("="); pw.println(mNoKillCachedProcessesUntilBootCompleted); + pw.print(" "); pw.print(KEY_ENFORCE_RECEIVER_EXPORTED_FLAG_REQUIREMENT); + pw.print("="); pw.println(mEnforceReceiverExportedFlagRequirement); pw.print(" "); pw.print(KEY_NO_KILL_CACHED_PROCESSES_POST_BOOT_COMPLETED_DURATION_MILLIS); pw.print("="); pw.println(mNoKillCachedProcessesPostBootCompletedDurationMillis); pw.print(" "); pw.print(KEY_MAX_EMPTY_TIME_MILLIS); diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java index f341072877d0..5c1031a659cf 100644 --- a/services/core/java/com/android/server/am/ActivityManagerService.java +++ b/services/core/java/com/android/server/am/ActivityManagerService.java @@ -215,8 +215,8 @@ import android.app.usage.UsageStatsManagerInternal; import android.appwidget.AppWidgetManager; import android.appwidget.AppWidgetManagerInternal; import android.compat.annotation.ChangeId; -import android.compat.annotation.Disabled; import android.compat.annotation.EnabledAfter; +import android.compat.annotation.EnabledSince; import android.content.AttributionSource; import android.content.AutofillOptions; import android.content.BroadcastReceiver; @@ -588,7 +588,7 @@ public class ActivityManagerService extends IActivityManager.Stub * unprotected broadcast in code. */ @ChangeId - @Disabled + @EnabledSince(targetSdkVersion = Build.VERSION_CODES.UPSIDE_DOWN_CAKE) private static final long DYNAMIC_RECEIVER_EXPLICIT_EXPORT_REQUIRED = 161145287L; /** @@ -13443,7 +13443,8 @@ public class ActivityManagerService extends IActivityManager.Stub // broadcasts, or the receiver is null (a sticky broadcast). Sticky broadcasts should // not be used generally, so we will be marking them as exported by default final boolean requireExplicitFlagForDynamicReceivers = CompatChanges.isChangeEnabled( - DYNAMIC_RECEIVER_EXPLICIT_EXPORT_REQUIRED, callingUid); + DYNAMIC_RECEIVER_EXPLICIT_EXPORT_REQUIRED, callingUid) + && mConstants.mEnforceReceiverExportedFlagRequirement; if (!onlyProtectedBroadcasts) { if (receiver == null && !explicitExportStateDefined) { // sticky broadcast, no flag specified (flag isn't required) |