Snap for 8164116 from 555ba5d1c63061ebb5aa7ed419e5884b8a7f99d8 to mainline-resolv-release

Change-Id: I66929bba834376c33098f1d83b55d99aa2b27202
diff --git a/build/allowed_deps.txt b/build/allowed_deps.txt
index 5e99002..bde37ce 100644
--- a/build/allowed_deps.txt
+++ b/build/allowed_deps.txt
@@ -43,6 +43,7 @@
 android.hardware.neuralnetworks-V1-ndk_platform(minSdkVersion:30)
 android.hardware.neuralnetworks-V2-ndk(minSdkVersion:30)
 android.hardware.neuralnetworks-V3-ndk(minSdkVersion:30)
+android.hardware.neuralnetworks-V4-ndk(minSdkVersion:30)
 android.hardware.neuralnetworks@1.0(minSdkVersion:30)
 android.hardware.neuralnetworks@1.1(minSdkVersion:30)
 android.hardware.neuralnetworks@1.2(minSdkVersion:30)
@@ -57,6 +58,7 @@
 android.hardware.wifi-V1.3-java(minSdkVersion:30)
 android.hardware.wifi-V1.4-java(minSdkVersion:30)
 android.hardware.wifi-V1.5-java(minSdkVersion:30)
+android.hardware.wifi-V1.6-java(minSdkVersion:30)
 android.hardware.wifi.hostapd-V1-java(minSdkVersion:30)
 android.hardware.wifi.hostapd-V1.0-java(minSdkVersion:30)
 android.hardware.wifi.hostapd-V1.1-java(minSdkVersion:30)
@@ -265,11 +267,11 @@
 libadbd_services(minSdkVersion:(no version))
 libadbd_services(minSdkVersion:30)
 libaidlcommonsupport(minSdkVersion:29)
-liballoc.rust_sysroot(minSdkVersion:(no version))
+liballoc.rust_sysroot(minSdkVersion:29)
 libamrextractor(minSdkVersion:29)
-libandroid_log_sys(minSdkVersion:(no version))
-libandroid_logger(minSdkVersion:(no version))
-libanyhow(minSdkVersion:(no version))
+libandroid_log_sys(minSdkVersion:29)
+libandroid_logger(minSdkVersion:29)
+libanyhow(minSdkVersion:29)
 libapp_processes_protos_lite(minSdkVersion:(no version))
 libapp_processes_protos_lite(minSdkVersion:30)
 libarect(minSdkVersion:29)
@@ -288,20 +290,24 @@
 libavservices_minijail(minSdkVersion:29)
 libbacktrace(minSdkVersion:apex_inherit)
 libbacktrace_headers(minSdkVersion:apex_inherit)
-libbacktrace_rs.rust_sysroot(minSdkVersion:(no version))
-libbacktrace_sys.rust_sysroot(minSdkVersion:(no version))
+libbacktrace_rs.rust_sysroot(minSdkVersion:29)
+libbacktrace_sys.rust_sysroot(minSdkVersion:29)
 libbase(minSdkVersion:29)
-libbase64_rust(minSdkVersion:(no version))
+libbase64_rust(minSdkVersion:29)
 libbase_headers(minSdkVersion:29)
 libbase_ndk(minSdkVersion:29)
 libbinder_headers(minSdkVersion:29)
 libbinder_headers_platform_shared(minSdkVersion:29)
+libbinder_ndk_bindgen(minSdkVersion:Tiramisu)
+libbinder_ndk_sys(minSdkVersion:Tiramisu)
+libbinder_rs(minSdkVersion:Tiramisu)
+libbinder_tokio_rs(minSdkVersion:Tiramisu)
 libbinderthreadstateutils(minSdkVersion:29)
 libbluetooth-types-header(minSdkVersion:29)
 libbrotli(minSdkVersion:(no version))
 libbuildversion(minSdkVersion:(no version))
 libbuildversion(minSdkVersion:26)
-libbytes(minSdkVersion:(no version))
+libbytes(minSdkVersion:29)
 libc++(minSdkVersion:apex_inherit)
 libc++_static(minSdkVersion:apex_inherit)
 libc++abi(minSdkVersion:apex_inherit)
@@ -312,8 +318,8 @@
 libc_llndk_headers(minSdkVersion:apex_inherit)
 libc_scudo(minSdkVersion:apex_inherit)
 libcap(minSdkVersion:29)
-libcfg_if(minSdkVersion:(no version))
-libcfg_if.rust_sysroot(minSdkVersion:(no version))
+libcfg_if(minSdkVersion:29)
+libcfg_if.rust_sysroot(minSdkVersion:29)
 libcodec2(minSdkVersion:29)
 libcodec2_headers(minSdkVersion:29)
 libcodec2_hidl@1.0(minSdkVersion:29)
@@ -353,8 +359,8 @@
 libcodec2_soft_vp9enc(minSdkVersion:29)
 libcodec2_vndk(minSdkVersion:29)
 libcom_android_networkstack_tethering_util_jni(minSdkVersion:30)
-libcompiler_builtins.rust_sysroot(minSdkVersion:(no version))
-libcore.rust_sysroot(minSdkVersion:(no version))
+libcompiler_builtins.rust_sysroot(minSdkVersion:29)
+libcore.rust_sysroot(minSdkVersion:29)
 libcrypto(minSdkVersion:29)
 libcrypto_static(minSdkVersion:(no version))
 libcrypto_utils(minSdkVersion:(no version))
@@ -368,9 +374,9 @@
 libdiagnose_usb(minSdkVersion:apex_inherit)
 libdmabufheap(minSdkVersion:29)
 libdmabufinfo(minSdkVersion:S)
-libdoh_ffi(minSdkVersion:(no version))
+libdoh_ffi(minSdkVersion:29)
 libeigen(minSdkVersion:(no version))
-libenv_logger(minSdkVersion:(no version))
+libenv_logger(minSdkVersion:29)
 libexpat(minSdkVersion:apex_inherit)
 libextservices(minSdkVersion:30)
 libextservices_jni(minSdkVersion:30)
@@ -382,21 +388,21 @@
 libflacextractor(minSdkVersion:29)
 libfmq(minSdkVersion:29)
 libfmq-base(minSdkVersion:29)
-libform_urlencoded(minSdkVersion:(no version))
+libform_urlencoded(minSdkVersion:29)
 libFraunhoferAAC(minSdkVersion:29)
 libfuse(minSdkVersion:30)
 libfuse_jni(minSdkVersion:30)
-libfutures(minSdkVersion:(no version))
-libfutures_channel(minSdkVersion:(no version))
-libfutures_core(minSdkVersion:(no version))
-libfutures_executor(minSdkVersion:(no version))
-libfutures_io(minSdkVersion:(no version))
-libfutures_sink(minSdkVersion:(no version))
-libfutures_task(minSdkVersion:(no version))
-libfutures_util(minSdkVersion:(no version))
+libfutures(minSdkVersion:29)
+libfutures_channel(minSdkVersion:29)
+libfutures_core(minSdkVersion:29)
+libfutures_executor(minSdkVersion:29)
+libfutures_io(minSdkVersion:29)
+libfutures_sink(minSdkVersion:29)
+libfutures_task(minSdkVersion:29)
+libfutures_util(minSdkVersion:29)
 libgav1(minSdkVersion:29)
 libgcc_stripped(minSdkVersion:(no version))
-libgetopts(minSdkVersion:(no version))
+libgetopts(minSdkVersion:29)
 libgralloctypes(minSdkVersion:29)
 libgrallocusage(minSdkVersion:29)
 libgsm(minSdkVersion:apex_inherit)
@@ -406,32 +412,32 @@
 libgui_headers(minSdkVersion:29)
 libhardware(minSdkVersion:29)
 libhardware_headers(minSdkVersion:29)
-libhashbrown.rust_sysroot(minSdkVersion:(no version))
+libhashbrown.rust_sysroot(minSdkVersion:29)
 libhevcdec(minSdkVersion:29)
 libhevcenc(minSdkVersion:29)
 libhidlbase(minSdkVersion:29)
 libhidlmemory(minSdkVersion:29)
 libhwbinder-impl-internal(minSdkVersion:29)
 libhwbinder_headers(minSdkVersion:29)
-libidna(minSdkVersion:(no version))
+libidna(minSdkVersion:29)
 libion(minSdkVersion:29)
 libip_checksum(minSdkVersion:30)
 libjsoncpp(minSdkVersion:29)
 libkll(minSdkVersion:30)
 libkll-encoder(minSdkVersion:30)
 libkll-protos(minSdkVersion:30)
-liblazy_static(minSdkVersion:(no version))
-liblibc(minSdkVersion:(no version))
-liblibc.rust_sysroot(minSdkVersion:(no version))
+liblazy_static(minSdkVersion:29)
+liblibc(minSdkVersion:29)
+liblibc.rust_sysroot(minSdkVersion:29)
 libLibGuiProperties(minSdkVersion:29)
-liblibm(minSdkVersion:(no version))
+liblibm(minSdkVersion:29)
 liblog_headers(minSdkVersion:29)
-liblog_rust(minSdkVersion:(no version))
+liblog_rust(minSdkVersion:29)
 liblua(minSdkVersion:(no version))
 liblua(minSdkVersion:30)
 liblz4(minSdkVersion:(no version))
 liblzma(minSdkVersion:apex_inherit)
-libmatches(minSdkVersion:(no version))
+libmatches(minSdkVersion:29)
 libmath(minSdkVersion:29)
 libmath_headers(minSdkVersion:apex_inherit)
 libmdnssd(minSdkVersion:(no version))
@@ -441,7 +447,7 @@
 libmedia_helper_headers(minSdkVersion:29)
 libmedia_midiiowrapper(minSdkVersion:29)
 libmediaformatshaper(minSdkVersion:29)
-libmemchr(minSdkVersion:(no version))
+libmemchr(minSdkVersion:29)
 libmeminfo(minSdkVersion:S)
 libminijail(minSdkVersion:29)
 libminijail_gen_constants(minSdkVersion:(no version))
@@ -449,7 +455,7 @@
 libminijail_gen_syscall(minSdkVersion:(no version))
 libminijail_gen_syscall_obj(minSdkVersion:29)
 libminijail_generated(minSdkVersion:29)
-libmio(minSdkVersion:(no version))
+libmio(minSdkVersion:29)
 libmkvextractor(minSdkVersion:29)
 libmp3extractor(minSdkVersion:29)
 libmp4extractor(minSdkVersion:29)
@@ -470,18 +476,18 @@
 libneuralnetworks_common(minSdkVersion:(no version))
 libneuralnetworks_headers(minSdkVersion:(no version))
 libneuralnetworks_shim_static(minSdkVersion:30)
-libnum_cpus(minSdkVersion:(no version))
+libnum_cpus(minSdkVersion:29)
 liboggextractor(minSdkVersion:29)
-libonce_cell(minSdkVersion:(no version))
+libonce_cell(minSdkVersion:29)
 libopenjdkjvmti_headers(minSdkVersion:31)
 libopus(minSdkVersion:29)
-libpanic_abort.rust_sysroot(minSdkVersion:(no version))
-libpercent_encoding(minSdkVersion:(no version))
+libpanic_abort.rust_sysroot(minSdkVersion:29)
+libpercent_encoding(minSdkVersion:29)
 libperfetto_client_experimental(minSdkVersion:S)
-libpin_project_lite(minSdkVersion:(no version))
-libpin_utils(minSdkVersion:(no version))
+libpin_project_lite(minSdkVersion:29)
+libpin_utils(minSdkVersion:29)
 libPlatformProperties(minSdkVersion:S)
-libproc_macro_nested(minSdkVersion:(no version))
+libproc_macro_nested(minSdkVersion:29)
 libprocessgroup(minSdkVersion:29)
 libprocessgroup_headers(minSdkVersion:29)
 libprocinfo(minSdkVersion:apex_inherit)
@@ -491,25 +497,25 @@
 libprofile-clang-extras_ndk(minSdkVersion:(no version))
 libprofile-extras(minSdkVersion:(no version))
 libprofile-extras_ndk(minSdkVersion:(no version))
-libprofiler_builtins.rust_sysroot(minSdkVersion:(no version))
+libprofiler_builtins.rust_sysroot(minSdkVersion:29)
 libprotobuf-cpp-lite(minSdkVersion:29)
 libprotobuf-java-lite(minSdkVersion:current)
 libprotobuf-java-nano(minSdkVersion:9)
 libprotoutil(minSdkVersion:(no version))
 libqemu_pipe(minSdkVersion:(no version))
-libquiche(minSdkVersion:(no version))
-libring(minSdkVersion:(no version))
+libquiche(minSdkVersion:29)
+libring(minSdkVersion:29)
 libring-core(minSdkVersion:29)
 libring-test(minSdkVersion:29)
 librustc_demangle(minSdkVersion:(no version))
-librustc_demangle.rust_sysroot(minSdkVersion:(no version))
+librustc_demangle.rust_sysroot(minSdkVersion:29)
 librustc_demangle_static(minSdkVersion:(no version))
 libruy_static(minSdkVersion:30)
 libsfplugin_ccodec_utils(minSdkVersion:29)
-libslab(minSdkVersion:(no version))
+libslab(minSdkVersion:29)
 libsonivoxwithoutjet(minSdkVersion:29)
 libspeexresampler(minSdkVersion:29)
-libspin(minSdkVersion:(no version))
+libspin(minSdkVersion:29)
 libssl(minSdkVersion:29)
 libstagefright_amrnb_common(minSdkVersion:29)
 libstagefright_amrnbdec(minSdkVersion:29)
@@ -536,13 +542,14 @@
 libstagefright_mpeg2extractor(minSdkVersion:29)
 libstagefright_mpeg2support(minSdkVersion:29)
 libstatssocket_headers(minSdkVersion:29)
-libstd(minSdkVersion:(no version))
-libstd_detect.rust_sysroot(minSdkVersion:(no version))
+libstd(minSdkVersion:29)
+libstd_detect.rust_sysroot(minSdkVersion:29)
 libsync(minSdkVersion:(no version))
 libsystem_headers(minSdkVersion:apex_inherit)
 libsysutils(minSdkVersion:apex_inherit)
-libterm(minSdkVersion:(no version))
-libtest(minSdkVersion:(no version))
+libtcutils(minSdkVersion:30)
+libterm(minSdkVersion:29)
+libtest(minSdkVersion:29)
 libtextclassifier(minSdkVersion:(no version))
 libtextclassifier(minSdkVersion:30)
 libtextclassifier-java(minSdkVersion:28)
@@ -554,22 +561,22 @@
 libtflite_kernel_utils(minSdkVersion:(no version))
 libtflite_static(minSdkVersion:(no version))
 libtflite_static(minSdkVersion:30)
-libthiserror(minSdkVersion:(no version))
-libtinyvec(minSdkVersion:(no version))
-libtinyvec_macros(minSdkVersion:(no version))
+libthiserror(minSdkVersion:29)
+libtinyvec(minSdkVersion:29)
+libtinyvec_macros(minSdkVersion:29)
 libtinyxml2(minSdkVersion:S)
-libtokio(minSdkVersion:(no version))
+libtokio(minSdkVersion:29)
 libui(minSdkVersion:29)
 libui-types(minSdkVersion:apex_inherit)
 libui_headers(minSdkVersion:29)
-libunicode_bidi(minSdkVersion:(no version))
-libunicode_normalization(minSdkVersion:(no version))
-libunicode_width.rust_sysroot(minSdkVersion:(no version))
-libuntrusted(minSdkVersion:(no version))
-libunwind.rust_sysroot(minSdkVersion:(no version))
+libunicode_bidi(minSdkVersion:29)
+libunicode_normalization(minSdkVersion:29)
+libunicode_width.rust_sysroot(minSdkVersion:29)
+libuntrusted(minSdkVersion:29)
+libunwind.rust_sysroot(minSdkVersion:29)
 libunwind_llvm(minSdkVersion:apex_inherit)
 libunwindstack(minSdkVersion:29)
-liburl(minSdkVersion:(no version))
+liburl(minSdkVersion:29)
 libutf(minSdkVersion:(no version))
 libutils(minSdkVersion:apex_inherit)
 libutils_headers(minSdkVersion:apex_inherit)
@@ -583,6 +590,8 @@
 libziparchive(minSdkVersion:apex_inherit)
 libzstd(minSdkVersion:(no version))
 marisa-trie(minSdkVersion:30)
+mdns_aidl_interface-lateststable-java(minSdkVersion:29)
+mdns_aidl_interface-V1-java(minSdkVersion:29)
 media_ndk_headers(minSdkVersion:29)
 media_plugin_headers(minSdkVersion:29)
 MediaProvider(minSdkVersion:30)
@@ -617,11 +626,13 @@
 netd-client(minSdkVersion:29)
 netd_aidl_interface-java(minSdkVersion:29)
 netd_aidl_interface-lateststable-java(minSdkVersion:29)
+netd_aidl_interface-lateststable-ndk(minSdkVersion:29)
 netd_aidl_interface-V3-java(minSdkVersion:29)
 netd_aidl_interface-V5-java(minSdkVersion:29)
 netd_aidl_interface-V6-java(minSdkVersion:29)
 netd_aidl_interface-V7-java(minSdkVersion:29)
 netd_aidl_interface-V8-java(minSdkVersion:29)
+netd_aidl_interface-V8-ndk(minSdkVersion:29)
 netd_event_listener_interface-java(minSdkVersion:29)
 netd_event_listener_interface-lateststable-java(minSdkVersion:29)
 netd_event_listener_interface-ndk_platform(minSdkVersion:29)
diff --git a/build/mainline_modules_sdks.py b/build/mainline_modules_sdks.py
index ed0f14a..d124b4c 100755
--- a/build/mainline_modules_sdks.py
+++ b/build/mainline_modules_sdks.py
@@ -13,7 +13,6 @@
 # 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.
-
 """Builds SDK snapshots.
 
 If the environment variable TARGET_BUILD_APPS is nonempty then only the SDKs for
@@ -175,6 +174,88 @@
         file.write("\n".join(header_lines + content_lines) + "\n")
 
 
+@dataclasses.dataclass()
+class SubprocessRunner:
+    """Runs subprocesses"""
+
+    # Destination for stdout from subprocesses.
+    #
+    # This (and the following stderr) are needed to allow the tests to be run
+    # in Intellij. This ensures that the tests are run with stdout/stderr
+    # objects that work when passed to subprocess.run(stdout/stderr). Without it
+    # the tests are run with a FlushingStringIO object that has no fileno
+    # attribute - https://youtrack.jetbrains.com/issue/PY-27883.
+    stdout: io.TextIOBase = sys.stdout
+
+    # Destination for stderr from subprocesses.
+    stderr: io.TextIOBase = sys.stderr
+
+    def run(self, *args, **kwargs):
+        return subprocess.run(
+            *args, check=True, stdout=self.stdout, stderr=self.stderr, **kwargs)
+
+
+@dataclasses.dataclass()
+class SnapshotBuilder:
+    """Builds sdk snapshots"""
+
+    # Used to run subprocesses for building snapshots.
+    subprocess_runner: SubprocessRunner
+
+    # The OUT_DIR environment variable.
+    out_dir: str
+
+    def get_mainline_sdks_path(self):
+        """Get the path to the Soong mainline-sdks directory"""
+        return os.path.join(self.out_dir, "soong/mainline-sdks")
+
+    def get_sdk_path(self, sdk_name, sdk_version):
+        """Get the path to the sdk snapshot zip file produced by soong"""
+        return os.path.join(self.get_mainline_sdks_path(),
+                            f"{sdk_name}-{sdk_version}.zip")
+
+    def build_snapshots(self, sdk_versions, modules):
+        # Build the SDKs once for each version.
+        for sdk_version in sdk_versions:
+            # Compute the paths to all the Soong generated sdk snapshot files
+            # required by this script.
+            paths = [
+                self.get_sdk_path(sdk, sdk_version)
+                for module in modules
+                for sdk in module.sdks
+            ]
+
+            # TODO(ngeoffray): remove SOONG_ALLOW_MISSING_DEPENDENCIES, but we
+            # currently break without it.
+            #
+            # Set SOONG_SDK_SNAPSHOT_USE_SRCJAR to generate .srcjars inside sdk
+            # zip files as expected by prebuilt drop.
+            extraEnv = {
+                "SOONG_ALLOW_MISSING_DEPENDENCIES": "true",
+                "SOONG_SDK_SNAPSHOT_USE_SRCJAR": "true",
+                "SOONG_SDK_SNAPSHOT_VERSION": sdk_version,
+            }
+            # Unless explicitly specified in the calling environment set
+            # TARGET_BUILD_VARIANT=user.
+            # This MUST be identical to the TARGET_BUILD_VARIANT used to build
+            # the corresponding APEXes otherwise it could result in different
+            # hidden API flags, see http://b/202398851#comment29 for more info.
+            targetBuildVariant = os.environ.get("TARGET_BUILD_VARIANT", "user")
+            cmd = [
+                "build/soong/soong_ui.bash",
+                "--make-mode",
+                "--soong-only",
+                f"TARGET_BUILD_VARIANT={targetBuildVariant}",
+                "TARGET_PRODUCT=mainline_sdk",
+                "MODULE_BUILD_FROM_SOURCE=true",
+                "out/soong/apex/depsinfo/new-allowed-deps.txt.check",
+            ] + paths
+            print_command(extraEnv, cmd)
+            env = os.environ.copy()
+            env.update(extraEnv)
+            self.subprocess_runner.run(cmd, env=env)
+
+
 @dataclasses.dataclass(frozen=True)
 class MainlineModule:
     """Represents a mainline module"""
@@ -250,6 +331,10 @@
         sdks=["permission-module-sdk"],
     ),
     MainlineModule(
+        apex="com.android.scheduling",
+        sdks=["scheduling-sdk"],
+    ),
+    MainlineModule(
         apex="com.android.sdkext",
         sdks=["sdkextensions-sdk"],
     ),
@@ -267,9 +352,6 @@
     ),
 ]
 
-# Only used by the test.
-MAINLINE_MODULES_BY_APEX = dict((m.apex, m) for m in MAINLINE_MODULES)
-
 # A list of the sdk versions to build. Usually just current but can include a
 # numeric version too.
 SDK_VERSIONS = [
@@ -290,20 +372,11 @@
     directory.
     """
 
-    # Destination for stdout from subprocesses.
-    #
-    # This (and the following stderr) are needed to allow the tests to be run
-    # in Intellij. This ensures that the tests are run with stdout/stderr
-    # objects that work when passed to subprocess.run(stdout/stderr). Without it
-    # the tests are run with a FlushingStringIO object that has no fileno
-    # attribute - https://youtrack.jetbrains.com/issue/PY-27883.
-    stdout: io.TextIOBase = sys.stdout
+    # Used to run subprocesses for this.
+    subprocess_runner: SubprocessRunner
 
-    # Destination for stderr from subprocesses.
-    stderr: io.TextIOBase = sys.stderr
-
-    # The OUT_DIR environment variable.
-    out_dir: str = "uninitialized-out"
+    # Builds sdk snapshots
+    snapshot_builder: SnapshotBuilder
 
     # The DIST_DIR environment variable.
     dist_dir: str = "uninitialized-dist"
@@ -312,65 +385,18 @@
     # transformed to document where the changes came from.
     script: str = sys.argv[0]
 
-    def get_sdk_path(self, sdk_name, sdk_version):
-        """Get the path to the sdk snapshot zip file produced by soong"""
-        return os.path.join(self.out_dir, "soong/mainline-sdks",
-                            f"{sdk_name}-{sdk_version}.zip")
-
     def produce_dist(self, modules):
         sdk_versions = SDK_VERSIONS
         self.build_sdks(sdk_versions, modules)
         self.populate_dist(sdk_versions, modules)
+        self.populate_stubs(modules)
 
     def build_sdks(self, sdk_versions, modules):
-        # Build the SDKs once for each version.
-        for sdk_version in sdk_versions:
-            # Compute the paths to all the Soong generated sdk snapshot files
-            # required by this script.
-            paths = [
-                self.get_sdk_path(sdk, sdk_version)
-                for module in modules
-                for sdk in module.sdks
-            ]
-
-            # TODO(ngeoffray): remove SOONG_ALLOW_MISSING_DEPENDENCIES, but we
-            # currently break without it.
-            #
-            # Set SOONG_SDK_SNAPSHOT_USE_SRCJAR to generate .srcjars inside sdk
-            # zip files as expected by prebuilt drop.
-            extraEnv = {
-                "SOONG_ALLOW_MISSING_DEPENDENCIES": "true",
-                "SOONG_SDK_SNAPSHOT_USE_SRCJAR": "true",
-                "SOONG_SDK_SNAPSHOT_VERSION": sdk_version,
-            }
-            # Unless explicitly specified in the calling environment set
-            # TARGET_BUILD_VARIANT=user.
-            # This MUST be identical to the TARGET_BUILD_VARIANT used to build
-            # the corresponding APEXes otherwise it could result in different
-            # hidden API flags, see http://b/202398851#comment29 for more info.
-            targetBuildVariant = os.environ.get("TARGET_BUILD_VARIANT", "user")
-            cmd = [
-                "build/soong/soong_ui.bash",
-                "--make-mode",
-                "--soong-only",
-                f"TARGET_BUILD_VARIANT={targetBuildVariant}",
-                "TARGET_PRODUCT=mainline_sdk",
-                "MODULE_BUILD_FROM_SOURCE=true",
-                "out/soong/apex/depsinfo/new-allowed-deps.txt.check",
-            ] + paths
-            print_command(extraEnv, cmd)
-            env = os.environ.copy()
-            env.update(extraEnv)
-            subprocess.run(
-                cmd,
-                env=env,
-                check=True,
-                stdout=self.stdout,
-                stderr=self.stderr)
+        self.snapshot_builder.build_snapshots(sdk_versions, modules)
 
     def unzip_current_stubs(self, sdk_name, apex_name):
         """Unzips stubs for "current" into {producer.dist_dir}/stubs/{apex}."""
-        sdk_path = self.get_sdk_path(sdk_name, "current")
+        sdk_path = self.snapshot_builder.get_sdk_path(sdk_name, "current")
         dest_dir = os.path.join(self.dist_dir, "stubs", apex_name)
         print(
             f"Extracting java_sdk_library files from {sdk_path} to {dest_dir}")
@@ -378,7 +404,7 @@
         extract_matching_files_from_zip(
             sdk_path, dest_dir, r"sdk_library/[^/]+/[^/]+\.(txt|jar|srcjar)")
 
-    def populate_dist(self, sdk_versions, modules):
+    def populate_stubs(self, modules):
         # TODO(b/199759953): Remove stubs once it is no longer used by gantry.
         # Clear and populate the stubs directory.
         stubs_dir = os.path.join(self.dist_dir, "stubs")
@@ -392,6 +418,7 @@
                 if sdk.endswith("-sdk"):
                     self.unzip_current_stubs(sdk, apex)
 
+    def populate_dist(self, sdk_versions, modules):
         # Clear and populate the mainline-sdks dist directory.
         sdks_dist_dir = os.path.join(self.dist_dir, "mainline-sdks")
         shutil.rmtree(sdks_dist_dir, ignore_errors=True)
@@ -410,7 +437,8 @@
 
                     sdk_dist_dir = os.path.join(sdks_dist_dir, sdk_version,
                                                 apex, subdir)
-                    sdk_path = self.get_sdk_path(sdk, sdk_version)
+                    sdk_path = self.snapshot_builder.get_sdk_path(
+                        sdk, sdk_version)
                     self.dist_sdk_snapshot_zip(sdk_path, sdk_dist_dir,
                                                module.transformations())
 
@@ -480,13 +508,10 @@
     # not affected by a change of directory.
     abs_src_zip_path = os.path.abspath(src_zip_path)
     abs_dest_zip_path = os.path.abspath(dest_zip_path)
-    subprocess.run(
+    producer.subprocess_runner.run(
         ["zip", "-q", abs_src_zip_path, "--out", abs_dest_zip_path] + paths,
         # Change into the source directory before running zip.
-        cwd=src_dir,
-        stdout=producer.stdout,
-        stderr=producer.stderr,
-        check=True)
+        cwd=src_dir)
 
 
 def apply_transformations(producer, tmp_dir, transformations):
@@ -505,12 +530,22 @@
 
 
 def create_producer():
-    return SdkDistProducer(
-        # Variables initialized from environment variables that are set by the
-        # calling mainline_modules_sdks.sh.
-        out_dir=os.environ["OUT_DIR"],
-        dist_dir=os.environ["DIST_DIR"],
+    # Variables initialized from environment variables that are set by the
+    # calling mainline_modules_sdks.sh.
+    out_dir = os.environ["OUT_DIR"]
+    dist_dir = os.environ["DIST_DIR"]
+
+    subprocess_runner = SubprocessRunner()
+    snapshot_builder = SnapshotBuilder(
+        subprocess_runner=subprocess_runner,
+        out_dir=out_dir,
     )
+    return SdkDistProducer(
+        subprocess_runner=subprocess_runner,
+        snapshot_builder=snapshot_builder,
+        dist_dir=dist_dir,
+    )
+
 
 def filter_modules(modules):
     target_build_apps = os.environ.get("TARGET_BUILD_APPS")
@@ -520,6 +555,7 @@
     else:
         return modules
 
+
 def main():
     """Program entry point."""
     if not os.path.exists("build/make/core/Makefile"):
diff --git a/build/mainline_modules_sdks.sh b/build/mainline_modules_sdks.sh
index 4e25161..fb5cfd3 100755
--- a/build/mainline_modules_sdks.sh
+++ b/build/mainline_modules_sdks.sh
@@ -56,7 +56,7 @@
   # provided by the build to ensure consistency across build environments.
   export DIST_DIR OUT_DIR
 
-  prebuilts/build-tools/linux-x86/bin/py3-cmd "${py3script}"
+  prebuilts/build-tools/linux-x86/bin/py3-cmd -u "${py3script}"
 }
 
 init "$@"
diff --git a/build/mainline_modules_sdks_test.py b/build/mainline_modules_sdks_test.py
index 5760136..cf6b28c 100644
--- a/build/mainline_modules_sdks_test.py
+++ b/build/mainline_modules_sdks_test.py
@@ -14,7 +14,6 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 """Unit tests for mainline_modules_sdks.py."""
-
 from pathlib import Path
 import os
 import tempfile
@@ -23,13 +22,18 @@
 
 import mainline_modules_sdks as mm
 
+MAINLINE_MODULES_BY_APEX = dict((m.apex, m) for m in mm.MAINLINE_MODULES)
 
-class TestPopulateDist(unittest.TestCase):
 
-    def create_snapshot_file(self, out_dir, name, version):
-        sdks_out_dir = Path(out_dir, "soong/mainline-sdks")
-        sdks_out_dir.mkdir(parents=True, exist_ok=True)
-        zip_file = Path(sdks_out_dir, f"{name}-{version}.zip")
+class FakeSnapshotBuilder(mm.SnapshotBuilder):
+    """A fake snapshot builder that does not run the build.
+
+    This skips the whole build process and just creates some fake sdk
+    modules.
+    """
+
+    def create_snapshot_file(self, name, version):
+        zip_file = Path(self.get_sdk_path(name, version))
         with zipfile.ZipFile(zip_file, "w") as z:
             z.writestr("Android.bp", "")
             if name.endswith("-sdk"):
@@ -38,6 +42,19 @@
                 z.writestr("sdk_library/public/lib.jar", "")
                 z.writestr("sdk_library/public/api.txt", "")
 
+    def build_snapshots(self, sdk_versions, modules):
+        # Create input file structure.
+        sdks_out_dir = Path(self.get_mainline_sdks_path())
+        sdks_out_dir.mkdir(parents=True, exist_ok=True)
+        # Create a fake sdk zip file for each module.
+        for module in modules:
+            for sdk in module.sdks:
+                for sdk_version in sdk_versions:
+                    self.create_snapshot_file(sdk, sdk_version)
+
+
+class TestProduceDist(unittest.TestCase):
+
     def test(self):
         """Verify the dist/mainline-sdks directory is populated correctly"""
         with tempfile.TemporaryDirectory() as tmp_dir:
@@ -47,22 +64,24 @@
             os.mkdir(tmp_dist_dir)
 
             modules = [
-                mm.MAINLINE_MODULES_BY_APEX["com.android.art"],
-                mm.MAINLINE_MODULES_BY_APEX["com.android.ipsec"],
+                MAINLINE_MODULES_BY_APEX["com.android.art"],
+                MAINLINE_MODULES_BY_APEX["com.android.ipsec"],
             ]
 
-            # Create input file structure.
-            for module in modules:
-                for sdk in module.sdks:
-                    self.create_snapshot_file(tmp_out_dir, sdk, "current")
+            subprocess_runner = mm.SubprocessRunner()
+
+            snapshot_builder = FakeSnapshotBuilder(
+                subprocess_runner=subprocess_runner,
+                out_dir=tmp_out_dir,
+            )
 
             producer = mm.SdkDistProducer(
-                out_dir=tmp_out_dir,
+                subprocess_runner=subprocess_runner,
+                snapshot_builder=snapshot_builder,
                 dist_dir=tmp_dist_dir,
             )
 
-            sdk_versions = ["current"]
-            producer.populate_dist(sdk_versions, modules)
+            producer.produce_dist(modules)
 
             files = []
             for abs_dir, _, filenames in os.walk(tmp_dist_dir):
@@ -114,7 +133,11 @@
 class TestSoongConfigBoilerplateInserter(unittest.TestCase):
 
     def apply_transformations(self, src, transformations, expected):
-        producer = mm.SdkDistProducer(script=self._testMethodName)
+        producer = mm.SdkDistProducer(
+            subprocess_runner=None,
+            snapshot_builder=None,
+            script=self._testMethodName,
+        )
 
         with tempfile.TemporaryDirectory() as tmp_dir:
             path = os.path.join(tmp_dir, "Android.bp")
@@ -140,7 +163,7 @@
 
         expected = readTestData("ipsec_Android.bp.expected")
 
-        module = mm.MAINLINE_MODULES_BY_APEX["com.android.ipsec"]
+        module = MAINLINE_MODULES_BY_APEX["com.android.ipsec"]
         transformations = module.transformations()
 
         self.apply_transformations(src, transformations, expected)
@@ -156,7 +179,7 @@
 
         expected = readTestData("art_Android.bp.expected")
 
-        module = mm.MAINLINE_MODULES_BY_APEX["com.android.art"]
+        module = MAINLINE_MODULES_BY_APEX["com.android.art"]
         transformations = module.transformations()
 
         self.apply_transformations(src, transformations, expected)
@@ -171,7 +194,7 @@
     def test_with_filter(self):
         os.environ["TARGET_BUILD_APPS"] = "com.android.art"
         modules = mm.filter_modules(mm.MAINLINE_MODULES)
-        expected = mm.MAINLINE_MODULES_BY_APEX["com.android.art"]
+        expected = MAINLINE_MODULES_BY_APEX["com.android.art"]
         self.assertEqual(modules, [expected])
 
 
diff --git a/sdk/ModuleDefaults.bp b/sdk/ModuleDefaults.bp
index 4f9cec9..7dea546 100644
--- a/sdk/ModuleDefaults.bp
+++ b/sdk/ModuleDefaults.bp
@@ -19,34 +19,11 @@
 
 mainline_stubs_args =
     "--error UnhiddenSystemApi " +
-    "--hide BroadcastBehavior " +
     "--hide CallbackInterface " +
-    "--hide DeprecationMismatch " +
-    "--hide HiddenSuperclass " +
     "--hide HiddenTypedefConstant " +
-    "--hide HiddenTypeParameter " +
-    "--hide MissingPermission " +
     "--hide RequiresPermission " +
-    "--hide SdkConstant " +
-    "--hide Todo " +
-    "--hide Typo " +
-    "--hide UnavailableSymbol " +
     "--enhance-documentation "
 
-// TODO: modularize this so not every module has the same list
-framework_packages_to_document = [
-    "android",
-    "dalvik",
-    "java",
-    "javax",
-    "junit",
-    "org.apache.http",
-    "org.json",
-    "org.w3c.dom",
-    "org.xml.sax",
-    "org.xmlpull",
-]
-
 // TODO: remove the hiding when server classes are cleaned up.
 mainline_framework_stubs_args =
     mainline_stubs_args +
@@ -126,6 +103,7 @@
     impl_library_visibility: [
         ":__pkg__",
         "//frameworks/base", // For framework-all
+        "//frameworks/base/api", // For framework-all
     ],
     stubs_source_visibility: ["//visibility:private"],
 
diff --git a/tools/Android.bp b/tools/Android.bp
index 8f0f529..642c2f8 100644
--- a/tools/Android.bp
+++ b/tools/Android.bp
@@ -45,10 +45,10 @@
     libs: ["sdk_proto_python"],
 }
 
-gensrcs {
+genrule {
     name: "cur_sdkinfo_src",
-    srcs: [""],
     tools: [ "gen_sdkinfo" ],
+    out: ["sdkinfo.pb"],
     product_variables: {
         platform_sdk_extension_version: {
             cmd: "$(location) -v %d -o $(out)",