Periodic pull of Robolectric changes from github.
Test: atest -c MyRoboTests
Bug: 263483214

Change-Id: If0eb3f8db0aa8c7b87b7baef859f539a25af0d14
diff --git a/Android.bp b/Android.bp
new file mode 100644
index 0000000..84d7af2
--- /dev/null
+++ b/Android.bp
@@ -0,0 +1,224 @@
+// Copyright (C) 2019 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_visibility: [":__subpackages__"],
+    default_applicable_licenses: ["external_robolectric_license"],
+}
+
+// Added automatically by a large-scale-change that took the approach of
+// 'apply every license found to every target'. While this makes sure we respect
+// every license restriction, it may not be entirely correct.
+//
+// e.g. GPL in an MIT project might only apply to the contrib/ directory.
+//
+// Please consider splitting the single license below into multiple licenses,
+// taking care not to lose any license_kind information, and overriding the
+// default license using the 'licenses: [...]' property on targets as needed.
+//
+// For unused files, consider creating a 'fileGroup' with "//visibility:private"
+// to attach the license to, and including a comment whether the files may be
+// used in the current project.
+// See: http://go/android-license-faq
+license {
+    name: "external_robolectric_license",
+    visibility: [":__subpackages__"],
+    license_kinds: [
+        "SPDX-license-identifier-Apache-2.0",
+        "SPDX-license-identifier-MIT",
+    ],
+    license_text: [
+        "LICENSE",
+    ],
+}
+
+// Empty library. Should be removed
+java_library {
+    name: "robolectric_android-all-stub_upstream",
+    visibility: ["//visibility:public"],
+}
+
+// build.prop file created by module type defined in soong/robolectric.go
+robolectric_build_props {
+    name: "robolectric_build_props_upstream",
+}
+
+java_genrule_host {
+    name: "robolectric_framework_res_upstream",
+    tools: ["zip2zip"],
+    srcs: [":framework-res"],
+    out: ["robolectric_framework_res_upstream.jar"],
+    cmd: "$(location zip2zip) " +
+        "-i $(location :framework-res) " +
+        "-o $(location robolectric_framework_res_upstream.jar) " +
+        "-x classes.dex " +
+        "-x META-INF/**/* " +
+        "-0 resources.arsc",
+}
+
+java_device_for_host {
+    name: "robolectric_android-all-device-deps_upstream",
+    libs: [
+        "conscrypt-for-host",
+        "core-icu4j-for-host",
+        "core-libart-for-host",
+        "ext",
+        "framework-all",
+        "icu4j-icudata-jarjar",
+        "icu4j-icutzdata-jarjar",
+        "ims-common",
+        "libphonenumber-platform",
+        "okhttp-for-host",
+        "services",
+        "services.accessibility",
+        "telephony-common",
+        "android.car",
+        "androidx.test.monitor",
+        "androidx.test.ext.truth", // -nodep?
+    ],
+}
+
+java_library_host {
+    name: "robolectric-host-android_all_upstream",
+    static_libs: [
+        "robolectric_android-all-device-deps_upstream",
+        "robolectric_tzdata",
+        "robolectric_framework_res_upstream",
+    ],
+    dist: {
+        targets: [
+            "sdk",
+            "win_sdk",
+        ],
+        dest: "android-all-robolectric_upstream.jar",
+    },
+
+    java_resources: [
+        // Copy the build.prop
+        ":robolectric_build_props_upstream",
+    ],
+    visibility: [
+        ":__subpackages__",
+        "//prebuilts/misc/common/robolectric",
+    ],
+}
+
+//#############################################
+// Assemble Robolectric_all
+//#############################################
+
+// This is a hack and should be removed with proper resource merging a la maven-shaded-plugin
+java_genrule_host {
+    name: "robolectric_meta_service_file",
+    out: ["robolectric_meta_service_file.jar"],
+    tools: ["soong_zip"],
+    cmd: "mkdir -p $(genDir)/META-INF/services/ && " +
+        "echo -e 'org.robolectric.Shadows\norg.robolectric.shadows.httpclient.Shadows\norg.robolectric.shadows.multidex.Shadows' > " +
+        "$(genDir)/META-INF/services/org.robolectric.internal.ShadowProvider &&" +
+        "$(location soong_zip) -o $(out) -C $(genDir) -D $(genDir)/META-INF/services/",
+}
+
+java_library_host {
+    name: "Robolectric_all_upstream",
+
+    static_libs: [
+        "robolectric_meta_service_file",
+        "Robolectric_shadows_httpclient_upstream",
+        "Robolectric_shadows_framework_upstream",
+        "Robolectric_shadows_multidex_upstream",
+        "Robolectric_robolectric_upstream",
+        "Robolectric_annotations_upstream",
+        "Robolectric_resources_upstream",
+        "Robolectric_shadowapi_upstream",
+        "Robolectric_sandbox_upstream",
+        "Robolectric_junit_upstream",
+        "Robolectric_utils_upstream",
+        "Robolectric_utils_reflector_upstream",
+        "asm-9.2",
+        "junit",
+        "asm-tree-9.2",
+        "guava",
+        "asm-commons-9.2",
+        "bouncycastle-unbundled",
+        "conscrypt-unbundled",
+        "robolectric-sqlite4java-0.282",
+        "hamcrest",
+        "hamcrest-library",
+        "robolectric-host-androidx-test-runner_upstream",
+        "robolectric-host-org_apache_http_legacy_upstream", //TODO: remove
+    ],
+
+    java_resource_dirs: [
+        "shadows/framework/src/main/resources",
+        "src/main/resources",
+    ],
+}
+
+// Make Robolectric_all available as a target jar, but treated as an aar
+java_host_for_device {
+    name: "Robolectric_all-target_upstream",
+    libs: ["Robolectric_all_upstream"],
+    visibility: [
+        "//platform_testing/robolab/roboStandaloneProj/tests",
+    ],
+}
+
+// Make dependencies available as host jars
+java_device_for_host {
+    name: "robolectric-host-androidx-test-core_upstream",
+    libs: ["androidx.test.core"],
+}
+
+java_device_for_host {
+    name: "robolectric-host-androidx-test-ext-junit_upstream",
+    libs: ["androidx.test.ext.junit"],
+}
+
+java_device_for_host {
+    name: "robolectric-host-androidx-test-monitor_upstream",
+    libs: ["androidx.test.monitor"],
+}
+
+java_device_for_host {
+    name: "robolectric-host-androidx-test-runner_upstream",
+    libs: ["androidx.test.runner"],
+}
+
+java_device_for_host {
+    name: "robolectric-host-androidx_upstream",
+    libs: ["androidx.fragment_fragment"],
+}
+
+java_device_for_host {
+    name: "robolectric-host-androidx_test_espresso",
+    libs: ["androidx.test.espresso.idling-resource"],
+}
+
+//java_device_for_host {
+//    name: "robolectric-host-android-support-v4_upstream",
+//    libs: ["android-support-v4"],
+//}
+
+java_device_for_host {
+    name: "robolectric-host-android-support-multidex_upstream",
+    libs: [
+        "android-support-multidex",
+        "com.android.support.multidex_1.0.3",
+    ],
+}
+
+java_device_for_host {
+    name: "robolectric-host-org_apache_http_legacy_upstream",
+    libs: ["org.apache.http.legacy.stubs"],
+}
diff --git a/MODULE_LICENSE_MIT b/MODULE_LICENSE_MIT
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/MODULE_LICENSE_MIT
diff --git a/NOTICE b/NOTICE
new file mode 100644
index 0000000..c9dccb8
--- /dev/null
+++ b/NOTICE
@@ -0,0 +1,21 @@
+The MIT License
+
+Copyright (c) 2010 Xtreme Labs and Pivotal Labs
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
diff --git a/OWNERS b/OWNERS
new file mode 100644
index 0000000..d8cb0bf
--- /dev/null
+++ b/OWNERS
@@ -0,0 +1 @@
+rexhoffman@google.com
diff --git a/annotations/Android.bp b/annotations/Android.bp
new file mode 100644
index 0000000..b325236
--- /dev/null
+++ b/annotations/Android.bp
@@ -0,0 +1,22 @@
+//#############################################
+// Compile Robolectric annotations
+//#############################################
+
+package {
+    // See: http://go/android-license-faq
+    // A large-scale-change added 'default_applicable_licenses' to import
+    // all of the 'license_kinds' from "external_robolectric-shadows_license"
+    // to get the below license kinds:
+    //   SPDX-license-identifier-MIT
+    default_applicable_licenses: ["external_robolectric_license"],
+}
+
+java_library_host {
+    name: "Robolectric_annotations_upstream",
+    static_libs: [
+        "jsr305",
+    ],
+    libs: ["robolectric-host-android_all_upstream"],
+    srcs: ["src/main/java/**/*.java"],
+    visibility: ["//visibility:public"],
+}
diff --git a/junit/Android.bp b/junit/Android.bp
new file mode 100644
index 0000000..3ada376
--- /dev/null
+++ b/junit/Android.bp
@@ -0,0 +1,30 @@
+//##########################################
+// Compile Robolectric junit
+//##########################################
+
+package {
+    // See: http://go/android-license-faq
+    // A large-scale-change added 'default_applicable_licenses' to import
+    // all of the 'license_kinds' from "external_robolectric-shadows_license"
+    // to get the below license kinds:
+    //   SPDX-license-identifier-MIT
+    default_applicable_licenses: ["external_robolectric_license"],
+}
+
+java_library_host {
+    name: "Robolectric_junit_upstream",
+    libs: [
+        "Robolectric_annotations_upstream",
+        "Robolectric_shadowapi_upstream",
+        "Robolectric_sandbox_upstream",
+        "Robolectric_utils_upstream",
+        "asm-commons-9.2",
+        "guava",
+        "asm-tree-9.2",
+        "hamcrest",
+        "junit",
+        "asm-9.2",
+        "jsr305",
+    ],
+    srcs: ["src/main/java/**/*.java"],
+}
diff --git a/nativeruntime/Android.bp b/nativeruntime/Android.bp
new file mode 100644
index 0000000..0d54843
--- /dev/null
+++ b/nativeruntime/Android.bp
@@ -0,0 +1,46 @@
+//#############################################
+// Compile Robolectric shadows framework
+//#############################################
+
+package {
+    // See: http://go/android-license-faq
+    // A large-scale-change added 'default_applicable_licenses' to import
+    // all of the 'license_kinds' from "external_robolectric_license"
+    // to get the below license kinds:
+    //   SPDX-license-identifier-Apache-2.0
+    default_applicable_licenses: ["external_robolectric_license"],
+}
+
+java_library_host {
+    name: "Robolectric_nativeruntime_upstream",
+    libs: [
+        "Robolectric_annotations_upstream",
+        "Robolectric_shadowapi_upstream",
+        "Robolectric_sandbox_upstream",
+        "Robolectric_resources_upstream",
+        "Robolectric_pluginapi_upstream",
+        "Robolectric_utils_upstream",
+        "Robolectric_utils_reflector_upstream",
+        "robolectric-accessibility-test-framework-2.1",
+        "robolectric-javax.annotation-api-1.2",
+        "hamcrest-library",
+        "hamcrest",
+        "robolectric-sqlite4java-0.282",
+        "guava",
+        //"icu4j",
+        "jsr305",
+        "error_prone_annotations",
+        "auto_service_annotations",
+        // "jsr330",
+        "robolectric-host-android_all_upstream",
+    ],
+    static_libs: [
+        "robolectric_nativeruntime_native_prebuilt",
+    ],
+    plugins: ["auto_service_plugin"],
+    srcs: [
+        "src/main/java/**/*.java",
+        "src/main/java/**/*.kt",
+    ],
+    java_resource_dirs: ["src/main/resources"],
+}
diff --git a/pluginapi/Android.bp b/pluginapi/Android.bp
new file mode 100644
index 0000000..085c62b
--- /dev/null
+++ b/pluginapi/Android.bp
@@ -0,0 +1,41 @@
+//#############################################
+// Compile Robolectric utils
+//#############################################
+
+package {
+    // See: http://go/android-license-faq
+    // A large-scale-change added 'default_applicable_licenses' to import
+    // all of the 'license_kinds' from "external_robolectric_license"
+    // to get the below license kinds:
+    //   SPDX-license-identifier-Apache-2.0
+    default_applicable_licenses: ["external_robolectric_license"],
+}
+
+java_library_host {
+    name: "Robolectric_pluginapi_upstream",
+    srcs: ["src/main/java/**/*.java"],
+    static_libs: [
+        "robolectric-javax.annotation-api-1.2",
+        "Robolectric_annotations_upstream",
+        "guava",
+        "jsr330",
+        "jsr305",
+    ],
+}
+
+//#############################################
+// Compile Robolectric utils tests
+//#############################################
+
+java_test_host {
+    name: "Robolectric_pluginapi_tests_upstream",
+    srcs: ["src/test/java/**/*.java"],
+    static_libs: [
+        "Robolectric_pluginapi_upstream",
+        "hamcrest",
+        "guava",
+        "junit",
+        "truth-prebuilt",
+    ],
+    test_suites: ["general-tests"],
+}
diff --git a/processor/Android.bp b/processor/Android.bp
new file mode 100644
index 0000000..a54dd07
--- /dev/null
+++ b/processor/Android.bp
@@ -0,0 +1,87 @@
+//#############################################
+// Compile Robolectric processor
+//#############################################
+
+package {
+    // See: http://go/android-license-faq
+    // A large-scale-change added 'default_applicable_licenses' to import
+    // all of the 'license_kinds' from "external_robolectric_license"
+    // to get the below license kinds:
+    //   SPDX-license-identifier-Apache-2.0
+    //   SPDX-license-identifier-MIT
+    default_applicable_licenses: ["external_robolectric_license"],
+}
+
+java_library_host {
+    name: "libRobolectric_processor_upstream",
+    srcs: ["src/main/java/**/*.java"],
+    java_resource_dirs: ["src/main/resources"],
+    java_resources: ["sdks.txt"],
+    use_tools_jar: true,
+    plugins: [
+        "auto_service_plugin",
+    ],
+    static_libs: [
+        "Robolectric_annotations_upstream",
+        "Robolectric_shadowapi_upstream",
+        "auto_service_annotations",
+        "asm-commons-9.2",
+        "guava",
+        "asm-tree-9.2",
+        "gson",
+        "asm-9.2",
+        "jsr305",
+        "auto_common",
+    ],
+
+    openjdk9: {
+        javacflags: [
+            "--add-exports=jdk.compiler/com.sun.tools.javac.api=ALL-UNNAMED",
+            "--add-exports=jdk.compiler/com.sun.tools.javac.code=ALL-UNNAMED",
+            "--add-exports=jdk.compiler/com.sun.tools.javac.util=ALL-UNNAMED",
+        ],
+    },
+}
+
+java_plugin {
+    name: "Robolectric_processor_upstream",
+    processor_class: "org.robolectric.annotation.processing.RobolectricProcessor",
+    static_libs: ["libRobolectric_processor_upstream"],
+}
+
+//#############################################
+// Compile Robolectric processor tests
+//#############################################
+java_test_host {
+    name: "Robolectric_processor_tests_upstream",
+    srcs: ["src/test/java/**/*.java"],
+    java_resource_dirs: ["src/test/resources"],
+    java_resources: [":Robolectric_processor_tests_resources_upstream"],
+    static_libs: [
+        "Robolectric_annotations_upstream",
+        "libRobolectric_processor_upstream",
+        "Robolectric_shadowapi_upstream",
+        "robolectric-javax.annotation-api-1.2",
+        "robolectric-compile-testing-0.19",
+        "mockito",
+        "hamcrest",
+        "guava",
+        "objenesis",
+        "junit",
+        "truth-prebuilt",
+        "gson",
+        "jsr305",
+    ],
+
+    test_suites: ["general-tests"],
+
+    // Disable annotation processing while compiling tests to avoid executing RobolectricProcessor.
+    javacflags: ["-proc:none"],
+}
+
+// Workaround: java_resource_dirs ignores *.java files
+filegroup {
+    name: "Robolectric_processor_tests_resources_upstream",
+    path: "src/test/resources",
+    srcs: ["src/test/resources/**/*.java"],
+}
diff --git a/processor/sdks.txt b/processor/sdks.txt
new file mode 100644
index 0000000..b9931ca
--- /dev/null
+++ b/processor/sdks.txt
@@ -0,0 +1,15 @@
+prebuilts/misc/common/robolectric/android-all/android-all-4.1.2_r1-robolectric-r1.jar
+prebuilts/misc/common/robolectric/android-all/android-all-4.2.2_r1.2-robolectric-r1.jar
+prebuilts/misc/common/robolectric/android-all/android-all-4.3_r2-robolectric-r1.jar
+prebuilts/misc/common/robolectric/android-all/android-all-4.4_r1-robolectric-r2.jar
+prebuilts/misc/common/robolectric/android-all/android-all-5.0.2_r3-robolectric-r0.jar
+prebuilts/misc/common/robolectric/android-all/android-all-5.1.1_r9-robolectric-r2.jar
+prebuilts/misc/common/robolectric/android-all/android-all-6.0.1_r3-robolectric-r1.jar
+prebuilts/misc/common/robolectric/android-all/android-all-7.0.0_r1-robolectric-r1.jar
+prebuilts/misc/common/robolectric/android-all/android-all-7.1.0_r7-robolectric-r1.jar
+prebuilts/misc/common/robolectric/android-all/android-all-8.0.0_r4-robolectric-r1.jar
+prebuilts/misc/common/robolectric/android-all/android-all-8.1.0-robolectric-4611349.jar
+prebuilts/misc/common/robolectric/android-all/android-all-9-robolectric-4913185-2.jar
+prebuilts/misc/common/robolectric/android-all/android-all-9plus-robolectric-5616371.jar
+prebuilts/misc/common/robolectric/android-all/android-all-10-robolectric-5803371.jar
+prebuilts/misc/common/robolectric/android-all/android-all-R-beta2-robolectric-6625208.jar
diff --git a/resources/Android.bp b/resources/Android.bp
new file mode 100644
index 0000000..cfdc377
--- /dev/null
+++ b/resources/Android.bp
@@ -0,0 +1,46 @@
+//#############################################
+// Compile Robolectric resources
+//#############################################
+
+package {
+    // See: http://go/android-license-faq
+    // A large-scale-change added 'default_applicable_licenses' to import
+    // all of the 'license_kinds' from "external_robolectric-shadows_license"
+    // to get the below license kinds:
+    //   SPDX-license-identifier-Apache-2.0
+    default_applicable_licenses: ["external_robolectric_license"],
+}
+
+java_library_host {
+    name: "Robolectric_resources_upstream",
+    srcs: ["src/main/java/**/*.java"],
+    libs: [
+        "Robolectric_annotations_upstream",
+        "Robolectric_utils_upstream",
+        "guava",
+        "jsr305",
+    ],
+}
+
+//#############################################
+// Compile Robolectric resources tests
+//#############################################
+
+java_test_host {
+    name: "Robolectric_resources_tests_upstream",
+    srcs: ["src/test/java/**/*.java"],
+    static_libs: [
+        "Robolectric_resources_upstream",
+        "Robolectric_annotations_upstream",
+        "Robolectric_utils_upstream",
+        "mockito",
+        "hamcrest",
+        "guava",
+        "objenesis",
+        "junit",
+        "truth-prebuilt",
+        "jsr305",
+    ],
+    java_resource_dirs: ["src/test/resources"],
+    test_suites: ["general-tests"],
+}
diff --git a/resources/src/main/java/org/robolectric/manifest/AndroidManifest.java b/resources/src/main/java/org/robolectric/manifest/AndroidManifest.java
index 82de00f..cfabcbb 100644
--- a/resources/src/main/java/org/robolectric/manifest/AndroidManifest.java
+++ b/resources/src/main/java/org/robolectric/manifest/AndroidManifest.java
@@ -13,6 +13,7 @@
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
+import java.util.stream.Collectors;
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
 import javax.xml.parsers.DocumentBuilder;
@@ -21,6 +22,7 @@
 import org.robolectric.res.Fs;
 import org.robolectric.res.ResourcePath;
 import org.robolectric.res.ResourceTable;
+import org.robolectric.util.Logger;
 import org.w3c.dom.Document;
 import org.w3c.dom.NamedNodeMap;
 import org.w3c.dom.Node;
@@ -165,6 +167,8 @@
       return;
     }
 
+    Logger.debug("Manifest file location: " + androidManifestFile);
+
     if (androidManifestFile != null && Files.exists(androidManifestFile)) {
       try {
         DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
@@ -174,6 +178,9 @@
         Document manifestDocument = db.parse(inputStream);
         inputStream.close();
 
+        Logger.debug("Manifest doc:\n" + Files.readAllLines(androidManifestFile).stream().collect(
+                Collectors.joining("\n")));
+
         if (!packageNameIsOverridden()) {
           packageName = getTagAttributeText(manifestDocument, "manifest", "package");
         }
diff --git a/robolectric/Android.bp b/robolectric/Android.bp
new file mode 100644
index 0000000..61359ab
--- /dev/null
+++ b/robolectric/Android.bp
@@ -0,0 +1,98 @@
+//#############################################
+// Compile Robolectric robolectric
+//#############################################
+
+package {
+    // See: http://go/android-license-faq
+    // A large-scale-change added 'default_applicable_licenses' to import
+    // all of the 'license_kinds' from "external_robolectric-shadows_license"
+    // to get the below license kinds:
+    //   SPDX-license-identifier-Apache-2.0
+    default_applicable_licenses: ["external_robolectric_license"],
+}
+
+java_library_host {
+    name: "Robolectric_robolectric_upstream",
+    libs: [
+        "Robolectric_shadows_framework_upstream",
+        "Robolectric_annotations_upstream",
+        "Robolectric_shadowapi_upstream",
+        "Robolectric_resources_upstream",
+        "Robolectric_sandbox_upstream",
+        "Robolectric_junit_upstream",
+        "Robolectric_utils_upstream",
+        "Robolectric_utils_reflector_upstream",
+        "robolectric-host-androidx-test-ext-junit_upstream",
+        "robolectric-host-androidx-test-monitor_upstream",
+        "robolectric-maven-ant-tasks-2.1.3",
+        "bouncycastle-unbundled",
+        "asm-commons-9.2",
+        "guava",
+        "robolectric-xstream-1.4.8",
+        "asm-tree-9.2",
+        "junit",
+        "robolectric-ant-1.8.0",
+        "asm-9.2",
+        "jsr305",
+        "conscrypt-unbundled",
+        "robolectric-host-androidx_test_espresso",
+        "robolectric-host-android_all_upstream",
+    ],
+    srcs: ["src/main/java/**/*.java"],
+    plugins: ["auto_service_plugin"],
+    java_resources: [":robolectric-version-upstream.properties"],
+}
+
+genrule {
+    name: "robolectric-version-upstream.properties",
+    out: ["robolectric-version-upstream.properties"],
+    cmd: "echo -n 'robolectric.version=4.8.2-SNAPSHOT' > $(out)",
+}
+
+//#############################################
+// Compile Robolectric robolectric tests
+//#############################################
+java_test_host {
+    name: "Robolectric_robolectric_tests_upstream",
+    srcs: ["src/test/java/**/*.java"],
+    java_resource_dirs: ["src/test/resources"],
+    static_libs: [
+        "Robolectric_robolectric_upstream",
+        "Robolectric_shadows_framework_upstream",
+        "Robolectric_annotations_upstream",
+        "Robolectric_shadowapi_upstream",
+        "Robolectric_resources_upstream",
+        "Robolectric_sandbox_upstream",
+        "Robolectric_junit_upstream",
+        "Robolectric_utils_upstream",
+        "Robolectric_utils_reflector_upstream",
+        "robolectric-host-androidx-test-ext-junit_upstream",
+        "robolectric-host-androidx-test-monitor_upstream",
+        "robolectric-host-androidx-test-core_upstream",
+        "robolectric-maven-ant-tasks-2.1.3",
+        "mockito",
+        "bouncycastle-unbundled",
+        "hamcrest",
+        "hamcrest-library",
+        "robolectric-sqlite4java-0.282",
+        "asm-commons-9.2",
+        "robolectric-diffutils-1.3.0",
+        "guava",
+        "objenesis",
+        "robolectric-xstream-1.4.8",
+        "asm-tree-9.2",
+        "junit",
+        "icu4j",
+        "truth-prebuilt",
+        "truth-java8-extension-jar",
+        "robolectric-ant-1.8.0",
+        "asm-9.2",
+        "jsr305",
+        "robolectric-host-androidx_test_espresso",
+    ],
+    libs: ["robolectric-host-android_all_upstream"],
+    // Robolectric tests do not work well with unit tests setup yet
+    test_options: {
+        unit_test: false,
+    },
+}
diff --git a/robolectric/src/main/java/org/robolectric/android/internal/AndroidTestEnvironment.java b/robolectric/src/main/java/org/robolectric/android/internal/AndroidTestEnvironment.java
index 1189c43..267cc6d 100755
--- a/robolectric/src/main/java/org/robolectric/android/internal/AndroidTestEnvironment.java
+++ b/robolectric/src/main/java/org/robolectric/android/internal/AndroidTestEnvironment.java
@@ -83,6 +83,7 @@
 import org.robolectric.shadows.ShadowPackageManager;
 import org.robolectric.shadows.ShadowPackageParser;
 import org.robolectric.shadows.ShadowPackageParser._Package_;
+import org.robolectric.util.Logger;
 import org.robolectric.util.PerfStatsCollector;
 import org.robolectric.util.ReflectionHelpers;
 import org.robolectric.util.Scheduler;
@@ -149,6 +150,7 @@
       loggingInitialized = true;
     }
 
+    Logger.debug("Robolectric Test Configuration: " + configuration.map());
     ConscryptMode.Mode conscryptMode = configuration.get(ConscryptMode.Mode.class);
     Security.removeProvider(CONSCRYPT_PROVIDER);
     if (conscryptMode != ConscryptMode.Mode.OFF) {
diff --git a/robolectric/src/main/java/org/robolectric/internal/dependency/LocalDependencyResolver.java b/robolectric/src/main/java/org/robolectric/internal/dependency/LocalDependencyResolver.java
index 5a77ede..a03f401 100644
--- a/robolectric/src/main/java/org/robolectric/internal/dependency/LocalDependencyResolver.java
+++ b/robolectric/src/main/java/org/robolectric/internal/dependency/LocalDependencyResolver.java
@@ -1,8 +1,13 @@
 package org.robolectric.internal.dependency;
 
 import java.io.File;
+import java.io.IOException;
 import java.net.MalformedURLException;
 import java.net.URL;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.util.stream.Stream;
+import org.robolectric.util.Logger;
 
 public class LocalDependencyResolver implements DependencyResolver {
   private File offlineJarDir;
@@ -39,6 +44,12 @@
    */
   private static File validateFile(File file) throws IllegalArgumentException {
     if (!file.isFile()) {
+      Logger.error("Directory contents: "+ file.getParentFile());
+      try (Stream<Path> stream = Files.list(file.getParentFile().toPath())) {
+        stream.forEach(s -> Logger.error(s.toString()));
+      } catch (IOException ioe) {
+        Logger.error("Not a directory " + file.getParentFile());
+      }
       throw new IllegalArgumentException("Path is not a file: " + file);
     }
     if (!file.canRead()) {
diff --git a/robolectric/src/main/java/org/robolectric/plugins/DefaultSdkProvider.java b/robolectric/src/main/java/org/robolectric/plugins/DefaultSdkProvider.java
index 9a02d6b..c8b2693 100644
--- a/robolectric/src/main/java/org/robolectric/plugins/DefaultSdkProvider.java
+++ b/robolectric/src/main/java/org/robolectric/plugins/DefaultSdkProvider.java
@@ -17,6 +17,9 @@
 import static android.os.Build.VERSION_CODES.S;
 import static android.os.Build.VERSION_CODES.S_V2;
 import static android.os.Build.VERSION_CODES.TIRAMISU;
+import static android.os.Build.VERSION_CODES.CUR_DEVELOPMENT;
+
+import android.os.Build;
 
 import com.google.auto.service.AutoService;
 import com.google.common.base.Preconditions;
@@ -82,6 +85,8 @@
     knownSdks.put(S, new DefaultSdk(S, "12", "7732740", "REL", 9));
     knownSdks.put(S_V2, new DefaultSdk(S_V2, "12.1", "8229987", "REL", 9));
     knownSdks.put(TIRAMISU, new DefaultSdk(TIRAMISU, "13", "9030017", "Tiramisu", 9));
+    // TODO(rexhoffman): should this have a dedicated mechanism?  Should we maintain a known good version?
+    knownSdks.put(CUR_DEVELOPMENT, new DefaultSdk(CUR_DEVELOPMENT, "current", "r0", "UpsideDownCake", 9));
   }
 
   @Override
diff --git a/robolectric/src/main/java/org/robolectric/plugins/LegacyDependencyResolver.java b/robolectric/src/main/java/org/robolectric/plugins/LegacyDependencyResolver.java
index aa72656..ce095a9 100644
--- a/robolectric/src/main/java/org/robolectric/plugins/LegacyDependencyResolver.java
+++ b/robolectric/src/main/java/org/robolectric/plugins/LegacyDependencyResolver.java
@@ -3,9 +3,14 @@
 import com.google.auto.service.AutoService;
 import com.google.common.annotations.VisibleForTesting;
 import java.io.File;
+import java.io.IOException;
 import java.net.URL;
+import java.nio.file.Files;
+import java.nio.file.Path;
 import java.nio.file.Paths;
 import java.util.Properties;
+import java.util.stream.Collectors;
+
 import javax.annotation.Priority;
 import javax.inject.Inject;
 import org.robolectric.internal.dependency.DependencyJar;
@@ -13,6 +18,7 @@
 import org.robolectric.internal.dependency.LocalDependencyResolver;
 import org.robolectric.internal.dependency.PropertiesDependencyResolver;
 import org.robolectric.res.Fs;
+import org.robolectric.util.Logger;
 import org.robolectric.util.ReflectionHelpers;
 
 /**
@@ -60,13 +66,16 @@
   private static DependencyResolver pickOne(
       Properties properties, DefinitelyNotAClassLoader classLoader) {
     String propPath = properties.getProperty("robolectric-deps.properties");
+    Logger.debug("Robolectric-deps.properties path :" + propPath);
     if (propPath != null) {
-      return new PropertiesDependencyResolver(Paths.get(propPath));
+      Path path = Paths.get(propPath);
+      return new PropertiesDependencyResolver(path);
     }
 
     String dependencyDir = properties.getProperty("robolectric.dependency.dir");
     if (dependencyDir != null
         || Boolean.parseBoolean(properties.getProperty("robolectric.offline"))) {
+      Logger.debug("Dependency dir: " + dependencyDir);
       return new LocalDependencyResolver(new File(dependencyDir == null ? "." : dependencyDir));
     }
 
diff --git a/robolectric/src/test/java/org/robolectric/shadows/ShadowCompanionDeviceManagerTest.java b/robolectric/src/test/java/org/robolectric/shadows/ShadowCompanionDeviceManagerTest.java
index 304d806..6b7ecd5 100644
--- a/robolectric/src/test/java/org/robolectric/shadows/ShadowCompanionDeviceManagerTest.java
+++ b/robolectric/src/test/java/org/robolectric/shadows/ShadowCompanionDeviceManagerTest.java
@@ -131,6 +131,7 @@
             "deviceProfile",
             /* selfManaged= */ false,
             /* notifyOnDeviceNearby= */ false,
+            /* revoked */ false,
             /* timeApprovedMs= */ 0,
             /* lastTimeConnectedMs= */ 0);
     assertThat(companionDeviceManager.getAssociations()).isEmpty();
diff --git a/robolectric/src/test/java/org/robolectric/shadows/ShadowDateIntervalFormatTest.java b/robolectric/src/test/java/org/robolectric/shadows/ShadowDateIntervalFormatTest.java
index bde0e72..f9721e4 100644
--- a/robolectric/src/test/java/org/robolectric/shadows/ShadowDateIntervalFormatTest.java
+++ b/robolectric/src/test/java/org/robolectric/shadows/ShadowDateIntervalFormatTest.java
@@ -1,6 +1,6 @@
 package org.robolectric.shadows;
 
-import static android.os.Build.VERSION_CODES.M;
+import static android.os.Build.VERSION_CODES.UPSIDE_DOWN_CAKE;
 import static com.google.common.truth.Truth.assertThat;
 
 import android.icu.text.DateFormat;
@@ -12,13 +12,13 @@
 import java.text.ParseException;
 import java.util.Calendar;
 import java.util.Date;
-import libcore.icu.DateIntervalFormat;
+import android.text.format.DateIntervalFormat;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.robolectric.annotation.Config;
 
 @RunWith(AndroidJUnit4.class)
-@Config(minSdk = M)
+@Config(minSdk = UPSIDE_DOWN_CAKE)
 public class ShadowDateIntervalFormatTest {
   @Test
   public void testDateInterval_FormatDateRange() throws ParseException {
diff --git a/robolectric/src/test/java/org/robolectric/shadows/ShadowNfcAdapterTest.java b/robolectric/src/test/java/org/robolectric/shadows/ShadowNfcAdapterTest.java
index 6b849c2..5d43069 100644
--- a/robolectric/src/test/java/org/robolectric/shadows/ShadowNfcAdapterTest.java
+++ b/robolectric/src/test/java/org/robolectric/shadows/ShadowNfcAdapterTest.java
@@ -209,6 +209,6 @@
   }
 
   private static Tag createMockTag() {
-    return Tag.createMockTag(new byte[0], new int[0], new Bundle[0]);
+    return Tag.createMockTag(new byte[0], new int[0], new Bundle[0], 0L);
   }
 }
diff --git a/sandbox/Android.bp b/sandbox/Android.bp
new file mode 100644
index 0000000..8244722
--- /dev/null
+++ b/sandbox/Android.bp
@@ -0,0 +1,69 @@
+//#############################################
+// Compile Robolectric sandbox
+//#############################################
+
+package {
+    // See: http://go/android-license-faq
+    // A large-scale-change added 'default_applicable_licenses' to import
+    // all of the 'license_kinds' from "external_robolectric_license"
+    // to get the below license kinds:
+    //   SPDX-license-identifier-Apache-2.0
+    default_applicable_licenses: ["external_robolectric_license"],
+}
+
+java_library_host {
+    name: "Robolectric_sandbox_upstream",
+    srcs: ["src/main/java/**/*.java"],
+    libs: [
+        "Robolectric_annotations_upstream",
+        "Robolectric_shadowapi_upstream",
+        "Robolectric_utils_reflector_upstream",
+        "Robolectric_utils_upstream",
+        "asm-commons-9.2",
+        "guava",
+        "asm-tree-9.2",
+        "asm-9.2",
+        "jsr305",
+    ],
+    plugins: [
+        "auto_service_plugin",
+        "auto_value_plugin",
+    ],
+    openjdk9: {
+        javacflags: [
+            "--add-opens=java.base/java.lang=ALL-UNNAMED",
+        ],
+    },
+}
+
+//#############################################
+// Compile Robolectric sandbox tests
+//#############################################
+
+java_test_host {
+    name: "Robolectric_sandbox_tests_upstream",
+    srcs: ["src/test/java/**/*.java"],
+    static_libs: [
+        "Robolectric_annotations_upstream",
+        "Robolectric_shadowapi_upstream",
+        "Robolectric_sandbox_upstream",
+        "Robolectric_utils_reflector_upstream",
+        "Robolectric_utils_upstream",
+        "Robolectric_junit_upstream",
+        "mockito",
+        "hamcrest",
+        "asm-commons-9.2",
+        "guava",
+        "objenesis",
+        "asm-tree-9.2",
+        "junit",
+        "truth-prebuilt",
+        "asm-9.2",
+        "jsr305",
+    ],
+    plugins: [
+        "auto_service_plugin",
+        "auto_value_plugin",
+    ],
+    test_suites: ["general-tests"],
+}
diff --git a/sandbox/src/main/java/org/robolectric/internal/bytecode/ShadowMap.java b/sandbox/src/main/java/org/robolectric/internal/bytecode/ShadowMap.java
index 04a2dc9..cb77a1f 100644
--- a/sandbox/src/main/java/org/robolectric/internal/bytecode/ShadowMap.java
+++ b/sandbox/src/main/java/org/robolectric/internal/bytecode/ShadowMap.java
@@ -14,6 +14,7 @@
 import org.robolectric.internal.ShadowProvider;
 import org.robolectric.sandbox.ShadowMatcher;
 import org.robolectric.shadow.api.ShadowPicker;
+import org.robolectric.util.Logger;
 
 /**
  * Maps from instrumented class to shadow class.
@@ -39,7 +40,9 @@
     final Map<String, String> shadowPickerMap = new HashMap<>();
 
     // These are sorted in descending order (higher priority providers are first).
+    Logger.debug("Shadow providers: " +  sortedProviders);
     for (ShadowProvider provider : sortedProviders) {
+      Logger.debug("Shadow provider: " + provider.getClass().getName());
       for (Map.Entry<String, String> entry : provider.getShadows()) {
         shadowMap.put(entry.getKey(), entry.getValue());
       }
diff --git a/shadowapi/Android.bp b/shadowapi/Android.bp
new file mode 100644
index 0000000..0ab69a2
--- /dev/null
+++ b/shadowapi/Android.bp
@@ -0,0 +1,45 @@
+//#############################################
+// Compile Robolectric shadowapi
+//#############################################
+
+package {
+    // See: http://go/android-license-faq
+    // A large-scale-change added 'default_applicable_licenses' to import
+    // all of the 'license_kinds' from "external_robolectric_license"
+    // to get the below license kinds:
+    //   SPDX-license-identifier-Apache-2.0
+    default_applicable_licenses: ["external_robolectric_license"],
+}
+
+java_library_host {
+    name: "Robolectric_shadowapi_upstream",
+    libs: [
+        "jsr305",
+    ],
+    static_libs: [
+        "Robolectric_utils_upstream",
+        "Robolectric_annotations_upstream",
+    ],
+    srcs: ["src/main/java/**/*.java"],
+    openjdk9: {
+        javacflags: [
+            "--add-opens=java.base/java.lang=ALL-UNNAMED",
+        ],
+    },
+}
+
+//#############################################
+// Compile Robolectric shadowapi tests
+//#############################################
+java_test_host {
+    name: "Robolectric_shadowapi_tests_upstream",
+    srcs: ["src/test/java/**/*.java"],
+    static_libs: [
+        "Robolectric_shadowapi_upstream",
+        "hamcrest",
+        "guava",
+        "junit",
+        "truth-prebuilt",
+    ],
+    test_suites: ["general-tests"],
+}
diff --git a/shadows/framework/Android.bp b/shadows/framework/Android.bp
new file mode 100644
index 0000000..5b6c149
--- /dev/null
+++ b/shadows/framework/Android.bp
@@ -0,0 +1,68 @@
+//#############################################
+// Compile Robolectric shadows framework
+//#############################################
+
+package {
+    // See: http://go/android-license-faq
+    // A large-scale-change added 'default_applicable_licenses' to import
+    // all of the 'license_kinds' from "external_robolectric_license"
+    // to get the below license kinds:
+    //   SPDX-license-identifier-Apache-2.0
+    default_applicable_licenses: ["external_robolectric_license"],
+}
+
+java_library_host {
+    name: "Robolectric_shadows_framework_upstream",
+    srcs: [
+        "src/main/java/**/*.java",
+        "src/main/java/**/*.kt",
+    ],
+    java_resource_dirs: ["src/main/resources"],
+    javacflags: [
+        "-Aorg.robolectric.annotation.processing.shadowPackage=org.robolectric",
+        "-Aorg.robolectric.annotation.processing.sdkCheckMode=ERROR",
+        // Uncomment the below to debug annotation processors not firing.
+        //"-verbose",
+        //"-XprintRounds",
+        //"-XprintProcessorInfo",
+        //"-Xlint",
+        //"-J-verbose",
+    ],
+    libs: [
+        "Robolectric_annotations_upstream",
+        "Robolectric_nativeruntime_upstream",
+        "Robolectric_resources_upstream",
+        "Robolectric_pluginapi_upstream",
+        "Robolectric_sandbox_upstream",
+        "Robolectric_shadowapi_upstream",
+        "Robolectric_utils_upstream",
+        "Robolectric_utils_reflector_upstream",
+        "auto_value_annotations",
+        //jetpack
+        //"androidx.annotation_annotation-nodeps",
+        "jsr305",
+        "icu4j",
+
+        "robolectric-accessibility-test-framework-2.1",
+        "robolectric-javax.annotation-api-1.2",
+        //"hamcrest-library",
+        //"hamcrest",
+        //"stub-annotations",
+        "robolectric-sqlite4java-0.282",
+        "asm-commons-9.2",
+        "guava",
+        "asm-tree-9.2",
+        "asm-9.2",
+        //standard tools
+        "error_prone_annotations",
+        //"grpc-java-netty-shaded",
+        // aar files that make up android and jetpack
+        "robolectric-host-android_all_upstream",
+    ],
+    plugins: [
+        "auto_value_plugin",
+        "auto_value_builder_plugin",
+        "Robolectric_processor_upstream",
+    ],
+
+}
diff --git a/shadows/framework/src/main/java/org/robolectric/shadows/ShadowCompanionDeviceManager.java b/shadows/framework/src/main/java/org/robolectric/shadows/ShadowCompanionDeviceManager.java
index 7937487..679ad04 100644
--- a/shadows/framework/src/main/java/org/robolectric/shadows/ShadowCompanionDeviceManager.java
+++ b/shadows/framework/src/main/java/org/robolectric/shadows/ShadowCompanionDeviceManager.java
@@ -22,6 +22,7 @@
 import org.robolectric.annotation.Implementation;
 import org.robolectric.annotation.Implements;
 
+
 /** Shadow for CompanionDeviceManager. */
 @Implements(value = CompanionDeviceManager.class, minSdk = VERSION_CODES.O)
 public class ShadowCompanionDeviceManager {
@@ -138,6 +139,7 @@
         info.deviceProfile(),
         info.selfManaged(),
         info.notifyOnDeviceNearby(),
+        info.revoked(),
         info.timeApprovedMs(),
         info.lastTimeConnectedMs());
   }
@@ -152,6 +154,7 @@
         info.getDeviceProfile(),
         info.isSelfManaged(),
         info.isNotifyOnDeviceNearby(),
+        info.isRevoked(),
         info.getTimeApprovedMs(),
         info.getLastTimeConnectedMs());
   }
@@ -182,6 +185,8 @@
 
     public abstract boolean notifyOnDeviceNearby();
 
+    public abstract boolean revoked();
+
     public abstract long timeApprovedMs();
 
     public abstract long lastTimeConnectedMs();
@@ -205,6 +210,7 @@
         String deviceProfile,
         boolean selfManaged,
         boolean notifyOnDeviceNearby,
+        boolean revoked,
         long timeApprovedMs,
         long lastTimeConnectedMs) {
       return RoboAssociationInfo.builder()
@@ -213,10 +219,10 @@
           .setPackageName(packageName)
           .setDeviceMacAddress(deviceMacAddress)
           .setDisplayName(displayName)
-          .setDeviceProfile(deviceProfile)
           .setSelfManaged(selfManaged)
           .setNotifyOnDeviceNearby(notifyOnDeviceNearby)
           .setTimeApprovedMs(timeApprovedMs)
+              .setRevoked(revoked)
           .setLastTimeConnectedMs(lastTimeConnectedMs)
           .build();
     }
@@ -240,6 +246,8 @@
 
       public abstract Builder setNotifyOnDeviceNearby(boolean notifyOnDeviceNearby);
 
+      public abstract Builder setRevoked(boolean revoked);
+
       public abstract Builder setTimeApprovedMs(long timeApprovedMs);
 
       public abstract Builder setLastTimeConnectedMs(long lastTimeConnectedMs);
diff --git a/shadows/framework/src/main/java/org/robolectric/shadows/ShadowDateIntervalFormat.java b/shadows/framework/src/main/java/org/robolectric/shadows/ShadowDateIntervalFormat.java
index abbed64..83d5235 100644
--- a/shadows/framework/src/main/java/org/robolectric/shadows/ShadowDateIntervalFormat.java
+++ b/shadows/framework/src/main/java/org/robolectric/shadows/ShadowDateIntervalFormat.java
@@ -2,16 +2,17 @@
 
 import static android.os.Build.VERSION_CODES.KITKAT;
 import static android.os.Build.VERSION_CODES.LOLLIPOP_MR1;
+import static android.os.Build.VERSION_CODES.TIRAMISU;
 
 import java.text.FieldPosition;
 import java.util.HashMap;
 import java.util.Locale;
 import java.util.Map;
-import libcore.icu.DateIntervalFormat;
 import org.robolectric.annotation.Implementation;
 import org.robolectric.annotation.Implements;
 
-@Implements(value = DateIntervalFormat.class, isInAndroidSdk = false, minSdk = KITKAT)
+@Implements(className = "libcore.icu.DateIntervalFormat", isInAndroidSdk = false, minSdk = KITKAT,
+        maxSdk = TIRAMISU)
 public class ShadowDateIntervalFormat {
 
   private static long address;
diff --git a/shadows/framework/src/main/java/org/robolectric/shadows/ShadowDateIntervalFormatU.java b/shadows/framework/src/main/java/org/robolectric/shadows/ShadowDateIntervalFormatU.java
new file mode 100644
index 0000000..ac435c4
--- /dev/null
+++ b/shadows/framework/src/main/java/org/robolectric/shadows/ShadowDateIntervalFormatU.java
@@ -0,0 +1,42 @@
+package org.robolectric.shadows;
+
+import static android.os.Build.VERSION_CODES.LOLLIPOP_MR1;
+import static android.os.Build.VERSION_CODES.UPSIDE_DOWN_CAKE;
+
+import java.text.FieldPosition;
+import java.util.HashMap;
+import java.util.Locale;
+import java.util.Map;
+import android.text.format.DateIntervalFormat;
+import org.robolectric.annotation.Implementation;
+import org.robolectric.annotation.Implements;
+
+@Implements(value = DateIntervalFormat.class, isInAndroidSdk = false, minSdk = UPSIDE_DOWN_CAKE)
+public class ShadowDateIntervalFormatU {
+
+  private static long address;
+  private static Map<Long, com.ibm.icu.text.DateIntervalFormat> INTERVAL_CACHE = new HashMap<>();
+
+  @Implementation
+  public static long createDateIntervalFormat(String skeleton, String localeName, String tzName) {
+    address++;
+    INTERVAL_CACHE.put(address, com.ibm.icu.text.DateIntervalFormat.getInstance(skeleton, new Locale(localeName)));
+    return address;
+  }
+
+  @Implementation
+  public static void destroyDateIntervalFormat(long address) {
+    INTERVAL_CACHE.remove(address);
+  }
+
+  @Implementation
+  @SuppressWarnings("JdkObsolete")
+  public static String formatDateInterval(long address, long fromDate, long toDate) {
+    StringBuffer buffer = new StringBuffer();
+
+    FieldPosition pos = new FieldPosition(0);
+    INTERVAL_CACHE.get(address).format(new com.ibm.icu.util.DateInterval(fromDate, toDate), buffer, pos);
+
+    return buffer.toString();
+  }
+}
diff --git a/shadows/httpclient/Android.bp b/shadows/httpclient/Android.bp
new file mode 100644
index 0000000..4132f92
--- /dev/null
+++ b/shadows/httpclient/Android.bp
@@ -0,0 +1,78 @@
+//#############################################
+// Compile Robolectric shadows httpclient
+//#############################################
+
+package {
+    // See: http://go/android-license-faq
+    // A large-scale-change added 'default_applicable_licenses' to import
+    // all of the 'license_kinds' from "external_robolectric_license"
+    // to get the below license kinds:
+    //   SPDX-license-identifier-Apache-2.0
+    default_applicable_licenses: ["external_robolectric_license"],
+}
+
+java_library_host {
+    name: "Robolectric_shadows_httpclient_upstream",
+    libs: [
+        "Robolectric_shadows_framework_upstream",
+        "Robolectric_annotations_upstream",
+        "Robolectric_shadowapi_upstream",
+        "Robolectric_utils_upstream",
+        "robolectric-httpclient-4.0.3",
+        "robolectric-httpcore-4.0.1",
+        "robolectric-javax.annotation-api-1.2",
+        "robolectric-host-android_all_upstream",
+        "robolectric-host-org_apache_http_legacy_upstream",
+    ],
+    plugins: ["Robolectric_processor_upstream"],
+    javacflags: ["-Aorg.robolectric.annotation.processing.shadowPackage=org.robolectric.shadows.httpclient"],
+    srcs: ["src/main/java/**/*.java"],
+
+    errorprone: {
+        javacflags: ["-Xep:EqualsNull:WARN"],
+    },
+}
+
+//#############################################
+// Compile Robolectric shadows httpclient tests
+//#############################################
+
+java_test_host {
+    name: "Robolectric_shadows_httpclient_tests_upstream",
+    srcs: ["src/test/java/**/*.java"],
+    java_resource_dirs: ["src/test/resources"],
+    static_libs: [
+        "Robolectric_shadows_httpclient_upstream",
+        "Robolectric_shadows_framework_upstream",
+        "Robolectric_annotations_upstream",
+        "Robolectric_robolectric_upstream",
+        "Robolectric_resources_upstream",
+        "Robolectric_shadowapi_upstream",
+        "Robolectric_sandbox_upstream",
+        "Robolectric_junit_upstream",
+        "Robolectric_utils_upstream",
+        "robolectric-maven-ant-tasks-2.1.3",
+        "bouncycastle-unbundled",
+        "hamcrest",
+        "robolectric-httpclient-4.0.3",
+        "asm-commons-9.2",
+        "robolectric-httpcore-4.0.1",
+        "guava",
+        "asm-tree-9.2",
+        "junit",
+        "truth-prebuilt",
+        "robolectric-ant-1.8.0",
+        "asm-9.2",
+        "jsr305",
+        "grpc-java-netty-shaded",
+        //"grpc-netty-shaded-1.16.1-jar",
+        "robolectric-host-android_all_upstream",
+        "robolectric-host-org_apache_http_legacy_upstream",
+        "robolectric-host-androidx-test-ext-junit_upstream",
+    ],
+    test_suites: ["general-tests"],
+    //tradefed doesn't run these tests.
+    test_options: {
+        unit_test: false,
+    },
+}
diff --git a/shadows/multidex/Android.bp b/shadows/multidex/Android.bp
new file mode 100644
index 0000000..91d3379
--- /dev/null
+++ b/shadows/multidex/Android.bp
@@ -0,0 +1,26 @@
+//#############################################
+// Compile Robolectric shadows multidex
+//#############################################
+
+package {
+    // See: http://go/android-license-faq
+    // A large-scale-change added 'default_applicable_licenses' to import
+    // all of the 'license_kinds' from "external_robolectric-shadows_license"
+    // to get the below license kinds:
+    //   SPDX-license-identifier-MIT
+    default_applicable_licenses: ["external_robolectric_license"],
+}
+
+java_library_host {
+    name: "Robolectric_shadows_multidex_upstream",
+    libs: [
+        "Robolectric_annotations_upstream",
+        "Robolectric_shadowapi_upstream",
+        "robolectric-host-android-support-multidex_upstream",
+        "robolectric-javax.annotation-api-1.2",
+        "robolectric-host-android_all_upstream",
+    ],
+    plugins: ["Robolectric_processor_upstream"],
+    javacflags: ["-Aorg.robolectric.annotation.processing.shadowPackage=org.robolectric.shadows.multidex"],
+    srcs: ["src/main/java/**/*.java"],
+}
diff --git a/shadows/playservices/Android.bp b/shadows/playservices/Android.bp
new file mode 100644
index 0000000..4b6635e
--- /dev/null
+++ b/shadows/playservices/Android.bp
@@ -0,0 +1,22 @@
+//#############################################
+// Compile Robolectric shadows playservices
+//#############################################
+
+//java_library_host {
+//    name: "Robolectric_shadows_playservices_upstream",
+//    libs: [
+//        "Robolectric_shadows_framework_upstream",
+//        "Robolectric_annotations_upstream",
+//        "Robolectric_shadowapi_upstream",
+//        "robolectric-javax.annotation-api-1.2",
+//        "guava",
+//        "robolectric-host-android_all_upstream",
+
+//   compileOnly "com.android.support:support-fragment:28.0.0"
+//   compileOnly "com.google.android.gms:play-services-base:8.4.0"
+//   compileOnly "com.google.android.gms:play-services-basement:8.4.0"
+//    ],
+//    plugins: ["Robolectric_processor_upstream"],
+//    javacflags: ["-Aorg.robolectric.annotation.processing.shadowPackage=org.robolectric.shadows.gms"],
+//    srcs: ["src/main/java/**/*.java"],
+//}
diff --git a/utils/Android.bp b/utils/Android.bp
new file mode 100644
index 0000000..bf4009c
--- /dev/null
+++ b/utils/Android.bp
@@ -0,0 +1,56 @@
+//#############################################
+// Compile Robolectric utils
+//#############################################
+
+package {
+    // See: http://go/android-license-faq
+    // A large-scale-change added 'default_applicable_licenses' to import
+    // all of the 'license_kinds' from "external_robolectric_license"
+    // to get the below license kinds:
+    //   SPDX-license-identifier-Apache-2.0
+    default_applicable_licenses: ["external_robolectric_license"],
+}
+
+java_library_host {
+    name: "Robolectric_utils_upstream",
+    srcs: ["src/main/java/**/*.java"],
+    common_srcs: ["src/main/java/**/*.kt"],
+    plugins: ["auto_service_plugin"],
+    static_libs: [
+        "robolectric-javax.annotation-api-1.2",
+        "Robolectric_annotations_upstream",
+        "Robolectric_pluginapi_upstream",
+        "error_prone_annotations",
+        "guava",
+        "jsr330",
+        "jsr305",
+        "asm-9.2",
+        "auto_service_annotations",
+    ],
+}
+
+//#############################################
+// Compile Robolectric utils tests
+//#############################################
+
+java_test_host {
+    name: "Robolectric_utils_tests_upstream",
+    srcs: [
+        "src/test/java/**/*.java",
+        "src/test/java/**/*.kt",
+    ],
+    plugins: [
+        "auto_service_plugin",
+    ],
+    static_libs: [
+        "Robolectric_utils_upstream",
+        "hamcrest",
+        "guava",
+        "junit",
+        "error_prone_core",
+        "truth-prebuilt",
+        "asm-9.2",
+        "mockito",
+    ],
+    test_suites: ["general-tests"],
+}
diff --git a/utils/reflector/Android.bp b/utils/reflector/Android.bp
new file mode 100644
index 0000000..800776d
--- /dev/null
+++ b/utils/reflector/Android.bp
@@ -0,0 +1,42 @@
+//#############################################
+// Compile Robolectric utils
+//#############################################
+
+package {
+    // See: http://go/android-license-faq
+    // A large-scale-change added 'default_applicable_licenses' to import
+    // all of the 'license_kinds' from "external_robolectric_license"
+    // to get the below license kinds:
+    //   SPDX-license-identifier-Apache-2.0
+    default_applicable_licenses: ["external_robolectric_license"],
+}
+
+java_library_host {
+    name: "Robolectric_utils_reflector_upstream",
+    static_libs: [
+        "Robolectric_utils_upstream",
+        "asm-9.2",
+        "asm-commons-9.2",
+        "asm-tree-9.2",
+        "asm-util-9.2",
+    ],
+    srcs: ["src/main/java/**/*.java"],
+}
+
+//#############################################
+// Compile Robolectric utils tests
+//#############################################
+
+java_test_host {
+    name: "Robolectric_utils_reflector_tests_upstream",
+    srcs: ["src/test/java/**/*.java"],
+    static_libs: [
+        "Robolectric_utils_reflector_upstream",
+        "Robolectric_shadowapi_upstream",
+        "hamcrest",
+        "guava",
+        "junit",
+        "truth-prebuilt",
+    ],
+    test_suites: ["general-tests"],
+}