diff --git a/services/core/java/com/android/server/am/ComponentAliasResolver.java b/services/core/java/com/android/server/am/ComponentAliasResolver.java
index 01735a7..f9eaf02 100644
--- a/services/core/java/com/android/server/am/ComponentAliasResolver.java
+++ b/services/core/java/com/android/server/am/ComponentAliasResolver.java
@@ -30,7 +30,6 @@
 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;
@@ -43,7 +42,6 @@
 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;
 
 import java.io.PrintWriter;
@@ -52,26 +50,11 @@
 import java.util.function.Supplier;
 
 /**
- * Manages and handles component aliases, which is an experimental feature.
+ * @deprecated This feature is no longer used. Delete this class.
  *
- * 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.
- *
- * This feature is disabled by default.
- *
- * Also, for now, aliases can be defined across packages with different certificates, but
- * in a final version this will most likely be tightened.
+ * Also delete Intnt.(set|get)OriginalIntent.
  */
+@Deprecated
 public class ComponentAliasResolver {
     private static final String TAG = "ComponentAliasResolver";
     private static final boolean DEBUG = true;
@@ -149,11 +132,6 @@
         }
     };
 
-    private final CompatChange.ChangeListener mCompatChangeListener = (packageName) -> {
-        if (DEBUG) Slog.d(TAG, "USE_EXPERIMENTAL_COMPONENT_ALIAS changed.");
-        BackgroundThread.getHandler().post(this::refresh);
-    };
-
     /**
      * Call this on systemRead().
      */
@@ -161,8 +139,6 @@
         synchronized (mLock) {
             mPlatformCompat = (PlatformCompat) ServiceManager.getService(
                     Context.PLATFORM_COMPAT_SERVICE);
-            mPlatformCompat.registerListener(USE_EXPERIMENTAL_COMPONENT_ALIAS,
-                    mCompatChangeListener);
         }
         if (DEBUG) Slog.d(TAG, "Compat listener set.");
         update(enabledByDeviceConfig, overrides);
@@ -176,10 +152,8 @@
             if (mPlatformCompat == null) {
                 return; // System not ready.
             }
-            final boolean enabled = Build.isDebuggable()
-                    && (enabledByDeviceConfig
-                        || mPlatformCompat.isChangeEnabledByPackageName(
-                        USE_EXPERIMENTAL_COMPONENT_ALIAS, "android", UserHandle.USER_SYSTEM));
+            // Never enable it.
+            final boolean enabled = false;
             if (enabled != mEnabled) {
                 Slog.i(TAG, (enabled ? "Enabling" : "Disabling") + " component aliases...");
                 FgThread.getHandler().post(() -> {
diff --git a/tests/componentalias/Android.bp b/tests/componentalias/Android.bp
index 9f70387..01d34e4 100644
--- a/tests/componentalias/Android.bp
+++ b/tests/componentalias/Android.bp
@@ -16,6 +16,9 @@
     default_applicable_licenses: ["Android-Apache-2.0"],
 }
 
+// TODO: Delete this file. It's no longer needed, but removing it on udc-dev will cause
+// a conflict on master.
+
 java_defaults {
     name: "ComponentAliasTests_defaults",
     static_libs: [
@@ -33,54 +36,3 @@
     ],
     platform_apis: true, // We use hidden APIs in the test.
 }
-
-// We build three APKs from the exact same source files, so these APKs contain the exact same tests.
-// And we run the tests on each APK, so that we can test various situations:
-// - When the alias is in the same package, target in the same package.
-// - When the alias is in the same package, target in another package.
-// - When the alias is in another package, which also contains the target.
-// - When the alias is in another package, and the target is in yet another package.
-// etc etc...
-
-android_test {
-    name: "ComponentAliasTests",
-    defaults: [
-        "ComponentAliasTests_defaults",
-    ],
-    package_name: "android.content.componentalias.tests",
-    manifest: "AndroidManifest.xml",
-    additional_manifests: [
-        "AndroidManifest_main.xml",
-        "AndroidManifest_service_aliases.xml",
-        "AndroidManifest_service_targets.xml",
-    ],
-    test_config_template: "AndroidTest-template.xml",
-}
-
-android_test {
-    name: "ComponentAliasTests1",
-    defaults: [
-        "ComponentAliasTests_defaults",
-    ],
-    package_name: "android.content.componentalias.tests.sub1",
-    manifest: "AndroidManifest.xml",
-    additional_manifests: [
-        "AndroidManifest_sub1.xml",
-        "AndroidManifest_service_targets.xml",
-    ],
-    test_config_template: "AndroidTest-template.xml",
-}
-
-android_test {
-    name: "ComponentAliasTests2",
-    defaults: [
-        "ComponentAliasTests_defaults",
-    ],
-    package_name: "android.content.componentalias.tests.sub2",
-    manifest: "AndroidManifest.xml",
-    additional_manifests: [
-        "AndroidManifest_sub2.xml",
-        "AndroidManifest_service_targets.xml",
-    ],
-    test_config_template: "AndroidTest-template.xml",
-}
diff --git a/tests/componentalias/AndroidManifest.xml b/tests/componentalias/AndroidManifest.xml
deleted file mode 100755
index 7bb83a3..0000000
--- a/tests/componentalias/AndroidManifest.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- * Copyright (C) 2021 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- -->
-
-<manifest xmlns:android="http://schemas.android.com/apk/res/android"
-    package="android.content.componentalias.tests" >
-
-    <application>
-        <uses-library android:name="android.test.runner" />
-        <property android:name="com.android.EXPERIMENTAL_COMPONENT_ALIAS_OPT_IN" android:value="true" />
-    </application>
-</manifest>
diff --git a/tests/componentalias/AndroidManifest_main.xml b/tests/componentalias/AndroidManifest_main.xml
deleted file mode 100755
index 70e817e..0000000
--- a/tests/componentalias/AndroidManifest_main.xml
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- * Copyright (C) 2021 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- -->
-
-<manifest xmlns:android="http://schemas.android.com/apk/res/android"
-    package="android.content.componentalias.tests" >
-
-    <application>
-    </application>
-
-    <instrumentation
-        android:name="androidx.test.runner.AndroidJUnitRunner"
-        android:targetPackage="android.content.componentalias.tests" >
-    </instrumentation>
-</manifest>
diff --git a/tests/componentalias/AndroidManifest_service_aliases.xml b/tests/componentalias/AndroidManifest_service_aliases.xml
deleted file mode 100644
index c96f173..0000000
--- a/tests/componentalias/AndroidManifest_service_aliases.xml
+++ /dev/null
@@ -1,81 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- * Copyright (C) 2021 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- -->
-<manifest xmlns:android="http://schemas.android.com/apk/res/android"
-    package="android.content.componentalias.tests" >
-    <application>
-        <!--
-            Note the alias components are essentially just placeholders, so the APKs don't have to
-            have the implementation classes.
-        -->
-        <service android:name=".s.Alias00" android:exported="true" android:enabled="true" >
-            <meta-data android:name="alias_target" android:value="android.content.componentalias.tests/android.content.componentalias.tests.s.Target00" />
-            <intent-filter><action android:name="com.android.intent.action.EXPERIMENTAL_IS_ALIAS" /></intent-filter>
-            <intent-filter><action android:name="android.content.componentalias.tests.IS_ALIAS_00" /></intent-filter>
-        </service>
-        <service android:name=".s.Alias01" android:exported="true" android:enabled="true" >
-            <meta-data android:name="alias_target" android:value="android.content.componentalias.tests.sub1/android.content.componentalias.tests.s.Target01" />
-            <intent-filter><action android:name="com.android.intent.action.EXPERIMENTAL_IS_ALIAS" /></intent-filter>
-            <intent-filter><action android:name="android.content.componentalias.tests.IS_ALIAS_01" /></intent-filter>
-        </service>
-        <service android:name=".s.Alias02" android:exported="true" android:enabled="true" >
-            <meta-data android:name="alias_target" android:value="android.content.componentalias.tests.sub2/android.content.componentalias.tests.s.Target02" />
-            <intent-filter><action android:name="com.android.intent.action.EXPERIMENTAL_IS_ALIAS" /></intent-filter>
-            <intent-filter><action android:name="android.content.componentalias.tests.IS_ALIAS_02" /></intent-filter>
-        </service>
-        <service android:name=".s.Alias03" android:exported="true" android:enabled="true" >
-            <meta-data android:name="alias_target" android:value="android.content.componentalias.tests.sub1/android.content.componentalias.tests.s.Target03" />
-            <intent-filter><action android:name="com.android.intent.action.EXPERIMENTAL_IS_ALIAS" /></intent-filter>
-            <intent-filter><action android:name="android.content.componentalias.tests.IS_ALIAS_03" /></intent-filter>
-        </service>
-        <service android:name=".s.Alias04" android:exported="true" android:enabled="true" >
-            <meta-data android:name="alias_target" android:value="android.content.componentalias.tests.sub2/android.content.componentalias.tests.s.Target04" />
-            <intent-filter><action android:name="com.android.intent.action.EXPERIMENTAL_IS_ALIAS" /></intent-filter>
-            <intent-filter><action android:name="android.content.componentalias.tests.IS_ALIAS_04" /></intent-filter>
-        </service>
-
-        <receiver android:name=".b.Alias00" android:exported="true" android:enabled="true" >
-            <meta-data android:name="alias_target" android:value="android.content.componentalias.tests/android.content.componentalias.tests.b.Target00" />
-            <intent-filter><action android:name="com.android.intent.action.EXPERIMENTAL_IS_ALIAS" /></intent-filter>
-            <intent-filter><action android:name="android.content.componentalias.tests.IS_RECEIVER_00" /></intent-filter>
-            <intent-filter><action android:name="ACTION_BROADCAST" /></intent-filter>
-        </receiver>
-        <receiver android:name=".b.Alias01" android:exported="true" android:enabled="true" >
-            <meta-data android:name="alias_target" android:value="android.content.componentalias.tests.sub1/android.content.componentalias.tests.b.Target01" />
-            <intent-filter><action android:name="com.android.intent.action.EXPERIMENTAL_IS_ALIAS" /></intent-filter>
-            <intent-filter><action android:name="android.content.componentalias.tests.IS_RECEIVER_01" /></intent-filter>
-            <intent-filter><action android:name="ACTION_BROADCAST" /></intent-filter>
-        </receiver>
-        <receiver android:name=".b.Alias02" android:exported="true" android:enabled="true" >
-            <meta-data android:name="alias_target" android:value="android.content.componentalias.tests.sub2/android.content.componentalias.tests.b.Target02" />
-            <intent-filter><action android:name="com.android.intent.action.EXPERIMENTAL_IS_ALIAS" /></intent-filter>
-            <intent-filter><action android:name="android.content.componentalias.tests.IS_RECEIVER_02" /></intent-filter>
-            <intent-filter><action android:name="ACTION_BROADCAST" /></intent-filter>
-        </receiver>
-        <receiver android:name=".b.Alias03" android:exported="true" android:enabled="true" >
-            <meta-data android:name="alias_target" android:value="android.content.componentalias.tests.sub1/android.content.componentalias.tests.b.Target03" />
-            <intent-filter><action android:name="com.android.intent.action.EXPERIMENTAL_IS_ALIAS" /></intent-filter>
-            <intent-filter><action android:name="android.content.componentalias.tests.IS_RECEIVER_03" /></intent-filter>
-            <intent-filter><action android:name="ACTION_BROADCAST" /></intent-filter>
-        </receiver>
-        <receiver android:name=".b.Alias04" android:exported="true" android:enabled="true" >
-            <meta-data android:name="alias_target" android:value="android.content.componentalias.tests.sub2/android.content.componentalias.tests.b.Target04" />
-            <intent-filter><action android:name="com.android.intent.action.EXPERIMENTAL_IS_ALIAS" /></intent-filter>
-            <intent-filter><action android:name="android.content.componentalias.tests.IS_RECEIVER_04" /></intent-filter>
-            <intent-filter><action android:name="ACTION_BROADCAST" /></intent-filter>
-        </receiver>
-    </application>
-</manifest>
diff --git a/tests/componentalias/AndroidManifest_service_targets.xml b/tests/componentalias/AndroidManifest_service_targets.xml
deleted file mode 100644
index 24c0432..0000000
--- a/tests/componentalias/AndroidManifest_service_targets.xml
+++ /dev/null
@@ -1,57 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- * Copyright (C) 2021 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- -->
-<manifest xmlns:android="http://schemas.android.com/apk/res/android"
-    package="android.content.componentalias.tests" >
-    <application>
-        <service android:name=".s.Target00" android:exported="true" android:enabled="true" >
-        </service>
-        <service android:name=".s.Target01" android:exported="true" android:enabled="true" >
-        </service>
-        <service android:name=".s.Target02" android:exported="true" android:enabled="true" >
-        </service>
-        <service android:name=".s.Target03" android:exported="true" android:enabled="true" >
-        </service>
-        <service android:name=".s.Target04" android:exported="true" android:enabled="true" >
-        </service>
-
-        <!--
-            Due to http://go/intents-match-intent-filters-guide, the target intent has to have
-            an intent filter that matches the original intent. (modulo the package name)
-            This restriction shouldn't exist in the final version.
-        -->
-        <receiver android:name=".b.Target00" android:exported="true" android:enabled="true" >
-            <intent-filter><action android:name="android.content.componentalias.tests.IS_RECEIVER_00" /></intent-filter>
-            <intent-filter><action android:name="ACTION_BROADCAST" /></intent-filter>
-        </receiver>
-        <receiver android:name=".b.Target01" android:exported="true" android:enabled="true" >
-            <intent-filter><action android:name="android.content.componentalias.tests.IS_RECEIVER_01" /></intent-filter>
-            <intent-filter><action android:name="ACTION_BROADCAST" /></intent-filter>
-        </receiver>
-        <receiver android:name=".b.Target02" android:exported="true" android:enabled="true" >
-            <intent-filter><action android:name="android.content.componentalias.tests.IS_RECEIVER_02" /></intent-filter>
-            <intent-filter><action android:name="ACTION_BROADCAST" /></intent-filter>
-        </receiver>
-        <receiver android:name=".b.Target03" android:exported="true" android:enabled="true" >
-            <intent-filter><action android:name="android.content.componentalias.tests.IS_RECEIVER_03" /></intent-filter>
-            <intent-filter><action android:name="ACTION_BROADCAST" /></intent-filter>
-        </receiver>
-        <receiver android:name=".b.Target04" android:exported="true" android:enabled="true" >
-            <intent-filter><action android:name="android.content.componentalias.tests.IS_RECEIVER_04" /></intent-filter>
-            <intent-filter><action android:name="ACTION_BROADCAST" /></intent-filter>
-        </receiver>
-    </application>
-</manifest>
diff --git a/tests/componentalias/AndroidManifest_sub1.xml b/tests/componentalias/AndroidManifest_sub1.xml
deleted file mode 100755
index 21616f5..0000000
--- a/tests/componentalias/AndroidManifest_sub1.xml
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- * Copyright (C) 2021 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- -->
-
-<manifest xmlns:android="http://schemas.android.com/apk/res/android"
-    package="android.content.componentalias.tests" >
-
-    <application>
-    </application>
-
-    <instrumentation
-        android:name="androidx.test.runner.AndroidJUnitRunner"
-        android:targetPackage="android.content.componentalias.tests.sub1" >
-    </instrumentation>
-</manifest>
diff --git a/tests/componentalias/AndroidManifest_sub2.xml b/tests/componentalias/AndroidManifest_sub2.xml
deleted file mode 100755
index c11b0cd..0000000
--- a/tests/componentalias/AndroidManifest_sub2.xml
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- * Copyright (C) 2021 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- -->
-
-<manifest xmlns:android="http://schemas.android.com/apk/res/android"
-    package="android.content.componentalias.tests" >
-
-    <application>
-    </application>
-
-    <instrumentation
-        android:name="androidx.test.runner.AndroidJUnitRunner"
-        android:targetPackage="android.content.componentalias.tests.sub2" >
-    </instrumentation>
-</manifest>
diff --git a/tests/componentalias/AndroidTest-template.xml b/tests/componentalias/AndroidTest-template.xml
deleted file mode 100644
index afdfe79..0000000
--- a/tests/componentalias/AndroidTest-template.xml
+++ /dev/null
@@ -1,38 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2021 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-
-          http://www.apache.org/licenses/LICENSE-2.0
-
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
--->
-<configuration>
-    <target_preparer class="com.android.tradefed.targetprep.suite.SuiteApkInstaller">
-        <option name="cleanup-apks" value="true" />
-        <option name="test-file-name" value="ComponentAliasTests.apk" />
-        <option name="test-file-name" value="ComponentAliasTests1.apk" />
-        <option name="test-file-name" value="ComponentAliasTests2.apk" />
-    </target_preparer>
-    <target_preparer class="com.android.tradefed.targetprep.RunCommandTargetPreparer">
-        <!-- Exempt the helper APKs from the BG restriction, so they can start BG services. -->
-        <option name="run-command" value="cmd deviceidle whitelist +android.content.componentalias.tests" />
-        <option name="run-command" value="cmd deviceidle whitelist +android.content.componentalias.tests.sub1" />
-        <option name="run-command" value="cmd deviceidle whitelist +android.content.componentalias.tests.sub2" />
-
-        <option name="teardown-command" value="cmd deviceidle whitelist -android.content.componentalias.tests" />
-        <option name="teardown-command" value="cmd deviceidle whitelist -android.content.componentalias.tests.sub1" />
-        <option name="teardown-command" value="cmd deviceidle whitelist -android.content.componentalias.tests.sub2" />
-    </target_preparer>
-    <test class="com.android.tradefed.testtype.AndroidJUnitTest" >
-        <option name="package" value="{PACKAGE}" />
-        <option name="runtime-hint" value="2m" />
-        <option name="isolated-storage" value="false" />
-    </test>
-</configuration>
diff --git a/tests/componentalias/src/android/content/componentalias/tests/BaseComponentAliasTest.java b/tests/componentalias/src/android/content/componentalias/tests/BaseComponentAliasTest.java
deleted file mode 100644
index 99322ee..0000000
--- a/tests/componentalias/src/android/content/componentalias/tests/BaseComponentAliasTest.java
+++ /dev/null
@@ -1,103 +0,0 @@
-/*
- * Copyright (C) 2021 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package android.content.componentalias.tests;
-
-import android.content.ComponentName;
-import android.content.Context;
-import android.os.Build;
-import android.provider.DeviceConfig;
-import android.util.Log;
-
-import androidx.test.InstrumentationRegistry;
-
-import com.android.compatibility.common.util.DeviceConfigStateHelper;
-import com.android.compatibility.common.util.ShellUtils;
-import com.android.compatibility.common.util.TestUtils;
-
-import org.junit.AfterClass;
-import org.junit.Assume;
-import org.junit.Before;
-
-import java.util.function.Consumer;
-
-public class BaseComponentAliasTest {
-    protected static final Context sContext = InstrumentationRegistry.getTargetContext();
-
-    protected static final DeviceConfigStateHelper sDeviceConfig = new DeviceConfigStateHelper(
-            DeviceConfig.NAMESPACE_ACTIVITY_MANAGER_COMPONENT_ALIAS);
-    @Before
-    public void enableComponentAliasWithCompatFlag() throws Exception {
-        Assume.assumeTrue(Build.isDebuggable());
-        ShellUtils.runShellCommand(
-                "am compat enable --no-kill USE_EXPERIMENTAL_COMPONENT_ALIAS android");
-        sDeviceConfig.set("enable_experimental_component_alias", "");
-        sDeviceConfig.set("component_alias_overrides", "");
-
-        // Make sure the feature is actually enabled, and the aliases are loaded.
-        TestUtils.waitUntil("Wait until component alias is actually enabled", () -> {
-            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
-    public static void restoreDeviceConfig() throws Exception {
-        ShellUtils.runShellCommand(
-                "am compat disable --no-kill USE_EXPERIMENTAL_COMPONENT_ALIAS android");
-        sDeviceConfig.close();
-    }
-
-    protected static void log(String message) {
-        Log.i(ComponentAliasTestCommon.TAG, "[" + sContext.getPackageName() + "] " + message);
-    }
-
-    /**
-     * Defines a test target.
-     */
-    public static class Combo {
-        public final ComponentName alias;
-        public final ComponentName target;
-        public final String action;
-
-        public Combo(ComponentName alias, ComponentName target, String action) {
-            this.alias = alias;
-            this.target = target;
-            this.action = action;
-        }
-
-        @Override
-        public String toString() {
-            return "Combo{"
-                    + "alias=" + toString(alias)
-                    + ", target=" + toString(target)
-                    + ", action='" + action + '\''
-                    + '}';
-        }
-
-        private static String toString(ComponentName cn) {
-            return cn == null ? "[null]" : cn.flattenToShortString();
-        }
-
-        public void apply(Consumer<Combo> callback) {
-            log("Testing for: " + this);
-            callback.accept(this);
-        }
-    }
-}
diff --git a/tests/componentalias/src/android/content/componentalias/tests/ComponentAliasBroadcastTest.java b/tests/componentalias/src/android/content/componentalias/tests/ComponentAliasBroadcastTest.java
deleted file mode 100644
index 7d5e0b9..0000000
--- a/tests/componentalias/src/android/content/componentalias/tests/ComponentAliasBroadcastTest.java
+++ /dev/null
@@ -1,110 +0,0 @@
-/*
- * Copyright (C) 2021 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package android.content.componentalias.tests;
-
-import static android.content.componentalias.tests.ComponentAliasTestCommon.MAIN_PACKAGE;
-import static android.content.componentalias.tests.ComponentAliasTestCommon.SUB1_PACKAGE;
-import static android.content.componentalias.tests.ComponentAliasTestCommon.SUB2_PACKAGE;
-import static android.content.componentalias.tests.ComponentAliasTestCommon.TAG;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import android.content.ComponentName;
-import android.content.Intent;
-
-import com.android.compatibility.common.util.BroadcastMessenger.Receiver;
-
-import org.junit.Test;
-
-import java.util.function.Consumer;
-
-public class ComponentAliasBroadcastTest extends BaseComponentAliasTest {
-    private void forEachCombo(Consumer<Combo> callback) {
-        new Combo(
-                new ComponentName(MAIN_PACKAGE, MAIN_PACKAGE + ".b.Alias00"),
-                new ComponentName(MAIN_PACKAGE, MAIN_PACKAGE + ".b.Target00"),
-                MAIN_PACKAGE + ".IS_RECEIVER_00").apply(callback);
-
-        new Combo(
-                new ComponentName(MAIN_PACKAGE, MAIN_PACKAGE + ".b.Alias01"),
-                new ComponentName(SUB1_PACKAGE, MAIN_PACKAGE + ".b.Target01"),
-                MAIN_PACKAGE + ".IS_RECEIVER_01").apply(callback);
-        new Combo(
-                new ComponentName(MAIN_PACKAGE, MAIN_PACKAGE + ".b.Alias02"),
-                new ComponentName(SUB2_PACKAGE, MAIN_PACKAGE + ".b.Target02"),
-                MAIN_PACKAGE + ".IS_RECEIVER_02").apply(callback);
-    }
-
-    @Test
-    public void testBroadcast_explicitComponentName() {
-        forEachCombo((c) -> {
-            Intent i = new Intent().setComponent(c.alias);
-            i.setAction("ACTION_BROADCAST");
-            ComponentAliasMessage m;
-
-            try (Receiver<ComponentAliasMessage> receiver = new Receiver<>(sContext, TAG)) {
-                log("Sending: " + i);
-                sContext.sendBroadcast(i);
-
-                m = receiver.waitForNextMessage();
-
-                assertThat(m.getMethodName()).isEqualTo("onReceive");
-                assertThat(m.getSenderIdentity()).isEqualTo(c.target.flattenToShortString());
-
-                // The broadcast intent will always have the receiving component name set.
-                assertThat(m.getIntent().getComponent()).isEqualTo(c.target);
-
-                receiver.ensureNoMoreMessages();
-            }
-        });
-    }
-
-    @Test
-    public void testBroadcast_explicitPackageName() {
-        forEachCombo((c) -> {
-            // In this test, we only set the package name to the intent.
-            // If the alias and target are the same package, the intent will be sent to both of them
-            // *and* the one to the alias is redirected to the target, so the target will receive
-            // the intent twice. This case is haled at *1 below.
-
-
-            Intent i = new Intent().setPackage(c.alias.getPackageName());
-            i.setAction(c.action);
-            ComponentAliasMessage m;
-
-            try (Receiver<ComponentAliasMessage> receiver = new Receiver<>(sContext, TAG)) {
-                log("Sending broadcast: " + i);
-                sContext.sendBroadcast(i);
-
-                m = receiver.waitForNextMessage();
-
-                assertThat(m.getMethodName()).isEqualTo("onReceive");
-                assertThat(m.getSenderIdentity()).isEqualTo(c.target.flattenToShortString());
-                assertThat(m.getIntent().getComponent()).isEqualTo(c.target);
-
-                // *1 -- if the alias and target are in the same package, we expect one more
-                // message.
-                if (c.alias.getPackageName().equals(c.target.getPackageName())) {
-                    m = receiver.waitForNextMessage();
-                    assertThat(m.getMethodName()).isEqualTo("onReceive");
-                    assertThat(m.getSenderIdentity()).isEqualTo(c.target.flattenToShortString());
-                    assertThat(m.getIntent().getComponent()).isEqualTo(c.target);
-                }
-                receiver.ensureNoMoreMessages();
-            }
-        });
-    }
-}
diff --git a/tests/componentalias/src/android/content/componentalias/tests/ComponentAliasEnableWithDeviceConfigTest.java b/tests/componentalias/src/android/content/componentalias/tests/ComponentAliasEnableWithDeviceConfigTest.java
deleted file mode 100644
index ee20379..0000000
--- a/tests/componentalias/src/android/content/componentalias/tests/ComponentAliasEnableWithDeviceConfigTest.java
+++ /dev/null
@@ -1,63 +0,0 @@
-/*
- * Copyright (C) 2022 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package android.content.componentalias.tests;
-
-import android.os.Build;
-import android.provider.DeviceConfig;
-
-import com.android.compatibility.common.util.DeviceConfigStateHelper;
-import com.android.compatibility.common.util.ShellUtils;
-import com.android.compatibility.common.util.TestUtils;
-
-import org.junit.AfterClass;
-import org.junit.Assume;
-import org.junit.Test;
-
-public class ComponentAliasEnableWithDeviceConfigTest {
-    protected static final DeviceConfigStateHelper sDeviceConfig = new DeviceConfigStateHelper(
-            DeviceConfig.NAMESPACE_ACTIVITY_MANAGER_COMPONENT_ALIAS);
-
-    @AfterClass
-    public static void restoreDeviceConfig() throws Exception {
-        sDeviceConfig.close();
-    }
-
-    @Test
-    public void enableComponentAliasWithCompatFlag() throws Exception {
-        Assume.assumeTrue(Build.isDebuggable());
-
-        sDeviceConfig.set("component_alias_overrides", "");
-
-        // First, disable with both compat-id and device config.
-        ShellUtils.runShellCommand(
-                "am compat disable --no-kill USE_EXPERIMENTAL_COMPONENT_ALIAS android");
-        sDeviceConfig.set("enable_experimental_component_alias", "");
-
-        TestUtils.waitUntil("Wait until component alias is actually enabled", () -> {
-            return ShellUtils.runShellCommand("dumpsys activity component-alias")
-                    .indexOf("Enabled: false") > 0;
-        });
-
-        // Then, enable by device config.
-        sDeviceConfig.set("enable_experimental_component_alias", "true");
-
-        // Make sure the feature is actually enabled.
-        TestUtils.waitUntil("Wait until component alias is actually enabled", () -> {
-            return ShellUtils.runShellCommand("dumpsys activity component-alias")
-                    .indexOf("Enabled: true") > 0;
-        });
-    }
-}
diff --git a/tests/componentalias/src/android/content/componentalias/tests/ComponentAliasMessage.java b/tests/componentalias/src/android/content/componentalias/tests/ComponentAliasMessage.java
deleted file mode 100644
index d41696f..0000000
--- a/tests/componentalias/src/android/content/componentalias/tests/ComponentAliasMessage.java
+++ /dev/null
@@ -1,215 +0,0 @@
-/*
- * Copyright (C) 2021 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package android.content.componentalias.tests;
-
-import android.annotation.NonNull;
-import android.annotation.Nullable;
-import android.content.ComponentName;
-import android.content.Intent;
-import android.os.Parcel;
-import android.os.Parcelable;
-
-import com.android.internal.util.DataClass;
-
-/**
- * Parcelabe containing a "message" that's meant to be delivered via BroadcastMessenger.
- *
- * To add a new field, just add a private member field, and run:
- * codegen $ANDROID_BUILD_TOP/frameworks/base/tests/componentalias/src/android/content/componentalias/tests/ComponentAliasMessage.java
- */
-@DataClass(
-        genConstructor = false,
-        genSetters = true,
-        genToString = true,
-        genAidl = false)
-public final class ComponentAliasMessage implements Parcelable {
-    public ComponentAliasMessage() {
-    }
-
-    @Nullable
-    private String mMessage;
-
-    @Nullable
-    private String mMethodName;
-
-    @Nullable
-    private String mSenderIdentity;
-
-    @Nullable
-    private Intent mIntent;
-
-    @Nullable
-    private ComponentName mComponent;
-
-
-
-    // Code below generated by codegen v1.0.23.
-    //
-    // DO NOT MODIFY!
-    // CHECKSTYLE:OFF Generated code
-    //
-    // To regenerate run:
-    // $ codegen $ANDROID_BUILD_TOP/frameworks/base/tests/componentalias/src/android/content/componentalias/tests/ComponentAliasMessage.java
-    //
-    // To exclude the generated code from IntelliJ auto-formatting enable (one-time):
-    //   Settings > Editor > Code Style > Formatter Control
-    //@formatter:off
-
-
-    @DataClass.Generated.Member
-    public @Nullable String getMessage() {
-        return mMessage;
-    }
-
-    @DataClass.Generated.Member
-    public @Nullable String getMethodName() {
-        return mMethodName;
-    }
-
-    @DataClass.Generated.Member
-    public @Nullable String getSenderIdentity() {
-        return mSenderIdentity;
-    }
-
-    @DataClass.Generated.Member
-    public @Nullable Intent getIntent() {
-        return mIntent;
-    }
-
-    @DataClass.Generated.Member
-    public @Nullable ComponentName getComponent() {
-        return mComponent;
-    }
-
-    @DataClass.Generated.Member
-    public @NonNull ComponentAliasMessage setMessage(@NonNull String value) {
-        mMessage = value;
-        return this;
-    }
-
-    @DataClass.Generated.Member
-    public @NonNull ComponentAliasMessage setMethodName(@NonNull String value) {
-        mMethodName = value;
-        return this;
-    }
-
-    @DataClass.Generated.Member
-    public @NonNull ComponentAliasMessage setSenderIdentity(@NonNull String value) {
-        mSenderIdentity = value;
-        return this;
-    }
-
-    @DataClass.Generated.Member
-    public @NonNull ComponentAliasMessage setIntent(@NonNull Intent value) {
-        mIntent = value;
-        return this;
-    }
-
-    @DataClass.Generated.Member
-    public @NonNull ComponentAliasMessage setComponent(@NonNull ComponentName value) {
-        mComponent = value;
-        return this;
-    }
-
-    @Override
-    @DataClass.Generated.Member
-    public String toString() {
-        // You can override field toString logic by defining methods like:
-        // String fieldNameToString() { ... }
-
-        return "ComponentAliasMessage { " +
-                "message = " + mMessage + ", " +
-                "methodName = " + mMethodName + ", " +
-                "senderIdentity = " + mSenderIdentity + ", " +
-                "intent = " + mIntent + ", " +
-                "component = " + mComponent +
-        " }";
-    }
-
-    @Override
-    @DataClass.Generated.Member
-    public void writeToParcel(@NonNull Parcel dest, int flags) {
-        // You can override field parcelling by defining methods like:
-        // void parcelFieldName(Parcel dest, int flags) { ... }
-
-        byte flg = 0;
-        if (mMessage != null) flg |= 0x1;
-        if (mMethodName != null) flg |= 0x2;
-        if (mSenderIdentity != null) flg |= 0x4;
-        if (mIntent != null) flg |= 0x8;
-        if (mComponent != null) flg |= 0x10;
-        dest.writeByte(flg);
-        if (mMessage != null) dest.writeString(mMessage);
-        if (mMethodName != null) dest.writeString(mMethodName);
-        if (mSenderIdentity != null) dest.writeString(mSenderIdentity);
-        if (mIntent != null) dest.writeTypedObject(mIntent, flags);
-        if (mComponent != null) dest.writeTypedObject(mComponent, flags);
-    }
-
-    @Override
-    @DataClass.Generated.Member
-    public int describeContents() { return 0; }
-
-    /** @hide */
-    @SuppressWarnings({"unchecked", "RedundantCast"})
-    @DataClass.Generated.Member
-    /* package-private */ ComponentAliasMessage(@NonNull Parcel in) {
-        // You can override field unparcelling by defining methods like:
-        // static FieldType unparcelFieldName(Parcel in) { ... }
-
-        byte flg = in.readByte();
-        String message = (flg & 0x1) == 0 ? null : in.readString();
-        String methodName = (flg & 0x2) == 0 ? null : in.readString();
-        String senderIdentity = (flg & 0x4) == 0 ? null : in.readString();
-        Intent intent = (flg & 0x8) == 0 ? null : (Intent) in.readTypedObject(Intent.CREATOR);
-        ComponentName component = (flg & 0x10) == 0 ? null : (ComponentName) in.readTypedObject(ComponentName.CREATOR);
-
-        this.mMessage = message;
-        this.mMethodName = methodName;
-        this.mSenderIdentity = senderIdentity;
-        this.mIntent = intent;
-        this.mComponent = component;
-
-        // onConstructed(); // You can define this method to get a callback
-    }
-
-    @DataClass.Generated.Member
-    public static final @NonNull Parcelable.Creator<ComponentAliasMessage> CREATOR
-            = new Parcelable.Creator<ComponentAliasMessage>() {
-        @Override
-        public ComponentAliasMessage[] newArray(int size) {
-            return new ComponentAliasMessage[size];
-        }
-
-        @Override
-        public ComponentAliasMessage createFromParcel(@NonNull Parcel in) {
-            return new ComponentAliasMessage(in);
-        }
-    };
-
-    @DataClass.Generated(
-            time = 1630098801203L,
-            codegenVersion = "1.0.23",
-            sourceFile = "frameworks/base/tests/componentalias/src/android/content/componentalias/tests/ComponentAliasMessage.java",
-            inputSignatures = "private @android.annotation.Nullable java.lang.String mMessage\nprivate @android.annotation.Nullable java.lang.String mMethodName\nprivate @android.annotation.Nullable java.lang.String mSenderIdentity\nprivate @android.annotation.Nullable android.content.Intent mIntent\nprivate @android.annotation.Nullable android.content.ComponentName mComponent\nclass ComponentAliasMessage extends java.lang.Object implements [android.os.Parcelable]\n@com.android.internal.util.DataClass(genConstructor=false, genSetters=true, genToString=true, genAidl=false)")
-    @Deprecated
-    private void __metadata() {}
-
-
-    //@formatter:on
-    // End of generated code
-
-}
diff --git a/tests/componentalias/src/android/content/componentalias/tests/ComponentAliasNotSupportedOnUserBuildTest.java b/tests/componentalias/src/android/content/componentalias/tests/ComponentAliasNotSupportedOnUserBuildTest.java
deleted file mode 100644
index 0899886..0000000
--- a/tests/componentalias/src/android/content/componentalias/tests/ComponentAliasNotSupportedOnUserBuildTest.java
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- * Copyright (C) 2022 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package android.content.componentalias.tests;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import android.os.Build;
-import android.provider.DeviceConfig;
-
-import com.android.compatibility.common.util.DeviceConfigStateHelper;
-import com.android.compatibility.common.util.ShellUtils;
-
-import org.junit.AfterClass;
-import org.junit.Assume;
-import org.junit.Test;
-
-/**
- * Test to make sure component-alias can't be enabled on user builds.
- */
-public class ComponentAliasNotSupportedOnUserBuildTest {
-    protected static final DeviceConfigStateHelper sDeviceConfig = new DeviceConfigStateHelper(
-            DeviceConfig.NAMESPACE_ACTIVITY_MANAGER_COMPONENT_ALIAS);
-
-    @AfterClass
-    public static void restoreDeviceConfig() throws Exception {
-        sDeviceConfig.close();
-    }
-
-    @Test
-    public void enableComponentAliasWithCompatFlag() throws Exception {
-        Assume.assumeFalse(Build.isDebuggable());
-
-        // Try to enable it by both the device config and compat-id.
-        sDeviceConfig.set("enable_experimental_component_alias", "true");
-        ShellUtils.runShellCommand(
-                "am compat enable --no-kill USE_EXPERIMENTAL_COMPONENT_ALIAS android");
-
-        // Sleep for an arbitrary amount of time, so the config would sink in, if there was
-        // no "not on user builds" check.
-
-        Thread.sleep(5000);
-
-        // Make sure the feature is still disabled.
-        assertThat(ShellUtils.runShellCommand("dumpsys activity component-alias")
-                .indexOf("Enabled: false") > 0).isTrue();
-    }
-}
diff --git a/tests/componentalias/src/android/content/componentalias/tests/ComponentAliasServiceTest.java b/tests/componentalias/src/android/content/componentalias/tests/ComponentAliasServiceTest.java
deleted file mode 100644
index f0ff088..0000000
--- a/tests/componentalias/src/android/content/componentalias/tests/ComponentAliasServiceTest.java
+++ /dev/null
@@ -1,315 +0,0 @@
-/*
- * Copyright (C) 2021 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.content.componentalias.tests;
-
-import static android.content.Context.BIND_AUTO_CREATE;
-import static android.content.componentalias.tests.ComponentAliasTestCommon.MAIN_PACKAGE;
-import static android.content.componentalias.tests.ComponentAliasTestCommon.SUB1_PACKAGE;
-import static android.content.componentalias.tests.ComponentAliasTestCommon.SUB2_PACKAGE;
-import static android.content.componentalias.tests.ComponentAliasTestCommon.TAG;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import static org.hamcrest.core.IsNot.not;
-
-import android.content.ComponentName;
-import android.content.Intent;
-import android.content.ServiceConnection;
-import android.os.IBinder;
-
-import com.android.compatibility.common.util.BroadcastMessenger;
-import com.android.compatibility.common.util.BroadcastMessenger.Receiver;
-import com.android.compatibility.common.util.ShellUtils;
-import com.android.compatibility.common.util.TestUtils;
-
-import org.junit.Assume;
-import org.junit.Test;
-
-import java.util.function.Consumer;
-
-/**
- * Test for the experimental "Component alias" feature.
- *
- * Note this test exercises the relevant APIs, but don't actually check if the aliases are
- * resolved.
- *
- * Note all the helper APKs are battery-exempted (via AndroidTest.xml), so they can run
- * BG services.
- */
-public class ComponentAliasServiceTest extends BaseComponentAliasTest {
-    /**
-     * Service connection used throughout the tests. It sends a message for each callback via
-     * the messenger.
-     */
-    private static final ServiceConnection sServiceConnection = new ServiceConnection() {
-        @Override
-        public void onServiceConnected(ComponentName name, IBinder service) {
-            log("onServiceConnected: " + name);
-
-            ComponentAliasMessage m = new ComponentAliasMessage()
-                    .setSenderIdentity("sServiceConnection")
-                    .setMethodName("onServiceConnected")
-                    .setComponent(name);
-
-            BroadcastMessenger.send(sContext, TAG, m);
-        }
-
-        @Override
-        public void onServiceDisconnected(ComponentName name) {
-            log("onServiceDisconnected: " + name);
-
-            ComponentAliasMessage m = new ComponentAliasMessage()
-                    .setSenderIdentity("sServiceConnection")
-                    .setMethodName("onServiceDisconnected")
-                    .setComponent(name);
-
-            BroadcastMessenger.send(sContext, TAG, m);
-        }
-
-        @Override
-        public void onBindingDied(ComponentName name) {
-            log("onBindingDied: " + name);
-
-            ComponentAliasMessage m = new ComponentAliasMessage()
-                    .setSenderIdentity("sServiceConnection")
-                    .setMethodName("onBindingDied");
-
-            BroadcastMessenger.send(sContext, TAG, m);
-        }
-
-        @Override
-        public void onNullBinding(ComponentName name) {
-            log("onNullBinding: " + name);
-
-            ComponentAliasMessage m = new ComponentAliasMessage()
-                    .setSenderIdentity("sServiceConnection")
-                    .setMethodName("onNullBinding");
-
-            BroadcastMessenger.send(sContext, TAG, m);
-        }
-    };
-
-    private void testStartAndStopService_common(
-            Intent originalIntent,
-            ComponentName componentNameForClient,
-            ComponentName componentNameForTarget) {
-
-        ComponentAliasMessage m;
-
-        try (Receiver<ComponentAliasMessage> receiver = new Receiver<>(sContext, TAG)) {
-            // Start the service.
-            ComponentName result = sContext.startService(originalIntent);
-            assertThat(result).isEqualTo(componentNameForClient);
-
-            // Check
-            m = receiver.waitForNextMessage();
-
-            assertThat(m.getMethodName()).isEqualTo("onStartCommand");
-            // The app sees the rewritten intent.
-            assertThat(m.getIntent().getComponent()).isEqualTo(componentNameForTarget);
-
-            // Verify the original intent.
-            assertThat(m.getIntent().getOriginalIntent().getComponent())
-                    .isEqualTo(originalIntent.getComponent());
-            assertThat(m.getIntent().getOriginalIntent().getPackage())
-                    .isEqualTo(originalIntent.getPackage());
-
-            // Stop the service.
-            sContext.stopService(originalIntent);
-
-            // Check
-            m = receiver.waitForNextMessage();
-
-            assertThat(m.getMethodName()).isEqualTo("onDestroy");
-
-            receiver.ensureNoMoreMessages();
-        }
-    }
-
-    private void forEachCombo(Consumer<Combo> callback) {
-        new Combo(
-                new ComponentName(MAIN_PACKAGE, MAIN_PACKAGE + ".s.Alias00"),
-                new ComponentName(MAIN_PACKAGE, MAIN_PACKAGE + ".s.Target00"),
-                MAIN_PACKAGE + ".IS_ALIAS_00").apply(callback);
-        new Combo(
-                new ComponentName(MAIN_PACKAGE, MAIN_PACKAGE + ".s.Alias01"),
-                new ComponentName(SUB1_PACKAGE, MAIN_PACKAGE + ".s.Target01"),
-                MAIN_PACKAGE + ".IS_ALIAS_01").apply(callback);
-        new Combo(
-                new ComponentName(MAIN_PACKAGE, MAIN_PACKAGE + ".s.Alias02"),
-                new ComponentName(SUB2_PACKAGE, MAIN_PACKAGE + ".s.Target02"),
-                MAIN_PACKAGE + ".IS_ALIAS_02").apply(callback);
-    }
-
-    @Test
-    public void testStartAndStopService_explicitComponentName() {
-        forEachCombo((c) -> {
-            Intent i = new Intent().setComponent(c.alias);
-            testStartAndStopService_common(i, c.alias, c.target);
-        });
-    }
-
-    @Test
-    public void testStartAndStopService_explicitPackageName() {
-        forEachCombo((c) -> {
-            Intent i = new Intent().setPackage(c.alias.getPackageName());
-            i.setAction(c.action);
-
-            testStartAndStopService_common(i, c.alias, c.target);
-        });
-    }
-
-    @Test
-    public void testStartAndStopService_override() throws Exception {
-        Intent i = new Intent().setPackage(MAIN_PACKAGE);
-        i.setAction(MAIN_PACKAGE + ".IS_ALIAS_01");
-
-        // Change some of the aliases from what's defined in <meta-data>.
-
-        ComponentName aliasA = new ComponentName(MAIN_PACKAGE, MAIN_PACKAGE + ".s.Alias01");
-        ComponentName targetA = new ComponentName(MAIN_PACKAGE, MAIN_PACKAGE + ".s.Target02");
-
-        ComponentName aliasB = new ComponentName(MAIN_PACKAGE, MAIN_PACKAGE + ".s.Alias02");
-        ComponentName targetB = new ComponentName(MAIN_PACKAGE, MAIN_PACKAGE + ".s.Target01");
-
-        sDeviceConfig.set("component_alias_overrides",
-                aliasA.flattenToShortString() + ":" + targetA.flattenToShortString()
-                + ","
-                + aliasB.flattenToShortString() + ":" + targetB.flattenToShortString());
-
-        TestUtils.waitUntil("Wait until component alias is actually enabled", () -> {
-            return ShellUtils.runShellCommand("dumpsys activity component-alias")
-                    .indexOf(aliasA.flattenToShortString()
-                            + " -> " + targetA.flattenToShortString()) > 0;
-        });
-
-
-        testStartAndStopService_common(i, aliasA, targetA);
-    }
-
-    private void testBindAndUnbindService_common(
-            Intent originalIntent,
-            ComponentName componentNameForClient,
-            ComponentName componentNameForTarget) {
-        ComponentAliasMessage m;
-
-        try (Receiver<ComponentAliasMessage> receiver = new Receiver<>(sContext, TAG)) {
-            // Bind to the service.
-            assertThat(sContext.bindService(
-                    originalIntent, sServiceConnection, BIND_AUTO_CREATE)).isTrue();
-
-            // Check the target side behavior.
-            m = receiver.waitForNextMessage();
-
-            assertThat(m.getMethodName()).isEqualTo("onBind");
-            // The app sees the rewritten intent.
-            assertThat(m.getIntent().getComponent()).isEqualTo(componentNameForTarget);
-
-            // Verify the original intent.
-            assertThat(m.getIntent().getOriginalIntent().getComponent())
-                    .isEqualTo(originalIntent.getComponent());
-            assertThat(m.getIntent().getOriginalIntent().getPackage())
-                    .isEqualTo(originalIntent.getPackage());
-
-            // Check the client side behavior.
-            m = receiver.waitForNextMessage();
-
-            assertThat(m.getMethodName()).isEqualTo("onServiceConnected");
-            // The app sees the rewritten intent.
-            assertThat(m.getComponent()).isEqualTo(componentNameForClient);
-
-            // Unbind.
-            sContext.unbindService(sServiceConnection);
-
-            // Check the target side behavior.
-            m = receiver.waitForNextMessage();
-
-            assertThat(m.getMethodName()).isEqualTo("onDestroy");
-
-            // Note onServiceDisconnected() won't be called in this case.
-            receiver.ensureNoMoreMessages();
-        }
-    }
-
-    @Test
-    public void testBindService_explicitComponentName() {
-        forEachCombo((c) -> {
-            Intent i = new Intent().setComponent(c.alias);
-
-            testBindAndUnbindService_common(i, c.alias, c.target);
-        });
-
-    }
-
-    @Test
-    public void testBindService_explicitPackageName() {
-        forEachCombo((c) -> {
-            Intent i = new Intent().setPackage(c.alias.getPackageName());
-            i.setAction(c.action);
-
-            testBindAndUnbindService_common(i, c.alias, c.target);
-        });
-    }
-
-    /**
-     * Make sure, when the service process is killed, the client will get a callback with the
-     * right component name.
-     */
-    @Test
-    public void testBindService_serviceKilled() {
-
-        // We need to kill SUB2_PACKAGE, don't run it for this package.
-        Assume.assumeThat(sContext.getPackageName(), not(SUB2_PACKAGE));
-
-        Intent originalIntent = new Intent().setPackage(MAIN_PACKAGE);
-        originalIntent.setAction(MAIN_PACKAGE + ".IS_ALIAS_02");
-
-        final ComponentName componentNameForClient =
-                new ComponentName(MAIN_PACKAGE, MAIN_PACKAGE + ".s.Alias02");
-        final ComponentName componentNameForTarget =
-                new ComponentName(SUB2_PACKAGE, MAIN_PACKAGE + ".s.Target02");
-
-        ComponentAliasMessage m;
-
-        try (Receiver<ComponentAliasMessage> receiver = new Receiver<>(sContext, TAG)) {
-            // Bind to the service.
-            assertThat(sContext.bindService(
-                    originalIntent, sServiceConnection, BIND_AUTO_CREATE)).isTrue();
-
-            // Check the target side behavior.
-            m = receiver.waitForNextMessage();
-
-            assertThat(m.getMethodName()).isEqualTo("onBind");
-
-            m = receiver.waitForNextMessage();
-            assertThat(m.getMethodName()).isEqualTo("onServiceConnected");
-            assertThat(m.getComponent()).isEqualTo(componentNameForClient);
-            // We don't need to check all the fields because these are tested else where.
-
-            // Now kill the service process.
-            ShellUtils.runShellCommand("su 0 killall %s", SUB2_PACKAGE);
-
-            // Check the target side behavior.
-            m = receiver.waitForNextMessage();
-
-            assertThat(m.getMethodName()).isEqualTo("onServiceDisconnected");
-            assertThat(m.getComponent()).isEqualTo(componentNameForClient);
-
-            receiver.ensureNoMoreMessages();
-        }
-    }
-}
diff --git a/tests/componentalias/src/android/content/componentalias/tests/ComponentAliasTestCommon.java b/tests/componentalias/src/android/content/componentalias/tests/ComponentAliasTestCommon.java
deleted file mode 100644
index 165d728..0000000
--- a/tests/componentalias/src/android/content/componentalias/tests/ComponentAliasTestCommon.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- * Copyright (C) 2021 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package android.content.componentalias.tests;
-
-public final class ComponentAliasTestCommon {
-    private ComponentAliasTestCommon() {
-    }
-
-    public static final String TAG = "ComponentAliasTest";
-
-    public static final String MAIN_PACKAGE = "android.content.componentalias.tests";
-
-    public static final String SUB1_PACKAGE = "android.content.componentalias.tests.sub1";
-    public static final String SUB2_PACKAGE = "android.content.componentalias.tests.sub2";
-}
diff --git a/tests/componentalias/src/android/content/componentalias/tests/b/BaseReceiver.java b/tests/componentalias/src/android/content/componentalias/tests/b/BaseReceiver.java
deleted file mode 100644
index 1d05e72..0000000
--- a/tests/componentalias/src/android/content/componentalias/tests/b/BaseReceiver.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Copyright (C) 2021 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package android.content.componentalias.tests.b;
-
-import static android.content.componentalias.tests.ComponentAliasTestCommon.TAG;
-
-import android.content.BroadcastReceiver;
-import android.content.ComponentName;
-import android.content.Context;
-import android.content.Intent;
-import android.content.componentalias.tests.ComponentAliasMessage;
-import android.util.Log;
-
-import com.android.compatibility.common.util.BroadcastMessenger;
-
-public class BaseReceiver extends BroadcastReceiver {
-    private String getMyIdentity(Context context) {
-        return (new ComponentName(context.getPackageName(), this.getClass().getCanonicalName()))
-                .flattenToShortString();
-    }
-
-    @Override
-    public void onReceive(Context context, Intent intent) {
-        Log.i(TAG, "onReceive: on " + getMyIdentity(context) + " intent=" + intent);
-        ComponentAliasMessage m = new ComponentAliasMessage()
-                .setSenderIdentity(getMyIdentity(context))
-                .setMethodName("onReceive")
-                .setIntent(intent);
-        BroadcastMessenger.send(context, TAG, m);
-    }
-}
diff --git a/tests/componentalias/src/android/content/componentalias/tests/b/Target00.java b/tests/componentalias/src/android/content/componentalias/tests/b/Target00.java
deleted file mode 100644
index 8fb4e91..0000000
--- a/tests/componentalias/src/android/content/componentalias/tests/b/Target00.java
+++ /dev/null
@@ -1,21 +0,0 @@
-/*
- * Copyright (C) 2021 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package android.content.componentalias.tests.b;
-
-import android.content.componentalias.tests.s.BaseService;
-
-public class Target00 extends BaseReceiver {
-}
diff --git a/tests/componentalias/src/android/content/componentalias/tests/b/Target01.java b/tests/componentalias/src/android/content/componentalias/tests/b/Target01.java
deleted file mode 100644
index 06f7a13..0000000
--- a/tests/componentalias/src/android/content/componentalias/tests/b/Target01.java
+++ /dev/null
@@ -1,19 +0,0 @@
-/*
- * Copyright (C) 2021 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package android.content.componentalias.tests.b;
-
-public class Target01 extends BaseReceiver {
-}
diff --git a/tests/componentalias/src/android/content/componentalias/tests/b/Target02.java b/tests/componentalias/src/android/content/componentalias/tests/b/Target02.java
deleted file mode 100644
index df7579d..0000000
--- a/tests/componentalias/src/android/content/componentalias/tests/b/Target02.java
+++ /dev/null
@@ -1,19 +0,0 @@
-/*
- * Copyright (C) 2021 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package android.content.componentalias.tests.b;
-
-public class Target02 extends BaseReceiver {
-}
diff --git a/tests/componentalias/src/android/content/componentalias/tests/b/Target03.java b/tests/componentalias/src/android/content/componentalias/tests/b/Target03.java
deleted file mode 100644
index 5ae5521..0000000
--- a/tests/componentalias/src/android/content/componentalias/tests/b/Target03.java
+++ /dev/null
@@ -1,19 +0,0 @@
-/*
- * Copyright (C) 2021 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package android.content.componentalias.tests.b;
-
-public class Target03 extends BaseReceiver {
-}
diff --git a/tests/componentalias/src/android/content/componentalias/tests/b/Target04.java b/tests/componentalias/src/android/content/componentalias/tests/b/Target04.java
deleted file mode 100644
index f9b9886..0000000
--- a/tests/componentalias/src/android/content/componentalias/tests/b/Target04.java
+++ /dev/null
@@ -1,19 +0,0 @@
-/*
- * Copyright (C) 2021 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package android.content.componentalias.tests.b;
-
-public class Target04 extends BaseReceiver {
-}
diff --git a/tests/componentalias/src/android/content/componentalias/tests/s/BaseService.java b/tests/componentalias/src/android/content/componentalias/tests/s/BaseService.java
deleted file mode 100644
index 535d9b8..0000000
--- a/tests/componentalias/src/android/content/componentalias/tests/s/BaseService.java
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
- * Copyright (C) 2021 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package android.content.componentalias.tests.s;
-
-import static android.content.componentalias.tests.ComponentAliasTestCommon.TAG;
-
-import android.app.Service;
-import android.content.ComponentName;
-import android.content.Intent;
-import android.content.componentalias.tests.ComponentAliasMessage;
-import android.os.Binder;
-import android.os.IBinder;
-import android.util.Log;
-
-import com.android.compatibility.common.util.BroadcastMessenger;
-
-public class BaseService extends Service {
-    private String getMyIdentity() {
-        return (new ComponentName(this.getPackageName(), this.getClass().getCanonicalName()))
-                .flattenToShortString();
-    }
-
-    @Override
-    public int onStartCommand(Intent intent, int flags, int startId) {
-        Log.i(TAG, "onStartCommand: on " + getMyIdentity() + " intent=" + intent);
-        ComponentAliasMessage m = new ComponentAliasMessage()
-                .setSenderIdentity(getMyIdentity())
-                .setMethodName("onStartCommand")
-                .setIntent(intent);
-        BroadcastMessenger.send(this, TAG, m);
-
-        return START_NOT_STICKY;
-    }
-
-    @Override
-    public void onDestroy() {
-        Log.i(TAG, "onDestroy: on " + getMyIdentity());
-
-        ComponentAliasMessage m = new ComponentAliasMessage()
-                .setSenderIdentity(getMyIdentity())
-                .setMethodName("onDestroy");
-        BroadcastMessenger.send(this, TAG, m);
-    }
-
-    @Override
-    public IBinder onBind(Intent intent) {
-        Log.i(TAG, "onBind: on " + getMyIdentity() + " intent=" + intent);
-
-        ComponentAliasMessage m = new ComponentAliasMessage()
-                .setSenderIdentity(getMyIdentity())
-                .setMethodName("onBind")
-                .setIntent(intent);
-        BroadcastMessenger.send(this, TAG, m);
-
-        return new Binder();
-    }
-}
diff --git a/tests/componentalias/src/android/content/componentalias/tests/s/Target00.java b/tests/componentalias/src/android/content/componentalias/tests/s/Target00.java
deleted file mode 100644
index 64b91f5..0000000
--- a/tests/componentalias/src/android/content/componentalias/tests/s/Target00.java
+++ /dev/null
@@ -1,19 +0,0 @@
-/*
- * Copyright (C) 2021 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package android.content.componentalias.tests.s;
-
-public class Target00 extends BaseService {
-}
diff --git a/tests/componentalias/src/android/content/componentalias/tests/s/Target01.java b/tests/componentalias/src/android/content/componentalias/tests/s/Target01.java
deleted file mode 100644
index bd58999..0000000
--- a/tests/componentalias/src/android/content/componentalias/tests/s/Target01.java
+++ /dev/null
@@ -1,19 +0,0 @@
-/*
- * Copyright (C) 2021 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package android.content.componentalias.tests.s;
-
-public class Target01 extends BaseService {
-}
diff --git a/tests/componentalias/src/android/content/componentalias/tests/s/Target02.java b/tests/componentalias/src/android/content/componentalias/tests/s/Target02.java
deleted file mode 100644
index 0ddf818..0000000
--- a/tests/componentalias/src/android/content/componentalias/tests/s/Target02.java
+++ /dev/null
@@ -1,19 +0,0 @@
-/*
- * Copyright (C) 2021 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package android.content.componentalias.tests.s;
-
-public class Target02 extends BaseService {
-}
diff --git a/tests/componentalias/src/android/content/componentalias/tests/s/Target03.java b/tests/componentalias/src/android/content/componentalias/tests/s/Target03.java
deleted file mode 100644
index 0dbc050..0000000
--- a/tests/componentalias/src/android/content/componentalias/tests/s/Target03.java
+++ /dev/null
@@ -1,19 +0,0 @@
-/*
- * Copyright (C) 2021 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package android.content.componentalias.tests.s;
-
-public class Target03 extends BaseService {
-}
diff --git a/tests/componentalias/src/android/content/componentalias/tests/s/Target04.java b/tests/componentalias/src/android/content/componentalias/tests/s/Target04.java
deleted file mode 100644
index 0994258..0000000
--- a/tests/componentalias/src/android/content/componentalias/tests/s/Target04.java
+++ /dev/null
@@ -1,19 +0,0 @@
-/*
- * Copyright (C) 2021 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package android.content.componentalias.tests.s;
-
-public class Target04 extends BaseService {
-}
