From 94695ee51b699ee43b3e3cd0b4f980fdda227ca7 Mon Sep 17 00:00:00 2001 From: Makoto Onuki Date: Thu, 3 Feb 2022 10:19:58 -0800 Subject: [PATCH] Allow enabling component-alias via device config, on userdebug or eng devices Bug: 196254758 Test: atest ComponentAliasTests Change-Id: Idcfbb2d8e269a8c8d4e29f54c57a1f3d08408b28 --- .../server/am/ActivityManagerConstants.java | 17 ++++- .../server/am/ActivityManagerService.java | 3 +- .../server/am/ComponentAliasResolver.java | 21 +++++-- tests/componentalias/AndroidTest-template.xml | 2 - .../tests/BaseComponentAliasTest.java | 10 ++- ...ponentAliasEnableWithDeviceConfigTest.java | 63 +++++++++++++++++++ ...onentAliasNotSupportedOnUserBuildTest.java | 60 ++++++++++++++++++ 7 files changed, 165 insertions(+), 11 deletions(-) create mode 100644 tests/componentalias/src/android/content/componentalias/tests/ComponentAliasEnableWithDeviceConfigTest.java create mode 100644 tests/componentalias/src/android/content/componentalias/tests/ComponentAliasNotSupportedOnUserBuildTest.java diff --git a/services/core/java/com/android/server/am/ActivityManagerConstants.java b/services/core/java/com/android/server/am/ActivityManagerConstants.java index bcb1be39d1b14..940ad73eee98c 100644 --- a/services/core/java/com/android/server/am/ActivityManagerConstants.java +++ b/services/core/java/com/android/server/am/ActivityManagerConstants.java @@ -123,6 +123,7 @@ final class ActivityManagerConstants extends ContentObserver { static final String KEY_KILL_BG_RESTRICTED_CACHED_IDLE = "kill_bg_restricted_cached_idle"; static final String KEY_KILL_BG_RESTRICTED_CACHED_IDLE_SETTLE_TIME = "kill_bg_restricted_cached_idle_settle_time"; + static final String KEY_ENABLE_COMPONENT_ALIAS = "enable_experimental_component_alias"; static final String KEY_COMPONENT_ALIAS_OVERRIDES = "component_alias_overrides"; private static final int DEFAULT_MAX_CACHED_PROCESSES = 32; @@ -199,6 +200,7 @@ final class ActivityManagerConstants extends ContentObserver { * Whether or not to enable the extra delays to service restarts on memory pressure. */ private static final boolean DEFAULT_ENABLE_EXTRA_SERVICE_RESTART_DELAY_ON_MEM_PRESSURE = true; + private static final boolean DEFAULT_ENABLE_COMPONENT_ALIAS = false; private static final String DEFAULT_COMPONENT_ALIAS_OVERRIDES = ""; // Flag stored in the DeviceConfig API. @@ -594,6 +596,12 @@ final class ActivityManagerConstants extends ContentObserver { boolean mEnableExtraServiceRestartDelayOnMemPressure = DEFAULT_ENABLE_EXTRA_SERVICE_RESTART_DELAY_ON_MEM_PRESSURE; + /** + * Whether to enable "component alias" experimental feature. This can only be enabled + * on userdebug or eng builds. + */ + volatile boolean mEnableComponentAlias = DEFAULT_ENABLE_COMPONENT_ALIAS; + /** * Defines component aliases. Format * ComponentName ":" ComponentName ( "," ComponentName ":" ComponentName )* @@ -831,6 +839,7 @@ final class ActivityManagerConstants extends ContentObserver { case KEY_ENABLE_EXTRA_SERVICE_RESTART_DELAY_ON_MEM_PRESSURE: updateEnableExtraServiceRestartDelayOnMemPressure(); break; + case KEY_ENABLE_COMPONENT_ALIAS: case KEY_COMPONENT_ALIAS_OVERRIDES: updateComponentAliases(); break; @@ -1269,11 +1278,15 @@ final class ActivityManagerConstants extends ContentObserver { } private void updateComponentAliases() { + mEnableComponentAlias = DeviceConfig.getBoolean( + DeviceConfig.NAMESPACE_ACTIVITY_MANAGER, + KEY_ENABLE_COMPONENT_ALIAS, + DEFAULT_ENABLE_COMPONENT_ALIAS); mComponentAliasOverrides = DeviceConfig.getString( DeviceConfig.NAMESPACE_ACTIVITY_MANAGER, KEY_COMPONENT_ALIAS_OVERRIDES, DEFAULT_COMPONENT_ALIAS_OVERRIDES); - mService.mComponentAliasResolver.update(mComponentAliasOverrides); + mService.mComponentAliasResolver.update(mEnableComponentAlias, mComponentAliasOverrides); } private void updateProcessKillTimeout() { @@ -1512,6 +1525,8 @@ final class ActivityManagerConstants extends ContentObserver { pw.print("="); pw.println(mPushMessagingOverQuotaBehavior); pw.print(" "); pw.print(KEY_FGS_ALLOW_OPT_OUT); pw.print("="); pw.println(mFgsAllowOptOut); + pw.print(" "); pw.print(KEY_ENABLE_COMPONENT_ALIAS); + pw.print("="); pw.println(mEnableComponentAlias); pw.print(" "); pw.print(KEY_COMPONENT_ALIAS_OVERRIDES); pw.print("="); pw.println(mComponentAliasOverrides); diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java index 442b9de9911de..20606a6f61b3f 100644 --- a/services/core/java/com/android/server/am/ActivityManagerService.java +++ b/services/core/java/com/android/server/am/ActivityManagerService.java @@ -8051,7 +8051,8 @@ public class ActivityManagerService extends IActivityManager.Stub // Load the component aliases. t.traceBegin("componentAlias"); - mComponentAliasResolver.onSystemReady(mConstants.mComponentAliasOverrides); + mComponentAliasResolver.onSystemReady(mConstants.mEnableComponentAlias, + mConstants.mComponentAliasOverrides); t.traceEnd(); // componentAlias t.traceEnd(); // PhaseActivityManagerReady diff --git a/services/core/java/com/android/server/am/ComponentAliasResolver.java b/services/core/java/com/android/server/am/ComponentAliasResolver.java index 23553a7cf12ab..aef7a6c77b6f7 100644 --- a/services/core/java/com/android/server/am/ComponentAliasResolver.java +++ b/services/core/java/com/android/server/am/ComponentAliasResolver.java @@ -30,6 +30,7 @@ import android.content.pm.PackageManagerInternal; import android.content.pm.ResolveInfo; import android.content.pm.ServiceInfo; import android.os.Binder; +import android.os.Build; import android.os.ServiceManager; import android.os.UserHandle; import android.text.TextUtils; @@ -56,6 +57,8 @@ import java.util.function.Supplier; * "quick & dirty". For example, to define aliases, we use a regular intent filter and meta-data * in the manifest, instead of adding proper tags/attributes to AndroidManifest.xml. * + * Because it's an experimental feature, it can't be enabled on a user build. + * * Also, for now, aliases can be defined across any packages, but in the final version, there'll * be restrictions: * - We probably should only allow either privileged or preinstalled apps. @@ -77,6 +80,9 @@ public class ComponentAliasResolver { private final ActivityManagerService mAm; private final Context mContext; + @GuardedBy("mLock") + private boolean mEnabledByDeviceConfig; + @GuardedBy("mLock") private boolean mEnabled; @@ -141,7 +147,7 @@ public class ComponentAliasResolver { /** * Call this on systemRead(). */ - public void onSystemReady(String overrides) { + public void onSystemReady(boolean enabledByDeviceConfig, String overrides) { synchronized (mLock) { mPlatformCompat = (PlatformCompat) ServiceManager.getService( Context.PLATFORM_COMPAT_SERVICE); @@ -149,19 +155,21 @@ public class ComponentAliasResolver { mCompatChangeListener); } if (DEBUG) Slog.d(TAG, "Compat listener set."); - update(overrides); + update(enabledByDeviceConfig, overrides); } /** * (Re-)loads aliases from and the device config override. */ - public void update(String overrides) { + public void update(boolean enabledByDeviceConfig, String overrides) { synchronized (mLock) { if (mPlatformCompat == null) { return; // System not ready. } - final boolean enabled = mPlatformCompat.isChangeEnabledByPackageName( - USE_EXPERIMENTAL_COMPONENT_ALIAS, "android", UserHandle.USER_SYSTEM); + final boolean enabled = Build.isDebuggable() + && (enabledByDeviceConfig + || mPlatformCompat.isChangeEnabledByPackageName( + USE_EXPERIMENTAL_COMPONENT_ALIAS, "android", UserHandle.USER_SYSTEM)); if (enabled != mEnabled) { Slog.i(TAG, (enabled ? "Enabling" : "Disabling") + " component aliases..."); if (enabled) { @@ -172,6 +180,7 @@ public class ComponentAliasResolver { } } mEnabled = enabled; + mEnabledByDeviceConfig = enabledByDeviceConfig; mOverrideString = overrides; if (mEnabled) { @@ -184,7 +193,7 @@ public class ComponentAliasResolver { private void refresh() { synchronized (mLock) { - update(mOverrideString); + update(mEnabledByDeviceConfig, mOverrideString); } } diff --git a/tests/componentalias/AndroidTest-template.xml b/tests/componentalias/AndroidTest-template.xml index 2d46217023290..afdfe79ea4a4a 100644 --- a/tests/componentalias/AndroidTest-template.xml +++ b/tests/componentalias/AndroidTest-template.xml @@ -21,8 +21,6 @@