Merge "Adding flag configuration for runtime receiver enforcement."
This commit is contained in:
committed by
Android (Google) Code Review
commit
cc3e5be1a4
@@ -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;
|
||||
|
||||
@@ -751,6 +757,15 @@ final class ActivityManagerConstants extends ContentObserver {
|
||||
private static final long
|
||||
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);
|
||||
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user