diff options
| -rw-r--r-- | services/core/java/com/android/server/am/ComponentAliasResolver.java | 38 | ||||
| -rw-r--r-- | tests/componentalias/src/android/content/componentalias/tests/BaseComponentAliasTest.java | 10 |
2 files changed, 32 insertions, 16 deletions
diff --git a/services/core/java/com/android/server/am/ComponentAliasResolver.java b/services/core/java/com/android/server/am/ComponentAliasResolver.java index aef7a6c77b6f..cf910d45b632 100644 --- a/services/core/java/com/android/server/am/ComponentAliasResolver.java +++ b/services/core/java/com/android/server/am/ComponentAliasResolver.java @@ -41,6 +41,7 @@ import android.util.Slog; import com.android.internal.annotations.GuardedBy; import com.android.internal.content.PackageMonitor; import com.android.internal.os.BackgroundThread; +import com.android.server.FgThread; import com.android.server.LocalServices; import com.android.server.compat.CompatChange; import com.android.server.compat.PlatformCompat; @@ -53,17 +54,23 @@ import java.util.function.Supplier; /** * Manages and handles component aliases, which is an experimental feature. * - * For now, this is an experimental feature to evaluate feasibility, so the implementation is + * NOTE: THIS CLASS IS PURELY EXPERIMENTAL AND WILL BE REMOVED IN FUTURE ANDROID VERSIONS. + * DO NOT USE IT. + * + * "Component alias" allows an android manifest component (for now only broadcasts and services) + * to be defined in one android package while having the implementation in a different package. + * + * When/if this becomes a real feature, it will be most likely implemented very differently, + * which is why this shouldn't be used. + * + * For now, because this is an experimental feature to evaluate feasibility, the implementation is * "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. + * This feature is disabled by default. * - * 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. - * - Aliases can only be defined across packages that are atomically installed, and signed with the - * same key. + * Also, for now, aliases can be defined across packages with different certificates, but + * in a final version this will most likely be tightened. */ public class ComponentAliasResolver { private static final String TAG = "ComponentAliasResolver"; @@ -172,12 +179,17 @@ public class ComponentAliasResolver { USE_EXPERIMENTAL_COMPONENT_ALIAS, "android", UserHandle.USER_SYSTEM)); if (enabled != mEnabled) { Slog.i(TAG, (enabled ? "Enabling" : "Disabling") + " component aliases..."); - if (enabled) { - mPackageMonitor.register(mAm.mContext, UserHandle.ALL, - /* externalStorage= */ false, BackgroundThread.getHandler()); - } else { - mPackageMonitor.unregister(); - } + FgThread.getHandler().post(() -> { + // Registering/unregistering a receiver internally takes the AM lock, but AM + // calls into this class while holding the AM lock. So do it on a handler to + // avoid deadlocks. + if (enabled) { + mPackageMonitor.register(mAm.mContext, UserHandle.ALL, + /* externalStorage= */ false, BackgroundThread.getHandler()); + } else { + mPackageMonitor.unregister(); + } + }); } mEnabled = enabled; mEnabledByDeviceConfig = enabledByDeviceConfig; diff --git a/tests/componentalias/src/android/content/componentalias/tests/BaseComponentAliasTest.java b/tests/componentalias/src/android/content/componentalias/tests/BaseComponentAliasTest.java index 164f61c4c630..99322ee46106 100644 --- a/tests/componentalias/src/android/content/componentalias/tests/BaseComponentAliasTest.java +++ b/tests/componentalias/src/android/content/componentalias/tests/BaseComponentAliasTest.java @@ -46,11 +46,15 @@ public class BaseComponentAliasTest { sDeviceConfig.set("enable_experimental_component_alias", ""); sDeviceConfig.set("component_alias_overrides", ""); - // Make sure the feature is actually enabled. + // Make sure the feature is actually enabled, and the aliases are loaded. TestUtils.waitUntil("Wait until component alias is actually enabled", () -> { - return ShellUtils.runShellCommand("dumpsys activity component-alias") - .indexOf("Enabled: true") > 0; + String out = ShellUtils.runShellCommand("dumpsys activity component-alias"); + + return out.contains("Enabled: true") + && out.contains("android.content.componentalias.tests/.b.Alias04") + && out.contains("android.content.componentalias.tests/.s.Alias04"); }); + ShellUtils.runShellCommand("am wait-for-broadcast-idle"); } @AfterClass |