Merge "Adding flag configuration for runtime receiver enforcement."

This commit is contained in:
TreeHugger Robot
2022-10-06 13:45:53 +00:00
committed by Android (Google) Code Review
2 changed files with 31 additions and 3 deletions

View File

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

View File

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