Merge "Create a common base apex_defaults" am: 448d2f87c5
Original change: https://android-review.googlesource.com/c/platform/packages/modules/common/+/2390852
Change-Id: I60a62399197c6e95bd960219a425025c8a5804f5
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
diff --git a/build/allowed_deps.txt b/build/allowed_deps.txt
index 39c9727..0981af4 100644
--- a/build/allowed_deps.txt
+++ b/build/allowed_deps.txt
@@ -112,6 +112,7 @@
android.system.suspend-V1-ndk(minSdkVersion:30)
android.system.suspend-V1-ndk(minSdkVersion:Tiramisu)
android.system.suspend.control-V1-ndk(minSdkVersion:30)
+android_checker_annotation_stubs(minSdkVersion:current)
android_downloader_lib(minSdkVersion:30)
androidx-constraintlayout_constraintlayout(minSdkVersion:14)
androidx-constraintlayout_constraintlayout-solver(minSdkVersion:24)
@@ -147,6 +148,7 @@
androidx.fragment_fragment(minSdkVersion:14)
androidx.fragment_fragment-ktx(minSdkVersion:14)
androidx.interpolator_interpolator(minSdkVersion:14)
+androidx.javascriptengine_javascriptengine(minSdkVersion:26)
androidx.leanback_leanback(minSdkVersion:17)
androidx.leanback_leanback-grid(minSdkVersion:17)
androidx.leanback_leanback-preference(minSdkVersion:21)
@@ -200,6 +202,7 @@
androidx.versionedparcelable_versionedparcelable(minSdkVersion:14)
androidx.viewpager2_viewpager2(minSdkVersion:14)
androidx.viewpager_viewpager(minSdkVersion:14)
+androidx.webkit_webkit(minSdkVersion:14)
androidx.window_window(minSdkVersion:14)
androidx.work_work-runtime(minSdkVersion:14)
apache-commons-compress(minSdkVersion:29)
@@ -258,6 +261,7 @@
crtend_so(minSdkVersion:30)
crtend_so(minSdkVersion:apex_inherit)
crtend_so(minSdkVersion:current)
+dagger2(minSdkVersion:current)
datastallprotosnano(minSdkVersion:29)
dlmalloc(minSdkVersion:apex_inherit)
dnsproxyd_protocol_headers(minSdkVersion:29)
@@ -303,6 +307,7 @@
icing-java-proto-lite(minSdkVersion:current)
iconloader(minSdkVersion:21)
iconloader(minSdkVersion:26)
+iconloader_sc_mainline_prod(minSdkVersion:26)
internal_include_headers(minSdkVersion:30)
ipmemorystore-aidl-interfaces-java(minSdkVersion:29)
ipmemorystore-aidl-interfaces-V10-java(minSdkVersion:29)
@@ -310,6 +315,7 @@
jni_headers(minSdkVersion:29)
jni_platform_headers(minSdkVersion:S)
jsr305(minSdkVersion:14)
+jsr330(minSdkVersion:current)
kotlinx-coroutines-android(minSdkVersion:28)
kotlinx-coroutines-android(minSdkVersion:current)
kotlinx-coroutines-core(minSdkVersion:current)
@@ -344,6 +350,7 @@
libaudio-a2dp-hw-utils(minSdkVersion:29)
libaudio_aidl_conversion_common_util_cpp(minSdkVersion:29)
libaudio_system_headers(minSdkVersion:29)
+libaudioclient_aidl_conversion_util(minSdkVersion:29)
libaudioclient_headers(minSdkVersion:29)
libaudiofoundation_headers(minSdkVersion:29)
libaudioutils(minSdkVersion:29)
@@ -647,6 +654,8 @@
libprotobuf-c-nano(minSdkVersion:30)
libprotobuf-cpp-full(minSdkVersion:29)
libprotobuf-cpp-lite(minSdkVersion:29)
+libprotobuf-cpp-lite-ndk(minSdkVersion:(no version))
+libprotobuf-cpp-lite-ndk(minSdkVersion:33)
libprotobuf-java-lite(minSdkVersion:current)
libprotobuf-java-micro(minSdkVersion:8)
libprotobuf-java-nano(minSdkVersion:9)
@@ -713,6 +722,7 @@
libtextclassifier-java(minSdkVersion:28)
libtextclassifier-java(minSdkVersion:current)
libtextclassifier_abseil(minSdkVersion:30)
+libtextclassifier_bert_tokenizer(minSdkVersion:30)
libtextclassifier_flatbuffer_headers(minSdkVersion:30)
libtextclassifier_hash_headers(minSdkVersion:(no version))
libtextclassifier_hash_headers(minSdkVersion:apex_inherit)
@@ -770,6 +780,9 @@
mediaswcodec(minSdkVersion:29)
metrics-constants-protos(minSdkVersion:29)
metrics-constants-protos(minSdkVersion:current)
+mobile-data-download-java-proto-lite(minSdkVersion:30)
+mobile-data-download-populator-java-proto-lite(minSdkVersion:30)
+mobile_data_downloader_lib(minSdkVersion:30)
modules-utils-backgroundthread(minSdkVersion:29)
modules-utils-build(minSdkVersion:29)
modules-utils-build_system(minSdkVersion:29)
@@ -940,6 +953,7 @@
prebuilt_androidx.fragment_fragment-nodeps(minSdkVersion:14)
prebuilt_androidx.interpolator_interpolator-nodeps(minSdkVersion:(no version))
prebuilt_androidx.interpolator_interpolator-nodeps(minSdkVersion:14)
+prebuilt_androidx.javascriptengine_javascriptengine-nodeps(minSdkVersion:26)
prebuilt_androidx.leanback_leanback-grid-nodeps(minSdkVersion:17)
prebuilt_androidx.leanback_leanback-nodeps(minSdkVersion:(no version))
prebuilt_androidx.leanback_leanback-nodeps(minSdkVersion:17)
@@ -1034,6 +1048,7 @@
prebuilt_androidx.viewpager2_viewpager2-nodeps(minSdkVersion:14)
prebuilt_androidx.viewpager_viewpager-nodeps(minSdkVersion:(no version))
prebuilt_androidx.viewpager_viewpager-nodeps(minSdkVersion:14)
+prebuilt_androidx.webkit_webkit-nodeps(minSdkVersion:14)
prebuilt_androidx.window_window-nodeps(minSdkVersion:14)
prebuilt_androidx.work_work-runtime-nodeps(minSdkVersion:14)
prebuilt_asm-7.0(minSdkVersion:current)
@@ -1044,7 +1059,6 @@
prebuilt_asm-tree-9.2(minSdkVersion:current)
prebuilt_bionic_libc_platform_headers(minSdkVersion:(no version))
prebuilt_car-ui-lib-nodeps(minSdkVersion:28)
-prebuilt_car-ui-lib-source(minSdkVersion:28)
prebuilt_com.google.android.material_material-nodeps(minSdkVersion:(no version))
prebuilt_com.google.android.material_material-nodeps(minSdkVersion:14)
prebuilt_crtbegin_dynamic(minSdkVersion:(no version))
@@ -1086,6 +1100,7 @@
ServiceWifiResourcesGoogle(minSdkVersion:30)
SettingsLibActionBarShadow(minSdkVersion:21)
SettingsLibActionBarShadow(minSdkVersion:28)
+SettingsLibActivityEmbedding(minSdkVersion:21)
SettingsLibAppPreference(minSdkVersion:21)
SettingsLibBarChartPreference(minSdkVersion:21)
SettingsLibCollapsingToolbarBaseActivity(minSdkVersion:29)
@@ -1093,6 +1108,7 @@
SettingsLibHelpUtils(minSdkVersion:21)
SettingsLibLayoutPreference(minSdkVersion:21)
SettingsLibMainSwitchPreference(minSdkVersion:28)
+SettingsLibProfileSelector(minSdkVersion:23)
SettingsLibProgressBar(minSdkVersion:21)
SettingsLibRadioButtonPreference(minSdkVersion:21)
SettingsLibRestrictedLockUtils(minSdkVersion:21)
@@ -1110,6 +1126,7 @@
statsprotos(minSdkVersion:29)
tensorflow_headers(minSdkVersion:(no version))
tensorflow_headers(minSdkVersion:apex_inherit)
+tensorflowlite_java(minSdkVersion:30)
TetheringApiCurrentLib(minSdkVersion:30)
textclassifier-java-proto-lite(minSdkVersion:30)
textclassifier-statsd(minSdkVersion:30)
@@ -1119,6 +1136,13 @@
TextClassifierServiceLibNoManifest(minSdkVersion:28)
TextClassifierServiceLibNoManifest(minSdkVersion:30)
tflite_support(minSdkVersion:30)
+tflite_support_base_task_api_java(minSdkVersion:30)
+tflite_support_classifiers_java(minSdkVersion:30)
+tflite_support_java(minSdkVersion:30)
+tflite_support_libz(minSdkVersion:30)
+tflite_support_metadata_extractor(minSdkVersion:30)
+tflite_support_task_core_proto(minSdkVersion:30)
+tflite_support_tokenizers(minSdkVersion:30)
wifi-lite-protos(minSdkVersion:30)
wifi-nano-protos(minSdkVersion:30)
wifi-service-pre-jarjar(minSdkVersion:30)
diff --git a/build/build_unbundled_mainline_module.sh b/build/build_unbundled_mainline_module.sh
index 9204ee9..df01639 100755
--- a/build/build_unbundled_mainline_module.sh
+++ b/build/build_unbundled_mainline_module.sh
@@ -110,12 +110,13 @@
exit 1
fi
- declare -grx DIST_DIR="${dist_dir}"
+ DIST_DIR="${dist_dir}"
declare -grx TARGET_BUILD_APPS="${TARGET_BUILD_APPS:-${DEFAULT_MODULES[*]}}"
declare -grx TARGET_BUILD_DENSITY="${TARGET_BUILD_DENSITY:-alldpi}"
declare -grx TARGET_BUILD_TYPE="${TARGET_BUILD_TYPE:-release}"
declare -grx TARGET_BUILD_VARIANT="${TARGET_BUILD_VARIANT:-user}"
declare -grx TARGET_PRODUCT="${product}"
+ declare -grx BUILD_PRE_S_APEX="${BUILD_PRE_S_APEX:-false}"
# This script cannot handle compressed apexes
declare -grx OVERRIDE_PRODUCT_COMPRESSED_APEX=false
@@ -125,6 +126,20 @@
# frameworks/base).
}
+function build_modules() {
+
+ #TODO(b/263406837) remove BUILD_BROKEN_DISABLE_BAZEL, which will enable Bazel builds with --bazel-mode by default
+ build/soong/soong_ui.bash --make-mode "$@" \
+ ALWAYS_EMBED_NOTICES=true \
+ MODULE_BUILD_FROM_SOURCE=true \
+ BUILD_BROKEN_DISABLE_BAZEL=true \
+ ${extra_build_params} \
+ "${RUN_ERROR_PRONE:+"RUN_ERROR_PRONE=true"}" \
+ apps_only \
+ dist \
+ lint-check
+}
+
function main() {
if [ ! -e "build/make/core/Makefile" ]; then
echo "$0 must be run from the top of the Android source tree."
@@ -135,15 +150,7 @@
# the buildbots.
build/soong/soong_ui.bash --make-mode installclean
- #TODO(b/263406837) remove BUILD_BROKEN_DISABLE_BAZEL, which will enable Bazel builds with --bazel-mode by default
- build/soong/soong_ui.bash --make-mode "$@" \
- ALWAYS_EMBED_NOTICES=true \
- MODULE_BUILD_FROM_SOURCE=true \
- BUILD_BROKEN_DISABLE_BAZEL=true \
- "${RUN_ERROR_PRONE:+"RUN_ERROR_PRONE=true"}" \
- apps_only \
- dist \
- lint-check
+ DIST_DIR="${DIST_DIR}" build_modules
}
init "$@"
diff --git a/build/mainline_modules_sdks.py b/build/mainline_modules_sdks.py
index 6e08dec..55c24d7 100755
--- a/build/mainline_modules_sdks.py
+++ b/build/mainline_modules_sdks.py
@@ -714,7 +714,7 @@
)
S = BuildRelease(
name="S",
- # Generate a snapshot for this build release using Soong.
+ # Generate a snapshot for S using Soong.
creator=create_sdk_snapshots_in_soong,
# This requires the SoongConfigBoilerplateInserter transformation to be
# applied.
@@ -722,16 +722,9 @@
)
Tiramisu = BuildRelease(
name="Tiramisu",
- # Generate a snapshot for this build release using Soong.
+ # Generate a snapshot for Tiramisu using Soong.
creator=create_sdk_snapshots_in_soong,
- # This build release supports the use_source_config_var property.
- preferHandling=PreferHandling.USE_SOURCE_CONFIG_VAR_PROPERTY,
-)
-UpsideDownCake = BuildRelease(
- name="UpsideDownCake",
- # Generate a snapshot for this build release using Soong.
- creator=create_sdk_snapshots_in_soong,
- # This build release supports the use_source_config_var property.
+ # This supports the use_source_config_var property.
preferHandling=PreferHandling.USE_SOURCE_CONFIG_VAR_PROPERTY,
)
@@ -993,11 +986,6 @@
last_optional_release=LATEST,
),
MainlineModule(
- apex="com.android.rkpd",
- sdks=["rkpd-sdk"],
- first_release=UpsideDownCake,
- ),
- MainlineModule(
apex="com.android.scheduling",
sdks=["scheduling-sdk"],
first_release=S,
diff --git a/javatests/com/android/modules/apkinapex/Android.bp b/javatests/com/android/modules/apkinapex/Android.bp
new file mode 100644
index 0000000..ee16fd6
--- /dev/null
+++ b/javatests/com/android/modules/apkinapex/Android.bp
@@ -0,0 +1,41 @@
+/*
+ * 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 {
+ default_applicable_licenses: ["Android-Apache-2.0"],
+}
+
+java_test_host {
+ name: "ApkInApexTest",
+ srcs: [
+ "ApkInApexTest.java"
+ ],
+ libs: ["tradefed"],
+ java_resources: [
+ ":test_com.android.modules.apkinapex",
+ ],
+ static_libs: [
+ "compatibility-host-util",
+ "cts-install-lib-host",
+ "frameworks-base-hostutils",
+ "modules-utils-build-testing",
+ "truth-prebuilt",
+ ],
+ test_suites: [
+ "general-tests",
+ "mts-mainline-infra",
+ ],
+}
diff --git a/javatests/com/android/modules/apkinapex/ApkInApexTest.java b/javatests/com/android/modules/apkinapex/ApkInApexTest.java
new file mode 100644
index 0000000..f5c28fa
--- /dev/null
+++ b/javatests/com/android/modules/apkinapex/ApkInApexTest.java
@@ -0,0 +1,82 @@
+/*
+ * 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 com.android.modules.apkinapex;
+
+import static com.google.common.truth.Truth.assertThat;
+import static org.junit.Assume.assumeTrue;
+import static org.junit.Assert.assertThrows;
+
+import com.android.modules.utils.build.testing.DeviceSdkLevel;
+import com.android.tradefed.device.DeviceNotAvailableException;
+import com.android.tradefed.testtype.DeviceJUnit4ClassRunner;
+import com.android.tradefed.testtype.junit4.BaseHostJUnit4Test;
+import com.android.internal.util.test.SystemPreparer;
+
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.rules.RuleChain;
+import org.junit.rules.TemporaryFolder;
+import org.junit.runner.RunWith;
+
+import android.cts.install.lib.host.InstallUtilsHost;
+
+import java.util.Set;
+
+/**
+ * Collection of tests to test functionality of APKs in apexes.
+ *
+ * <p>This test installs an apex which contains APKs and then performs the tests.
+ */
+@RunWith(DeviceJUnit4ClassRunner.class)
+public class ApkInApexTest extends BaseHostJUnit4Test {
+
+ private final InstallUtilsHost mHostUtils = new InstallUtilsHost(this);
+ private final TemporaryFolder mTemporaryFolder = new TemporaryFolder();
+ private final SystemPreparer mPreparer = new SystemPreparer(mTemporaryFolder, this::getDevice);
+
+ @Rule
+ public final RuleChain ruleChain = RuleChain.outerRule(mTemporaryFolder).around(mPreparer);
+
+ @Test
+ public void installApexAndRunTests() throws Exception {
+ if (!getDevice().isAdbRoot()) {
+ getDevice().enableAdbRoot();
+ }
+ assumeTrue("Device does not support updating APEX", mHostUtils.isApexUpdateSupported());
+ assumeTrue("Device requires root", getDevice().isAdbRoot());
+ DeviceSdkLevel deviceSdkLevel = new DeviceSdkLevel(getDevice());
+ assumeTrue("Test requires atLeastT", deviceSdkLevel.isDeviceAtLeastT());
+
+ String apex = "test_com.android.modules.apkinapex.apex";
+ mPreparer.pushResourceFile(apex, "/system/apex/" + apex);
+ mPreparer.reboot();
+
+ Set<String> packages = getDevice().getInstalledPackageNames();
+
+ assertThat(packages)
+ .containsAtLeast(
+ "com.android.modules.apkinapex.apps.installable",
+ "com.android.modules.apkinapex.apps.futuretargetsdk"
+ );
+
+ assertThat(packages)
+ .containsNoneOf(
+ "com.android.modules.apkinapex.apps.futureminsdk",
+ "com.android.modules.apkinapex.apps.pastmaxsdk"
+ );
+ }
+}
diff --git a/javatests/com/android/modules/apkinapex/OWNERS b/javatests/com/android/modules/apkinapex/OWNERS
new file mode 100644
index 0000000..55f5b97
--- /dev/null
+++ b/javatests/com/android/modules/apkinapex/OWNERS
@@ -0,0 +1,5 @@
+# Mainline modularization team
+
+andreionea@google.com
+pedroql@google.com
+satayev@google.com
diff --git a/javatests/com/android/modules/apkinapex/TEST_MAPPING b/javatests/com/android/modules/apkinapex/TEST_MAPPING
new file mode 100644
index 0000000..6db4d77
--- /dev/null
+++ b/javatests/com/android/modules/apkinapex/TEST_MAPPING
@@ -0,0 +1,7 @@
+{
+ "postsubmit": [
+ {
+ "name": "ApkInApexTest"
+ }
+ ]
+}
diff --git a/javatests/com/android/modules/apkinapex/apex/Android.bp b/javatests/com/android/modules/apkinapex/apex/Android.bp
new file mode 100644
index 0000000..c57280e
--- /dev/null
+++ b/javatests/com/android/modules/apkinapex/apex/Android.bp
@@ -0,0 +1,43 @@
+// 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 {
+ default_applicable_licenses: ["Android-Apache-2.0"],
+}
+
+apex_key {
+ name: "test_com.android.modules.apkinapex.key",
+ public_key: "test_com.android.modules.apkinapex.avbpubkey",
+ private_key: "test_com.android.modules.apkinapex.pem",
+}
+
+android_app_certificate {
+ name: "test_com.android.modules.apkinapex.certificate",
+ certificate: "test_com.android.modules.apkinapex",
+}
+
+apex_test {
+ name: "test_com.android.modules.apkinapex",
+ manifest: "manifest.json",
+ file_contexts: ":apex.test-file_contexts",
+ key: "test_com.android.modules.apkinapex.key",
+ certificate: ":test_com.android.modules.apkinapex.certificate",
+ updatable: false,
+ apps: [
+ "com.android.modules.apkinapex.apps.installable",
+ "com.android.modules.apkinapex.apps.futureminsdk",
+ "com.android.modules.apkinapex.apps.futuretargetsdk",
+ "com.android.modules.apkinapex.apps.pastmaxsdk",
+ ],
+}
diff --git a/javatests/com/android/modules/apkinapex/apex/manifest.json b/javatests/com/android/modules/apkinapex/apex/manifest.json
new file mode 100644
index 0000000..e022bbc
--- /dev/null
+++ b/javatests/com/android/modules/apkinapex/apex/manifest.json
@@ -0,0 +1,4 @@
+{
+ "name": "test_com.android.modules.apkinapex",
+ "version": 1
+}
diff --git a/javatests/com/android/modules/apkinapex/apex/test_com.android.modules.apkinapex.avbpubkey b/javatests/com/android/modules/apkinapex/apex/test_com.android.modules.apkinapex.avbpubkey
new file mode 100644
index 0000000..8048e32
--- /dev/null
+++ b/javatests/com/android/modules/apkinapex/apex/test_com.android.modules.apkinapex.avbpubkey
Binary files differ
diff --git a/javatests/com/android/modules/apkinapex/apex/test_com.android.modules.apkinapex.pem b/javatests/com/android/modules/apkinapex/apex/test_com.android.modules.apkinapex.pem
new file mode 100644
index 0000000..b674ca5
--- /dev/null
+++ b/javatests/com/android/modules/apkinapex/apex/test_com.android.modules.apkinapex.pem
@@ -0,0 +1,51 @@
+-----BEGIN RSA PRIVATE KEY-----
+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
+-----END RSA PRIVATE KEY-----
diff --git a/javatests/com/android/modules/apkinapex/apex/test_com.android.modules.apkinapex.pk8 b/javatests/com/android/modules/apkinapex/apex/test_com.android.modules.apkinapex.pk8
new file mode 100644
index 0000000..a7fdf21
--- /dev/null
+++ b/javatests/com/android/modules/apkinapex/apex/test_com.android.modules.apkinapex.pk8
Binary files differ
diff --git a/javatests/com/android/modules/apkinapex/apex/test_com.android.modules.apkinapex.x509.pem b/javatests/com/android/modules/apkinapex/apex/test_com.android.modules.apkinapex.x509.pem
new file mode 100644
index 0000000..250ca49
--- /dev/null
+++ b/javatests/com/android/modules/apkinapex/apex/test_com.android.modules.apkinapex.x509.pem
@@ -0,0 +1,34 @@
+-----BEGIN CERTIFICATE-----
+MIIF6TCCA9ECFD53ZcG0C3ytBE7VKpvEYvgrm30+MA0GCSqGSIb3DQEBCwUAMIGv
+MQswCQYDVQQGEwJVUzETMBEGA1UECAwKQ2FsaWZvcm5pYTEWMBQGA1UEBwwNTW91
+bnRhaW4gVmlldzEQMA4GA1UECgwHQW5kcm9pZDEQMA4GA1UECwwHQW5kcm9pZDEi
+MCAGCSqGSIb3DQEJARYTYW5kcm9pZEBhbmRyb2lkLmNvbTErMCkGA1UEAwwidGVz
+dF9jb20uYW5kcm9pZC5tb2R1bGVzLmFwa2luYXBleDAgFw0yMjA0MjAxMzI4MjNa
+GA80NzYwMDMxNjEzMjgyM1owga8xCzAJBgNVBAYTAlVTMRMwEQYDVQQIDApDYWxp
+Zm9ybmlhMRYwFAYDVQQHDA1Nb3VudGFpbiBWaWV3MRAwDgYDVQQKDAdBbmRyb2lk
+MRAwDgYDVQQLDAdBbmRyb2lkMSIwIAYJKoZIhvcNAQkBFhNhbmRyb2lkQGFuZHJv
+aWQuY29tMSswKQYDVQQDDCJ0ZXN0X2NvbS5hbmRyb2lkLm1vZHVsZXMuYXBraW5h
+cGV4MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAyKYGS+TPbDsOAMi/
+BIuOmWteJ1JvbLHVRYdXvLQuaT/x8Y6DCvaHbkh0WTOdytP3+ggJBcHW2SaRtvZg
+bjoluXLVsNkyKSCHo/oBZbsL6Fcba/fePcEfQgJSwMPfMZPTfxn6e6f6QgpWPYiY
+EF4XoJB0d48Im2Vj6kVSmngiGV93EVs+hJgaKdmt81LzrQyIuHmPP+LOS80KB2YS
+V5wNkSViX9UKEXjG0IejJGsG+5FXiZI06NIERM4lAJ8OBuGTPXRNrej+N8YsaOIb
+gPOMUJnEOyUeds4C6hTDZ+hqKbMBdLtXL3c3Jv/xYqXgB552HWS7jD/TdaHD9OmP
+mAE9VLFFMmChUcW3/fCzrPG/jU9YE1TJlhjvwWKueL1topHTMy684Finb01I1wPi
+gSNxBCnb58ejp2fbd6igR4J5GJomXxAOnWZjIjW4Xvq/LbCF+UrHoppdGUBVCr7Q
+sKd2ErnW5bu/6PCdTXNuUj1TstBOi0fM0mMHFawRhJmxwPzW2N4DjwtHoFOt1gEm
+OHZg85G7CVddA1rqzpU0y0GU8nDNGFvM04lxEuyJjXoT4ttVm9ye9YV+B6D+xE2B
+0PxAVMZPXHgriA2hUuCHX6Wq3tgR+pYYCyZIzHHgkHrGobYanc6WyaBVYKrIoO4z
+07c3VWDF5CK9+Sr2rY4eOYERCNECAwEAATANBgkqhkiG9w0BAQsFAAOCAgEAZcOG
+fle0l9KLwzDGXNYo5XaLppF891uphE2JaaHKrWIXNpKqFkg8iC0+Rxc4vpEGOj3x
+DwBQElB2dCYLlfsTdlszATSf3EeKfKFFnF7yf82zjqDyBiTnYn9V+oi85gBC/DCl
+PenCeTIv43qWAW660iR4wHVV87WLxlSPNo9HnV2ANwCfth4GBFmz9Shb54T9PiGJ
+GPjOzZU9yaNOt7XaScL4AFS9CSF6npkpUXpZ1Zo8jjLdk/JGkDbLbm9fVLPmpHq4
+ObkYAzIaApx5Oq0aVXQGAd1woDwT7EXpodv3swY3fSIc3rVkc9PmYAZZEH/X/7Ne
+oVS7xMRWQTowrxrtypeshKtu6S2+8ioJa1g6sVM5k0B9qnhJTDnCJFzqGwdb2gLv
+H8o1ZoRrp+w3CLFDySuy/4ty2Hv4kggyVO/ivhO7inMRDH0BVyFO6oKs5I2aVvQB
+kOxzPy6Isln3gdEW2Ckrd5Cg2QfpidJ7catDpnbN979F+YVM8v0gIyKOb4gEGFQU
+ZfjELGJZ2UNQdpmlcvrPJfvRS0g85szgISr5K+bO2g6DUcSbCpgnvvZh4javt1Cv
+Nmba1fpWvL+J8QdXtYYHFtCt/qc3M9WOgNmFNHqpSj+qQAMVG0O+Y3pXzX4crBqR
+h+Xiai9DFq4fJJoRGD6xp+j+5s6g3UcF2zA8Mv0=
+-----END CERTIFICATE-----
diff --git a/javatests/com/android/modules/apkinapex/apps/Android.bp b/javatests/com/android/modules/apkinapex/apps/Android.bp
new file mode 100644
index 0000000..04b56f2
--- /dev/null
+++ b/javatests/com/android/modules/apkinapex/apps/Android.bp
@@ -0,0 +1,50 @@
+// 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 {
+ default_applicable_licenses: ["Android-Apache-2.0"],
+}
+
+android_test_helper_app {
+ name: "com.android.modules.apkinapex.apps.futureminsdk",
+ target_sdk_version: "Tiramisu",
+
+ // min sdk is overridden in the AndroidManifest.xml - but it is required to have a value here
+ // so the build system uses the value from the manifest!
+ min_sdk_version: "23",
+ apex_available: [ "test_com.android.modules.apkinapex" ],
+ manifest: "FutureMinSdkAndroidManifest.xml"
+}
+
+android_test_helper_app {
+ name: "com.android.modules.apkinapex.apps.futuretargetsdk",
+ target_sdk_version: "Tiramisu",
+ apex_available: [ "test_com.android.modules.apkinapex" ],
+ manifest: "FutureTargetSdkAndroidManifest.xml"
+}
+
+android_test_helper_app {
+ name: "com.android.modules.apkinapex.apps.pastmaxsdk",
+ target_sdk_version: "Tiramisu",
+ apex_available: [ "test_com.android.modules.apkinapex" ],
+ manifest: "PastMaxSdkAndroidManifest.xml"
+}
+
+android_test_helper_app {
+ name: "com.android.modules.apkinapex.apps.installable",
+ target_sdk_version: "Tiramisu",
+ min_sdk_version: "23",
+ apex_available: [ "test_com.android.modules.apkinapex" ],
+ manifest: "InstallableAndroidManifest.xml"
+}
diff --git a/javatests/com/android/modules/apkinapex/apps/FutureMinSdkAndroidManifest.xml b/javatests/com/android/modules/apkinapex/apps/FutureMinSdkAndroidManifest.xml
new file mode 100644
index 0000000..b81e358
--- /dev/null
+++ b/javatests/com/android/modules/apkinapex/apps/FutureMinSdkAndroidManifest.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ 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.
+ -->
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+ package="com.android.modules.apkinapex.apps.futureminsdk">
+ <!-- on purpose we use a non-existing minSdkVersion to simulate a future API codename that
+ was not known when this system image was compiled -->
+ <uses-sdk
+ android:minSdkVersion="FutureSdkCodename"
+ />
+</manifest>
diff --git a/javatests/com/android/modules/apkinapex/apps/FutureTargetSdkAndroidManifest.xml b/javatests/com/android/modules/apkinapex/apps/FutureTargetSdkAndroidManifest.xml
new file mode 100644
index 0000000..962d846
--- /dev/null
+++ b/javatests/com/android/modules/apkinapex/apps/FutureTargetSdkAndroidManifest.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ 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.
+ -->
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+ package="com.android.modules.apkinapex.apps.futuretargetsdk">
+ <!-- on purpose we use a non-existing targetSdkVersion to simulate a future API codename that
+ was not known when this system image was compiled -->
+ <uses-sdk
+ android:targetSdkVersion="FutureSdkCodename"
+ />
+</manifest>
diff --git a/javatests/com/android/modules/apkinapex/apps/InstallableAndroidManifest.xml b/javatests/com/android/modules/apkinapex/apps/InstallableAndroidManifest.xml
new file mode 100644
index 0000000..ee8ef92
--- /dev/null
+++ b/javatests/com/android/modules/apkinapex/apps/InstallableAndroidManifest.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ 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.
+ -->
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+ package="com.android.modules.apkinapex.apps.installable">
+</manifest>
diff --git a/javatests/com/android/modules/apkinapex/apps/PastMaxSdkAndroidManifest.xml b/javatests/com/android/modules/apkinapex/apps/PastMaxSdkAndroidManifest.xml
new file mode 100644
index 0000000..720a9b4
--- /dev/null
+++ b/javatests/com/android/modules/apkinapex/apps/PastMaxSdkAndroidManifest.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ 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.
+ -->
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+ package="com.android.modules.apkinapex.apps.pastmaxsdk">
+ <uses-sdk
+ android:maxSdkVersion="30"
+ />
+</manifest>
diff --git a/javatests/com/android/modules/updatablesharedlibs/TEST_MAPPING b/javatests/com/android/modules/updatablesharedlibs/TEST_MAPPING
new file mode 100644
index 0000000..71bf5cc
--- /dev/null
+++ b/javatests/com/android/modules/updatablesharedlibs/TEST_MAPPING
@@ -0,0 +1,7 @@
+{
+ "postsubmit": [
+ {
+ "name": "UpdatableSharedLibsTest"
+ }
+ ]
+}
diff --git a/sdk/ModuleDefaults.bp b/sdk/ModuleDefaults.bp
index b895259..379cb28 100644
--- a/sdk/ModuleDefaults.bp
+++ b/sdk/ModuleDefaults.bp
@@ -307,6 +307,7 @@
// Indicates that pre-installed version of this apex can be compressed.
// Whether it actually will be compressed is controlled on per-device basis.
compressible:true,
+ updatable: true,
defaults_visibility: [
"//art:__subpackages__",
"//packages/modules:__subpackages__",