aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRomain Jobredeaux <jobredeaux@google.com>2023-09-21 23:13:17 +0000
committerAutomerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>2023-09-21 23:13:17 +0000
commit19db65c21797b623ee389c6945199f355762c0b1 (patch)
tree20761e89ec51324cfcf20eae313fbc4c2a4b98de
parent67cfcb61f12758ca7dc4fc59f830de4aa605884e (diff)
parent2863b6c5aa5207f7285debecdffec2c3c81b864b (diff)
downloadbazelbuild-rules_android-19db65c21797b623ee389c6945199f355762c0b1.tar.gz
Merge remote-tracking branch 'aosp/upstream-main' into HEAD am: f5c4913d19 am: f4460dcb4c am: 2863b6c5aa
Original change: https://android-review.googlesource.com/c/platform/external/bazelbuild-rules_android/+/2754908 Change-Id: Ic8d68db8fee36c1b3155b8835ad39a76d85324e0 Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
-rw-r--r--MODULE.bazel47
-rw-r--r--README.md12
-rw-r--r--WORKSPACE2
-rw-r--r--WORKSPACE.bzlmod2
-rw-r--r--android/rules.bzl12
-rw-r--r--defs.bzl36
-rw-r--r--examples/basicapp/BUILD1
-rw-r--r--kokoro/presubmit/download_bazel.sh74
-rw-r--r--kokoro/presubmit/kokoro_presubmit.sh82
-rw-r--r--kokoro/presubmit/presubmit.cfg15
-rw-r--r--kokoro/presubmit/presubmit_main.sh116
-rw-r--r--mobile_install/adapters/android_binary.bzl4
-rw-r--r--prereqs.bzl58
-rw-r--r--rules/BUILD3
-rw-r--r--rules/aapt.bzl8
-rw-r--r--rules/acls/baseline_profiles_optimizer_integration.bzl1
-rw-r--r--rules/android_application/android_application_rule.bzl8
-rw-r--r--rules/android_application/android_feature_module_rule.bzl1
-rw-r--r--rules/android_binary_internal/attrs.bzl27
-rw-r--r--rules/android_binary_internal/impl.bzl280
-rw-r--r--rules/android_binary_internal/r8.bzl3
-rw-r--r--rules/android_local_test/BUILD28
-rw-r--r--rules/android_local_test/attrs.bzl220
-rw-r--r--rules/android_local_test/impl.bzl566
-rw-r--r--rules/android_local_test/rule.bzl52
-rw-r--r--rules/android_sandboxed_sdk/android_binary_with_sandboxed_sdks_macro.bzl29
-rw-r--r--rules/android_sandboxed_sdk/android_sandboxed_sdk.bzl11
-rw-r--r--rules/android_sandboxed_sdk/android_sandboxed_sdk_bundle.bzl2
-rw-r--r--rules/android_sandboxed_sdk/android_sandboxed_sdk_macro.bzl39
-rw-r--r--rules/android_sandboxed_sdk/asar_import.bzl69
-rw-r--r--rules/android_sandboxed_sdk/providers.bzl10
-rw-r--r--rules/android_sdk_repository.bzl25
-rw-r--r--rules/android_sdk_repository/BUILD18
-rw-r--r--rules/android_sdk_repository/empty.template.bzl60
-rw-r--r--rules/android_sdk_repository/helper.bzl507
-rw-r--r--rules/android_sdk_repository/rule.bzl202
-rw-r--r--rules/android_sdk_repository/template.bzl104
-rw-r--r--rules/baseline_profiles.bzl195
-rw-r--r--rules/bundletool.bzl17
-rw-r--r--rules/busybox.bzl140
-rw-r--r--rules/desugar.bzl2
-rw-r--r--rules/dex.bzl457
-rw-r--r--rules/dex_desugar_aspect.bzl5
-rw-r--r--rules/flags/BUILD2
-rw-r--r--rules/java.bzl12
-rw-r--r--rules/native_deps.bzl23
-rw-r--r--rules/proguard.bzl88
-rw-r--r--rules/resources.bzl199
-rw-r--r--rules/rules.bzl12
-rw-r--r--rules/sandboxed_sdk_toolbox.bzl172
-rw-r--r--rules/utils.bzl3
-rw-r--r--rules_android_maven_install.json3627
-rw-r--r--src/tools/ak/rjar/rjar_test.go2
-rw-r--r--src/tools/java/com/google/devtools/build/android/sandboxedsdktoolbox/BUILD1
-rw-r--r--src/tools/java/com/google/devtools/build/android/sandboxedsdktoolbox/SandboxedSdkToolbox.java4
-rw-r--r--src/tools/java/com/google/devtools/build/android/sandboxedsdktoolbox/apidescriptors/ExtractApiDescriptorsFromAsarCommand.java59
-rw-r--r--src/tools/java/com/google/devtools/build/android/sandboxedsdktoolbox/clientsources/BUILD17
-rw-r--r--src/tools/java/com/google/devtools/build/android/sandboxedsdktoolbox/clientsources/GenerateClientSourcesCommand.java99
-rw-r--r--src/tools/javatests/com/google/devtools/build/android/sandboxedsdktoolbox/apidescriptors/ExtractApiDescriptorsFromAsarCommandTest.java57
-rw-r--r--src/tools/javatests/com/google/devtools/build/android/sandboxedsdktoolbox/utils/TestData.java2
-rw-r--r--src/tools/javatests/com/google/devtools/build/android/sandboxedsdktoolbox/utils/Zip.java48
-rw-r--r--test/bashunit/unittest_test.py2
-rw-r--r--test/rules/android_sdk_repository/BUILD75
-rw-r--r--test/rules/android_sdk_repository/android_helper.sh257
-rwxr-xr-xtest/rules/android_sdk_repository/android_sdk_repository_platforms_test.sh37
-rwxr-xr-xtest/rules/android_sdk_repository/android_sdk_repository_test.sh37
-rw-r--r--test/rules/android_sdk_repository/test_lib.sh196
-rw-r--r--test/utils/asserts.bzl4
-rw-r--r--test/utils/integration_demo/BUILD30
-rwxr-xr-xtest/utils/integration_demo/demo_test.sh40
-rw-r--r--toolchains/android/toolchain.bzl22
-rw-r--r--tools/jdk/BUILD12
72 files changed, 8273 insertions, 416 deletions
diff --git a/MODULE.bazel b/MODULE.bazel
index 7a6c172..82c2a0d 100644
--- a/MODULE.bazel
+++ b/MODULE.bazel
@@ -1,11 +1,12 @@
module(
- name = "bazel_build_rules_android",
+ name = "rules_android",
version = "0.2.0",
)
bazel_dep(name = "platforms", version = "0.0.5")
bazel_dep(name = "rules_license", version = "0.0.4")
bazel_dep(name = "rules_java", version = "6.0.0")
+
rules_java_toolchains = use_extension("@rules_java//java:extensions.bzl", "toolchains")
use_repo(rules_java_toolchains, "remote_java_tools")
@@ -15,20 +16,24 @@ bazel_dep(name = "bazel_skylib", version = "1.0.3")
bazel_dep(name = "rules_robolectric", version = "4.10")
register_toolchains("//toolchains/android:all")
+
register_toolchains("//toolchains/android_sdk:all")
+
register_toolchains("//toolchains/emulator:all")
# go-related dependency setup
-bazel_dep(name = "rules_go", version = "0.39.1", repo_name = "io_bazel_rules_go")
+bazel_dep(name = "rules_go", version = "0.40.1", repo_name = "io_bazel_rules_go")
bazel_dep(name = "gazelle", version = "0.28.0", repo_name = "bazel_gazelle")
bazel_dep(name = "abseil-py", version = "1.4.0", repo_name = "py_absl")
+
go_sdk = use_extension("@io_bazel_rules_go//go:extensions.bzl", "go_sdk")
+
go_deps = use_extension("@bazel_gazelle//:extensions.bzl", "go_deps")
go_deps.from_file(go_mod = "//:go.mod")
use_repo(
go_deps,
- "org_golang_google_protobuf",
"com_github_google_go_cmp",
+ "org_golang_google_protobuf",
"org_golang_x_sync",
)
@@ -41,15 +46,9 @@ bazel_dep(name = "rules_proto", version = "5.3.0-21.7", repo_name = "rules_proto
maven = use_extension("@rules_jvm_external//:extensions.bzl", "maven")
maven.install(
name = "rules_android_maven",
- artifacts = [
- "com.android.tools.build:bundletool:1.15.2",
- "com.android.tools.build:gradle:8.2.0-alpha15",
- "com.google.guava:guava:32.1.2-jre",
- "com.google.protobuf:protobuf-java-util:3.9.2",
- "com.google.truth:truth:1.1.5",
- "info.picocli:picocli:4.7.4",
- "junit:junit:4.13.2",
- ],
+ # To generate the maven lockfile, run this command:
+ # bazel run --noenable_bzlmod @rules_android_maven//:pin
+ lock_file = "//:rules_android_maven_install.json",
repositories = [
"https://maven.google.com",
"https://repo1.maven.org/maven2",
@@ -57,8 +56,28 @@ maven.install(
)
use_repo(
maven,
- "rules_android_maven"
+ "rules_android_maven",
)
remote_android_extensions = use_extension("@bazel_tools//tools/android:android_extensions.bzl", "remote_android_tools_extensions")
-use_repo(remote_android_extensions, "android_tools", "android_gmaven_r8")
+use_repo(remote_android_extensions, "android_gmaven_r8", "android_tools")
+
+# integration test setup
+bazel_dep(
+ name = "rules_bazel_integration_test",
+ version = "0.17.0",
+ dev_dependency = True,
+)
+bazel_dep(
+ name = "cgrindel_bazel_starlib",
+ version = "0.17.0",
+ dev_dependency = True,
+)
+
+bazel_binaries = use_extension(
+ "@rules_bazel_integration_test//:extensions.bzl",
+ "bazel_binaries",
+ dev_dependency = True,
+)
+bazel_binaries.download(version = "last_green")
+use_repo(bazel_binaries, "bazel_binaries")
diff --git a/README.md b/README.md
index 356481b..9bd1cee 100644
--- a/README.md
+++ b/README.md
@@ -33,24 +33,24 @@ To use the Starlark Bazel Android rules, add the following to your WORKSPACE fil
RULES_ANDROID_COMMIT= "0bf3093bd011acd35de3c479c8990dd630d552aa"
RULES_ANDROID_SHA = "b75a673a66c157138ab53f4d8612a6e655d38b69bb14207c1a6675f0e10afa61"
http_archive(
- name = "build_bazel_rules_android",
+ name = "rules_android",
url = "https://github.com/bazelbuild/rules_android/archive/%s.zip" % RULES_ANDROID_COMMIT,
sha256 = RULES_ANDROID_SHA,
strip_prefix = "rules_android-%s" % RULES_ANDROID_COMMIT,
)
- load("@build_bazel_rules_android//:prereqs.bzl", "rules_android_prereqs")
+ load("@rules_android//:prereqs.bzl", "rules_android_prereqs")
rules_android_prereqs()
- load("@build_bazel_rules_android//:defs.bzl", "rules_android_workspace")
+ load("@rules_android//:defs.bzl", "rules_android_workspace")
rules_android_workspace()
register_toolchains(
- "@build_bazel_rules_android//toolchains/android:android_default_toolchain",
- "@build_bazel_rules_android//toolchains/android_sdk:android_sdk_tools",
+ "@rules_android//toolchains/android:android_default_toolchain",
+ "@rules_android//toolchains/android_sdk:android_sdk_tools",
)
Then, in your BUILD files, import and use the rules:
- load("@build_bazel_rules_android//rules:rules.bzl", "android_binary", "android_library")
+ load("@rules_android//rules:rules.bzl", "android_binary", "android_library")
android_binary(
...
)
diff --git a/WORKSPACE b/WORKSPACE
index 7aab8a6..fd043f2 100644
--- a/WORKSPACE
+++ b/WORKSPACE
@@ -1,4 +1,4 @@
-workspace(name = "build_bazel_rules_android")
+workspace(name = "rules_android")
load("@bazel_tools//tools/build_defs/repo:utils.bzl", "maybe")
load(":android_sdk_supplemental_repository.bzl", "android_sdk_supplemental_repository")
diff --git a/WORKSPACE.bzlmod b/WORKSPACE.bzlmod
index 540b125..ce455f6 100644
--- a/WORKSPACE.bzlmod
+++ b/WORKSPACE.bzlmod
@@ -1,4 +1,4 @@
-workspace(name = "build_bazel_rules_android")
+workspace(name = "rules_android")
load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive")
load("@bazel_tools//tools/build_defs/repo:utils.bzl", "maybe")
diff --git a/android/rules.bzl b/android/rules.bzl
index ed1cd2d..3505ecb 100644
--- a/android/rules.bzl
+++ b/android/rules.bzl
@@ -33,6 +33,10 @@ load(
_android_library = "android_library_macro",
)
load(
+ "//rules/android_local_test:rule.bzl",
+ _android_local_test = "android_local_test",
+)
+load(
"//rules:android_ndk_repository.bzl",
_android_ndk_repository = "android_ndk_repository",
)
@@ -49,13 +53,17 @@ load(
_android_sdk = "android_sdk",
)
load(
- "//rules:android_sdk_repository.bzl",
+ "//rules/android_sdk_repository:rule.bzl",
_android_sdk_repository = "android_sdk_repository",
)
load(
"//rules:android_tools_defaults_jar.bzl",
_android_tools_defaults_jar = "android_tools_defaults_jar",
)
+load(
+ "//rules/android_sandboxed_sdk:asar_import.bzl",
+ _asar_import = "asar_import",
+)
# Current version. Tools may check this to determine compatibility.
RULES_ANDROID_VERSION = "0.1.0"
@@ -64,9 +72,11 @@ aar_import = _aar_import
android_application = _android_application
android_binary = _android_binary
android_library = _android_library
+android_local_test = _android_local_test
android_ndk_repository = _android_ndk_repository
android_sandboxed_sdk = _android_sandboxed_sdk
android_sandboxed_sdk_bundle = _android_sandboxed_sdk_bundle
android_sdk = _android_sdk
android_sdk_repository = _android_sdk_repository
android_tools_defaults_jar = _android_tools_defaults_jar
+asar_import = _asar_import
diff --git a/defs.bzl b/defs.bzl
index 8dfd421..4e91209 100644
--- a/defs.bzl
+++ b/defs.bzl
@@ -14,14 +14,15 @@
"""Workspace setup macro for rules_android."""
-load("@bazel_skylib//:workspace.bzl", "bazel_skylib_workspace")
load("@bazel_gazelle//:deps.bzl", "gazelle_dependencies", "go_repository")
+load("@bazel_skylib//:workspace.bzl", "bazel_skylib_workspace")
+load("@cgrindel_bazel_starlib//:deps.bzl", "bazel_starlib_dependencies")
load("@com_google_protobuf//:protobuf_deps.bzl", "protobuf_deps")
load("@io_bazel_rules_go//go:deps.bzl", "go_register_toolchains", "go_rules_dependencies")
load("@robolectric//bazel:robolectric.bzl", "robolectric_repositories")
+load("@rules_bazel_integration_test//bazel_integration_test:defs.bzl", "bazel_binaries")
load("@rules_java//java:repositories.bzl", "rules_java_dependencies", "rules_java_toolchains")
load("@rules_jvm_external//:defs.bzl", "maven_install")
-load("@rules_jvm_external//:specs.bzl", "maven")
load("@rules_proto//proto:repositories.bzl", "rules_proto_dependencies", "rules_proto_toolchains")
load("@rules_python//python:repositories.bzl", "py_repositories")
@@ -34,22 +35,14 @@ def rules_android_workspace():
maven_install(
name = "rules_android_maven",
artifacts = [
- "androidx.privacysandbox.tools:tools:1.0.0-alpha05",
- maven.artifact(
- group = "androidx.privacysandbox.tools",
- artifact = "tools-apipackager",
- version = "1.0.0-alpha05",
- exclusions = [
- # Alpha05 pulls in the lite version of protobuf library,
- # which doesn't have the JSON utils we need and clashes with
- # com.google.protobuf:protobuf-java-util.
- # This was fixed in AOSP, so this can be removed once
- # the packager releases a new version (>alpha05).
- "com.google.protobuf:protobuf-javalite",
- ],
- ),
+ "androidx.privacysandbox.tools:tools:1.0.0-alpha06",
+ "androidx.privacysandbox.tools:tools-apigenerator:1.0.0-alpha06",
+ "androidx.privacysandbox.tools:tools-apipackager:1.0.0-alpha06",
+ "androidx.test:core:1.6.0-alpha01",
+ "androidx.test.ext:junit:1.2.0-alpha01",
"com.android.tools.build:bundletool:1.15.2",
"com.android.tools.build:gradle:8.2.0-alpha15",
+ "org.robolectric:robolectric:4.10.3",
"com.google.guava:guava:32.1.2-jre",
"com.google.protobuf:protobuf-java-util:3.9.2",
"com.google.truth:truth:1.1.5",
@@ -64,7 +57,7 @@ def rules_android_workspace():
go_rules_dependencies()
- go_register_toolchains(version = "1.18.3")
+ go_register_toolchains(version = "1.20.5")
gazelle_dependencies()
# gazelle:repository go_repository name=org_golang_x_xerrors importpath=golang.org/x/xerrors
@@ -99,3 +92,12 @@ def rules_android_workspace():
rules_proto_toolchains()
py_repositories()
+
+ # Integration test setup
+ bazel_starlib_dependencies()
+
+ bazel_binaries(
+ versions = [
+ "last_green",
+ ],
+ )
diff --git a/examples/basicapp/BUILD b/examples/basicapp/BUILD
new file mode 100644
index 0000000..a09fce9
--- /dev/null
+++ b/examples/basicapp/BUILD
@@ -0,0 +1 @@
+# Empty build file to satisfy gazelle for rules_go. \ No newline at end of file
diff --git a/kokoro/presubmit/download_bazel.sh b/kokoro/presubmit/download_bazel.sh
deleted file mode 100644
index 2c96b70..0000000
--- a/kokoro/presubmit/download_bazel.sh
+++ /dev/null
@@ -1,74 +0,0 @@
-#!/bin/bash
-# Copyright 2022 The Bazel Authors. All rights reserved.
-#
-# 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.
-
-
-function DownloadBazel() {
- # Utility function to download a specified version of bazel to a given
- # installation directory.
- # Positional arguments:
- # ver: The version to install. Supports "latest" (major and minor releases),
- # "latest-with-prereleases" (all versions from "latest" + prereleases),
- # major/minor releases such as 5.2.0, and also prereleases such as
- # 6.0.0-pre.20220720.3. Release candidates with "rc" in the name are NOT
- # supported.
- # platform: The platform to install. Currently only "linux" has been
- # validated.
- # arch: Architecture to install. Currently only "x86_64" has been validated.
- # dest: Where to install Bazel. Must be a user-writeable directory,
- # otherwise the root user must call this function through sudo.
- # Returns:
- # Echoes the installation directory at the end of installation.
- (
- set -euxo pipefail
- # Significantly cribbed from
- # devtools/kokoro/vanadium/linux_scripts/usr/local/bin/use_bazel.sh
- # Temporary workaround solution until use_bazel.sh can download prereleases.
-
- # Positional arguments
- local ver="$1"
- local platform="$2"
- local arch="$3"
- local dest="$4"
-
- # Function-local helper variables
- local gcs_uri=""
- local revision_identifier=""
- if [[ "$ver" == "latest" || "$ver" == "latest-with-prereleases" ]]; then
- # Query binary blob bucket to find the latest prerelease
- if [[ "$ver" == "latest" ]]; then
- # Filter out prereleases
- ver=$(gsutil ls -l gs://bazel/**/*-installer-"${platform}"-"${arch}".sh | grep "gs://" | grep -v rc | grep -v pre | tail -n1 | awk '{print $NF}')
- else
- ver=$(gsutil ls -l gs://bazel/**/*-installer-"${platform}"-"${arch}".sh | grep "gs://" | grep -v rc | tail -n1 | awk '{print $NF}')
- fi
- ver=$(echo "$ver" | sed -n "s/.*bazel\-\(.*\)\-installer.*/\1/p")
- fi
- if [[ "$ver" =~ pre ]]; then
- revision_identifier=$(echo "$ver" | awk -F"-" '{print $1}')
- gcs_uri="gs://bazel/${revision_identifier}/rolling/${ver}/bazel-${ver}-installer-${platform}-${arch}.sh"
- else
- gcs_uri="gs://bazel/${ver}/release/bazel-${ver}-installer-${platform}-${arch}.sh"
- fi
-
- # Download the installer from GCS
- gsutil -q cp "$gcs_uri" "$dest"/bazel_installer.sh
- mkdir -p "$dest"/install
- # Run the installer
- bash "$dest"/bazel_installer.sh --prefix="$dest"/install > /dev/null
- ls -d "$dest"/install
- )
-}
-
-
diff --git a/kokoro/presubmit/kokoro_presubmit.sh b/kokoro/presubmit/kokoro_presubmit.sh
index 1c183f4..e2c211c 100644
--- a/kokoro/presubmit/kokoro_presubmit.sh
+++ b/kokoro/presubmit/kokoro_presubmit.sh
@@ -16,74 +16,30 @@
set -e
set -x
-source "${KOKORO_GFILE_DIR}/download_bazel.sh"
-echo "== installing bazel ========================================="
-bazel_install_dir=$(mktemp -d)
-BAZEL_VERSION="latest-with-prereleases"
-DownloadBazel "$BAZEL_VERSION" linux x86_64 "$bazel_install_dir"
-bazel="$bazel_install_dir/install/bin/bazel"
-chmod +x "$bazel"
-bazel_detected_version=$("$bazel" version | grep "Build label" | awk -F": " '{print $2}')
-echo "============================================================="
-
-function Cleanup() {
- # Clean up all temporary directories: bazel install, sandbox, and
- # android_tools.
- rm -rf "$bazel_install_dir"
-}
-trap Cleanup EXIT
+# Set up the SDK as root to avoid having to deal with user file permissions
# Kokoro is no longer updating toolchains in their images, so install newer
# android build tools, because the latest one installed (26.0.2) has some bug
# in APPT2 which causes the magic number to be incorrect for some files it
# outputs.
#
-# Use "yes" to accept sdk licenses.
cd "$ANDROID_HOME"
-yes | tools/bin/sdkmanager --install "build-tools;30.0.3" &>/dev/null
-yes | tools/bin/sdkmanager --licenses &>/dev/null
-
-# ANDROID_HOME is already in the environment.
-export ANDROID_NDK_HOME="/opt/android-ndk-r16b"
-
-# Create a tmpfs in the sandbox at "/tmp/hsperfdata_$USERNAME" to avoid the
-# problems described in https://github.com/bazelbuild/bazel/issues/3236
-# Basically, the JVM creates a file at /tmp/hsperfdata_$USERNAME/$PID, but
-# processes all get a PID of 2 in the sandbox, so concurrent Java build actions
-# could crash because they're trying to modify the same file. So, tell the
-# sandbox to mount a tmpfs at /tmp/hsperfdata_$(whoami) so that each JVM gets
-# its own version of that directory.
-hsperfdata_dir="/tmp/hsperfdata_$(whoami)_rules_android"
-mkdir "$hsperfdata_dir"
-
-COMMON_ARGS=(
- "--sandbox_tmpfs_path=$hsperfdata_dir"
- "--verbose_failures"
- "--experimental_google_legacy_api"
- "--experimental_enable_android_migration_apis"
- "--build_tests_only"
- # Java tests use language version at least 11, but they might depend on
- # libraries that were built for Java 17.
- "--java_language_version=11"
- "--java_runtime_version=17"
- "--test_output=errors"
-)
-
-# Go to rules_android workspace and run relevant tests.
-cd "${KOKORO_ARTIFACTS_DIR}/git/rules_android"
-
-# Fetch all external deps; should reveal any bugs related to external dep
-# references.
-"$bazel" aquery 'deps(...)' 2>&1 > /dev/null
-
-"$bazel" test "${COMMON_ARGS[@]}" //src/common/golang/... \
- //src/tools/ak/... \
- //src/tools/javatests/... \
- //src/tools/jdeps/... \
- //src/tools/java/... \
- //test/...
-
-# Go to basic app workspace in the source tree
-cd "${KOKORO_ARTIFACTS_DIR}/git/rules_android/examples/basicapp"
-"$bazel" build "${COMMON_ARGS[@]}" //java/com/basicapp:basic_app
+# Use "yes" to accept sdk licenses.
+yes | cmdline-tools/latest/bin/sdkmanager --install "build-tools;30.0.3" "extras;android;m2repository" &>/dev/null
+yes | cmdline-tools/latest/bin/sdkmanager --licenses &>/dev/null
+chmod -R o=rx "$ANDROID_HOME"
+
+# Remainder of this file deals with setting up a non-root build account,
+# and using it to run presubmit
+# User account needs to be able to read $ANDROID_HOME (+r) and traverse directories (+x)
+chmod -R o=rx "$ANDROID_HOME"
+
+# Make the non-root account
+export KOKORO_USER="bazel-builder"
+useradd -m -s /bin/bash "$KOKORO_USER"
+
+# Run presubmit as bazel-builder, and pass ANDROID_HOME and KOKORO_ARTIFACTS_DIR
+# from root user's environment to bazel-builder's environment
+runuser -w ANDROID_HOME,KOKORO_ARTIFACTS_DIR -l "$KOKORO_USER" \
+ -c "bash ${KOKORO_ARTIFACTS_DIR}/git/rules_android/kokoro/presubmit/presubmit_main.sh" \ No newline at end of file
diff --git a/kokoro/presubmit/presubmit.cfg b/kokoro/presubmit/presubmit.cfg
index 8bf3662..0682896 100644
--- a/kokoro/presubmit/presubmit.cfg
+++ b/kokoro/presubmit/presubmit.cfg
@@ -1,17 +1,2 @@
-# The version of bazel to use to test the Starlark Android Rules.
-# Update this as newer versions of bazel are released.
-build_params {
- key: "bazel_version"
- value: "5.0.0"
-}
-
-env_vars {
- key: "bazel_version"
- value: "$[bazel_version]"
-}
-
-gfile_resources: "/x20/teams/bazel/releases/bazel-$[bazel_version]-linux-x86_64"
-gfile_resources: "/google_src/files/head/depot/google3/third_party/bazel_rules/rules_android/kokoro/presubmit/download_bazel.sh"
-
build_file: "rules_android/kokoro/presubmit/kokoro_presubmit.sh"
diff --git a/kokoro/presubmit/presubmit_main.sh b/kokoro/presubmit/presubmit_main.sh
new file mode 100644
index 0000000..ceb4bd9
--- /dev/null
+++ b/kokoro/presubmit/presubmit_main.sh
@@ -0,0 +1,116 @@
+#!/bin/bash
+# Copyright 2023 The Bazel Authors. All rights reserved.
+#
+# 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.
+
+function DownloadBazelisk() {
+ # Utility function to download a specified version of bazelisk to a given
+ # installation directory. Adds the directory to PATH.
+ # Positional arguments:
+ # version: The version to install.
+ # platform: The platform to install. Currently only "linux" has been
+ # validated.
+ # arch: Architecture to install. Currently only "arm64" has been validated.
+ # dest: Where to install Bazelisk. Must be a user-writeable directory,
+ # otherwise the root user must call this function through sudo.
+ (
+ set -euxo pipefail
+
+ # Positional arguments
+ local version="${1:-1.18.0}"
+ local platform="${2:-linux}"
+ local arch="${3:-amd64}"
+ local dest="${4:-${TMPDIR}/bazelisk-release}"
+
+ download_url="https://github.com/bazelbuild/bazelisk/releases/download/v${version}/bazelisk-${platform}-${arch}"
+ mkdir -p "${dest}"
+ wget -nv ${download_url} -O "${dest}/bazelisk"
+ chmod +x "${dest}/bazelisk"
+ ln -s "${dest}/bazelisk" "${dest}/bazel"
+ export PATH="${dest}:${PATH}"
+ type -a bazel
+ echo "Bazelisk ${version} installation completed."
+ )
+}
+
+function main() {
+ set -euxo pipefail
+ echo "== installing bazelisk ========================================="
+ bazel_install_dir=$(mktemp -d)
+ BAZELISK_VERSION="1.18.0"
+ export USE_BAZEL_VERSION="last_green"
+ DownloadBazelisk "$BAZELISK_VERSION" linux amd64 "$bazel_install_dir"
+ bazel="$bazel_install_dir/bazel"
+ echo "============================================================="
+
+ function Cleanup() {
+ # Clean up all temporary directories: bazelisk install, sandbox, and
+ # android_tools.
+ rm -rf "$bazel_install_dir"
+ }
+ trap Cleanup EXIT
+
+ function cd () {
+ # This is necessary due to a weird docker image issue where non-root
+ # accounts have `cd` overriden by a function that has an unbound variable.
+ # The unbound variable caues presubmit failure to due `set -u` above.
+ # The `cd` override only happens for non-root users.
+ builtin cd "$@"
+ }
+
+ # ANDROID_HOME is already in the environment.
+ export ANDROID_NDK_HOME="/opt/android-ndk-r16b"
+
+ # Create a tmpfs in the sandbox at "/tmp/hsperfdata_$USERNAME" to avoid the
+ # problems described in https://github.com/bazelbuild/bazel/issues/3236
+ # Basically, the JVM creates a file at /tmp/hsperfdata_$USERNAME/$PID, but
+ # processes all get a PID of 2 in the sandbox, so concurrent Java build actions
+ # could crash because they're trying to modify the same file. So, tell the
+ # sandbox to mount a tmpfs at /tmp/hsperfdata_$(whoami) so that each JVM gets
+ # its own version of that directory.
+ hsperfdata_dir="/tmp/hsperfdata_$(whoami)_rules_android"
+ mkdir "$hsperfdata_dir"
+
+ COMMON_ARGS=(
+ "--sandbox_tmpfs_path=$hsperfdata_dir"
+ "--verbose_failures"
+ "--experimental_google_legacy_api"
+ "--experimental_enable_android_migration_apis"
+ "--build_tests_only"
+ # Java tests use language version at least 11, but they might depend on
+ # libraries that were built for Java 17.
+ "--java_language_version=11"
+ "--java_runtime_version=17"
+ "--test_output=errors"
+ )
+
+ # Go to rules_android workspace and run relevant tests.
+ cd "${KOKORO_ARTIFACTS_DIR}/git/rules_android"
+
+ # Fetch all external deps; should reveal any bugs related to external dep
+ # references.
+ "$bazel" aquery 'deps(...)' --noenable_bzlmod 2>&1 > /dev/null
+
+ "$bazel" test "${COMMON_ARGS[@]}" //src/common/golang/... \
+ //src/tools/ak/... \
+ //src/tools/javatests/... \
+ //src/tools/jdeps/... \
+ //src/tools/java/... \
+ //test/...
+
+ # Go to basic app workspace in the source tree
+ cd "${KOKORO_ARTIFACTS_DIR}/git/rules_android/examples/basicapp"
+ "$bazel" build "${COMMON_ARGS[@]}" //java/com/basicapp:basic_app
+}
+
+main \ No newline at end of file
diff --git a/mobile_install/adapters/android_binary.bzl b/mobile_install/adapters/android_binary.bzl
index 8ea2c04..76f00ef 100644
--- a/mobile_install/adapters/android_binary.bzl
+++ b/mobile_install/adapters/android_binary.bzl
@@ -46,6 +46,7 @@ def extract(target, ctx):
Returns:
Input for process method
"""
+ extension_registry_class_jar = utils.get_extension_registry_class_jar(target)
return dict(
debug_key = utils.only(ctx.rule.files.debug_key, allow_empty = True),
debug_signing_keys = ctx.rule.files.debug_signing_keys,
@@ -81,6 +82,9 @@ def extract(target, ctx):
target[JavaInfo].runtime_output_jars,
) +
(
+ [
+ extension_registry_class_jar,
+ ] if extension_registry_class_jar else []
),
target[JavaInfo].transitive_compile_time_jars,
),
diff --git a/prereqs.bzl b/prereqs.bzl
index e84b538..2c70587 100644
--- a/prereqs.bzl
+++ b/prereqs.bzl
@@ -17,7 +17,6 @@
load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive")
load("@bazel_tools//tools/build_defs/repo:utils.bzl", "maybe")
-
def rules_android_prereqs():
"""Downloads prerequisite repositories for rules_android."""
maybe(
@@ -50,8 +49,8 @@ def rules_android_prereqs():
name = "remote_java_tools_for_rules_android",
sha256 = "8fb4d3138bd92a9d3324dae29c9f70d91ca2db18cd0bf1997446eed4657d19b3",
urls = [
- "https://mirror.bazel.build/bazel_java_tools/releases/java/v11.8/java_tools-v11.8.zip",
- "https://github.com/bazelbuild/java_tools/releases/download/java_v11.8/java_tools-v11.8.zip",
+ "https://mirror.bazel.build/bazel_java_tools/releases/java/v11.8/java_tools-v11.8.zip",
+ "https://github.com/bazelbuild/java_tools/releases/download/java_v11.8/java_tools-v11.8.zip",
],
)
@@ -68,10 +67,10 @@ def rules_android_prereqs():
maybe(
http_archive,
name = "io_bazel_rules_go",
- sha256 = "dd926a88a564a9246713a9c00b35315f54cbd46b31a26d5d8fb264c07045f05d",
+ sha256 = "51dc53293afe317d2696d4d6433a4c33feedb7748a9e352072e2ec3c0dafd2c6",
urls = [
- "https://mirror.bazel.build/github.com/bazelbuild/rules_go/releases/download/v0.38.1/rules_go-v0.38.1.zip",
- "https://github.com/bazelbuild/rules_go/releases/download/v0.38.1/rules_go-v0.38.1.zip",
+ "https://mirror.bazel.build/github.com/bazelbuild/rules_go/releases/download/v0.40.1/rules_go-v0.40.1.zip",
+ "https://github.com/bazelbuild/rules_go/releases/download/v0.40.1/rules_go-v0.40.1.zip",
],
)
@@ -94,13 +93,13 @@ def rules_android_prereqs():
)
maybe(
- http_archive,
- name = "rules_license",
- urls = [
- "https://github.com/bazelbuild/rules_license/releases/download/0.0.4/rules_license-0.0.4.tar.gz",
- "https://mirror.bazel.build/github.com/bazelbuild/rules_license/releases/download/0.0.4/rules_license-0.0.4.tar.gz",
- ],
- sha256 = "6157e1e68378532d0241ecd15d3c45f6e5cfd98fc10846045509fb2a7cc9e381",
+ http_archive,
+ name = "rules_license",
+ urls = [
+ "https://github.com/bazelbuild/rules_license/releases/download/0.0.4/rules_license-0.0.4.tar.gz",
+ "https://mirror.bazel.build/github.com/bazelbuild/rules_license/releases/download/0.0.4/rules_license-0.0.4.tar.gz",
+ ],
+ sha256 = "6157e1e68378532d0241ecd15d3c45f6e5cfd98fc10846045509fb2a7cc9e381",
)
maybe(
@@ -124,13 +123,30 @@ def rules_android_prereqs():
)
maybe(
- http_archive,
- name = "rules_python",
- strip_prefix = "rules_python-0.23.1",
- urls = [
- "https://github.com/bazelbuild/rules_python/releases/download/0.23.1/rules_python-0.23.1.tar.gz",
- "https://mirror.bazel.build/github.com/bazelbuild/rules_python/releases/download/0.23.1/rules_python-0.23.1.tar.gz",
- ],
- sha256 = "84aec9e21cc56fbc7f1335035a71c850d1b9b5cc6ff497306f84cced9a769841",
+ http_archive,
+ name = "rules_python",
+ strip_prefix = "rules_python-0.23.1",
+ urls = [
+ "https://github.com/bazelbuild/rules_python/releases/download/0.23.1/rules_python-0.23.1.tar.gz",
+ "https://mirror.bazel.build/github.com/bazelbuild/rules_python/releases/download/0.23.1/rules_python-0.23.1.tar.gz",
+ ],
+ sha256 = "84aec9e21cc56fbc7f1335035a71c850d1b9b5cc6ff497306f84cced9a769841",
+ )
+
+ maybe(
+ http_archive,
+ name = "rules_bazel_integration_test",
+ sha256 = "d6dada79939533a8127000d2aafa125f29a4a97f720e01c050fdeb81b1080b08",
+ urls = [
+ "https://github.com/bazel-contrib/rules_bazel_integration_test/releases/download/v0.17.0/rules_bazel_integration_test.v0.17.0.tar.gz",
+ ],
)
+ maybe(
+ http_archive,
+ name = "cgrindel_bazel_starlib",
+ sha256 = "a8d25340956b429b56302d3fd702bb3df8b3a67db248dd32b3084891ad497964",
+ urls = [
+ "https://github.com/cgrindel/bazel-starlib/releases/download/v0.17.0/bazel-starlib.v0.17.0.tar.gz",
+ ],
+ )
diff --git a/rules/BUILD b/rules/BUILD
index f31dd0a..467072b 100644
--- a/rules/BUILD
+++ b/rules/BUILD
@@ -43,6 +43,7 @@ bzl_library(
"proguard.bzl",
"providers.bzl",
"resources.bzl",
+ "sandboxed_sdk_toolbox.bzl",
"utils.bzl",
],
visibility = ["//:__subpackages__"],
@@ -69,7 +70,6 @@ bzl_library(
srcs = [
"android_ndk_repository.bzl",
"android_sdk.bzl",
- "android_sdk_repository.bzl",
"android_tools_defaults_jar.bzl",
"baseline_profiles.bzl",
"dex.bzl",
@@ -83,6 +83,7 @@ bzl_library(
"//rules/aar_import:bzl",
"//rules/android_library:bzl",
"//rules/android_sandboxed_sdk:bzl",
+ "//rules/android_sdk_repository:bzl",
"//rules/flags:bzl",
],
)
diff --git a/rules/aapt.bzl b/rules/aapt.bzl
index 284d89a..b6a4752 100644
--- a/rules/aapt.bzl
+++ b/rules/aapt.bzl
@@ -14,6 +14,11 @@
"""Bazel AAPT Commands."""
+load(
+ "//rules:utils.bzl",
+ "ANDROID_TOOLCHAIN_TYPE",
+)
+
def _link(
ctx,
out_r_java,
@@ -112,6 +117,7 @@ echo $(tac $1) > $2
outputs = [out_resource_apk, out_r_java],
mnemonic = "LinkAndroidResources",
progress_message = "ResV3 Linking Android Resources to %s" % out_resource_apk.short_path,
+ toolchain = ANDROID_TOOLCHAIN_TYPE,
)
def _compile(
@@ -170,6 +176,7 @@ done
outputs = [out_dir],
mnemonic = "CompileAndroidResources",
progress_message = "ResV3 Compiling Android Resources in %s" % out_dir,
+ toolchain = ANDROID_TOOLCHAIN_TYPE,
)
def _convert(
@@ -191,6 +198,7 @@ def _convert(
outputs = [out],
mnemonic = "AaptConvert",
progress_message = "ResV3 Convert to %s" % out.short_path,
+ toolchain = ANDROID_TOOLCHAIN_TYPE,
)
aapt = struct(
diff --git a/rules/acls/baseline_profiles_optimizer_integration.bzl b/rules/acls/baseline_profiles_optimizer_integration.bzl
index 6fea730..67014e5 100644
--- a/rules/acls/baseline_profiles_optimizer_integration.bzl
+++ b/rules/acls/baseline_profiles_optimizer_integration.bzl
@@ -16,4 +16,5 @@
# keep sorted
BASELINE_PROFILES_OPTIMIZER_INTEGRATION = [
+ "//test/rules/android_binary_internal:__subpackages__",
]
diff --git a/rules/android_application/android_application_rule.bzl b/rules/android_application/android_application_rule.bzl
index 0a931da..a2c9b70 100644
--- a/rules/android_application/android_application_rule.bzl
+++ b/rules/android_application/android_application_rule.bzl
@@ -177,6 +177,7 @@ def _create_feature_manifest(
],
mnemonic = "GenFeatureManifest",
progress_message = "Generating AndroidManifest.xml for " + feature_target.label.name,
+ toolchain = None,
)
return manifest
@@ -201,6 +202,7 @@ def _create_feature_manifest(
],
mnemonic = "GenPriorityFeatureManifest",
progress_message = "Generating Priority AndroidManifest.xml for " + feature_target.label.name,
+ toolchain = None,
)
args = ctx.actions.args()
@@ -213,6 +215,7 @@ def _create_feature_manifest(
inputs = [priority_manifest, info.manifest],
outputs = [manifest],
arguments = [args],
+ toolchain = None,
)
return manifest
@@ -336,7 +339,10 @@ android_application = rule(
"deploy_script": "%{name}.sh",
"unsigned_aab": "%{name}_unsigned.aab",
},
- toolchains = ["//toolchains/android:toolchain_type"],
+ toolchains = [
+ "//toolchains/android:toolchain_type",
+ "@bazel_tools//tools/jdk:toolchain_type",
+ ],
_skylark_testable = True,
)
diff --git a/rules/android_application/android_feature_module_rule.bzl b/rules/android_application/android_feature_module_rule.bzl
index a0f7d2b..439548b 100644
--- a/rules/android_application/android_feature_module_rule.bzl
+++ b/rules/android_application/android_feature_module_rule.bzl
@@ -55,6 +55,7 @@ def _impl(ctx):
],
mnemonic = "ValidateFeatureModule",
progress_message = "Validating feature module %s" % str(ctx.label),
+ toolchain = None,
)
return [
diff --git a/rules/android_binary_internal/attrs.bzl b/rules/android_binary_internal/attrs.bzl
index 0fadb06..9a2df04 100644
--- a/rules/android_binary_internal/attrs.bzl
+++ b/rules/android_binary_internal/attrs.bzl
@@ -81,6 +81,19 @@ ATTRS = _attrs.replace(
profile, speeding up app startup time or reducing jank in some circumstances.
""",
),
+ startup_profiles = attr.label_list(
+ allow_empty = True,
+ allow_files = [".txt"],
+ doc = """
+ List of baseline profiles that were collected at runtime (often from start-up) for
+ this binary. When this is specified, all baseline profiles (including these) are
+ used to inform code optimizations in the build toolchain. This may improve runtime
+ performance at the cost of dex size. If the dex size cost is too large and the
+ performance wins too small, the same profiles can be provided as a dep from an
+ android_library with `baseline_profiles` to avoid the runtime-focused code
+ optimizations that are enabled by `startup_profiles`.
+ """,
+ ),
proguard_specs = attr.label_list(allow_empty = True, allow_files = True),
resource_apks = attr.label_list(
allow_rules = ["apk_import"],
@@ -99,6 +112,8 @@ ATTRS = _attrs.replace(
),
dexopts = attr.string_list(),
main_dex_list = attr.label(allow_single_file = True),
+ main_dex_list_opts = attr.string_list(),
+ main_dex_proguard_specs = attr.label_list(allow_empty = True, allow_files = True),
min_sdk_version = attr.int(),
incremental_dexing = _attrs.tristate.create(
default = _attrs.tristate.auto,
@@ -106,6 +121,10 @@ ATTRS = _attrs.replace(
proguard_generate_mapping = attr.bool(default = False),
proguard_optimization_passes = attr.int(),
proguard_apply_mapping = attr.label(allow_single_file = True),
+ multidex = attr.string(
+ default = "native",
+ values = ["native", "legacy", "manual_main_dex"],
+ ),
_java_toolchain = attr.label(
default = Label("//tools/jdk:toolchain_android_only"),
),
@@ -136,6 +155,14 @@ ATTRS = _attrs.replace(
cfg = "exec",
executable = True,
),
+ _legacy_main_dex_list_generator = attr.label(
+ default = configuration_field(
+ fragment = "android",
+ name = "legacy_main_dex_list_generator",
+ ),
+ cfg = "exec",
+ executable = True,
+ ),
),
_attrs.COMPILATION,
_attrs.DATA_CONTEXT,
diff --git a/rules/android_binary_internal/impl.bzl b/rules/android_binary_internal/impl.bzl
index 23de739..a1e42df 100644
--- a/rules/android_binary_internal/impl.bzl
+++ b/rules/android_binary_internal/impl.bzl
@@ -14,18 +14,25 @@
"""Implementation."""
-load(":r8.bzl", "process_r8", "process_resource_shrinking_r8")
load("//rules:acls.bzl", "acls")
load("//rules:baseline_profiles.bzl", _baseline_profiles = "baseline_profiles")
load("//rules:common.bzl", "common")
load("//rules:data_binding.bzl", "data_binding")
+load("//rules:desugar.bzl", _desugar = "desugar")
+load("//rules:dex.bzl", _dex = "dex")
+load("//rules:dex_desugar_aspect.bzl", _get_dex_desugar_aspect_deps = "get_aspect_deps")
load("//rules:java.bzl", "java")
-load("//rules:proguard.bzl", "proguard", proguard_testing = "testing")
+load(
+ "//rules:native_deps.bzl",
+ _process_native_deps = "process",
+)
load(
"//rules:processing_pipeline.bzl",
"ProviderInfo",
"processing_pipeline",
)
+load("//rules:proguard.bzl", "proguard", proguard_testing = "testing")
+load("//rules:providers.bzl", "StarlarkAndroidDexInfo", "StarlarkApkInfo")
load("//rules:resources.bzl", _resources = "resources")
load(
"//rules:utils.bzl",
@@ -35,19 +42,17 @@ load(
"get_android_toolchain",
"utils",
)
-load(
- "//rules:native_deps.bzl",
- _process_native_deps = "process",
-)
-load("//rules:providers.bzl", "StarlarkAndroidDexInfo", "StarlarkApkInfo")
-load("//rules:dex.bzl", _dex = "dex")
-load("//rules:desugar.bzl", _desugar = "desugar")
-load("//rules:dex_desugar_aspect.bzl", _get_dex_desugar_aspect_deps = "get_aspect_deps")
+load(":r8.bzl", "process_r8", "process_resource_shrinking_r8")
+
+def _base_validations_processor(ctx, **_unused_ctxs):
+ if ctx.attr.min_sdk_version != 0 and not acls.in_android_binary_min_sdk_version_attribute_allowlist(str(ctx.label)):
+ fail("Target %s is not allowed to set a min_sdk_version value." % str(ctx.label))
def _process_manifest(ctx, **unused_ctxs):
manifest_ctx = _resources.bump_min_sdk(
ctx,
manifest = ctx.file.manifest,
+ manifest_values = ctx.attr.manifest_values,
floor = _resources.DEPOT_MIN_SDK_FLOOR if (_is_test_binary(ctx) and acls.in_enforce_min_sdk_floor_rollout(str(ctx.label))) else 0,
enforce_min_sdk_floor_tool = get_android_toolchain(ctx).enforce_min_sdk_floor_tool.files_to_run,
)
@@ -68,7 +73,7 @@ def _process_resources(ctx, manifest_ctx, java_package, **unused_ctxs):
assets_dir = ctx.attr.assets_dir,
resource_files = ctx.files.resource_files,
manifest = manifest_ctx.processed_manifest,
- manifest_values = utils.expand_make_vars(ctx, ctx.attr.manifest_values),
+ manifest_values = manifest_ctx.processed_manifest_values,
resource_configs = ctx.attr.resource_configuration_filters,
densities = ctx.attr.densities,
nocompress_extensions = ctx.attr.nocompress_extensions,
@@ -215,26 +220,85 @@ def _process_build_info(_unused_ctx, **unused_ctxs):
),
)
-def _process_dex(ctx, stamp_ctx, packaged_resources_ctx, jvm_ctx, proto_ctx, deploy_ctx, **_unused_ctxs):
+def _process_dex(ctx, stamp_ctx, packaged_resources_ctx, jvm_ctx, proto_ctx, deploy_ctx, bp_ctx, optimize_ctx, **_unused_ctxs):
providers = []
classes_dex_zip = None
dex_info = None
final_classes_dex_zip = None
+ final_proguard_output_map = None
+ postprocessing_output_map = None
deploy_jar = deploy_ctx.deploy_jar
is_binary_optimized = len(ctx.attr.proguard_specs) > 0
+ main_dex_list = ctx.file.main_dex_list
+ multidex = ctx.attr.multidex
+ optimizing_dexer = ctx.attr._optimizing_dexer
+ java8_legacy_dex_map = None
if acls.in_android_binary_starlark_dex_desugar_proguard(str(ctx.label)):
+ proguarded_jar = optimize_ctx.proguard_output.output_jar if is_binary_optimized else None
+ proguard_output_map = optimize_ctx.proguard_output.mapping if is_binary_optimized else None
+ binary_jar = proguarded_jar if proguarded_jar else deploy_jar
java_info = java_common.merge([jvm_ctx.java_info, stamp_ctx.java_info]) if stamp_ctx.java_info else jvm_ctx.java_info
runtime_jars = java_info.runtime_output_jars + [packaged_resources_ctx.class_jar]
if proto_ctx.class_jar:
runtime_jars.append(proto_ctx.class_jar)
forbidden_dexopts = ctx.fragments.android.get_target_dexopts_that_prevent_incremental_dexing
- java8_legacy_dex, java8_legacy_dex_map = _dex.get_java8_legacy_dex_and_map(
- ctx,
- android_jar = get_android_sdk(ctx).android_jar,
- binary_jar = deploy_jar,
- build_customized_files = is_binary_optimized,
- )
+
+ if (main_dex_list and multidex != "manual_main_dex") or \
+ (not main_dex_list and multidex == "manual_main_dex"):
+ fail("Both \"main_dex_list\" and \"multidex='manual_main_dex'\" must be specified.")
+
+ # Multidex mode: generate classes.dex.zip, where the zip contains
+ # [classes.dex, classes2.dex, ... classesN.dex]
+ if ctx.attr.multidex == "legacy":
+ main_dex_list = _dex.generate_main_dex_list(
+ ctx,
+ jar = binary_jar,
+ android_jar = get_android_sdk(ctx).android_jar,
+ desugar_java8_libs = ctx.fragments.android.desugar_java8_libs,
+ legacy_apis = ctx.files._desugared_java8_legacy_apis,
+ main_dex_classes = get_android_sdk(ctx).main_dex_classes,
+ main_dex_list_opts = ctx.attr.main_dex_list_opts,
+ main_dex_proguard_spec = packaged_resources_ctx.main_dex_proguard_config,
+ proguard_specs = list(ctx.attr.main_dex_proguard_specs),
+ shrinked_android_jar = get_android_sdk(ctx).shrinked_android_jar,
+ main_dex_list_creator = get_android_sdk(ctx).main_dex_list_creator,
+ legacy_main_dex_list_generator =
+ ctx.attr._legacy_main_dex_list_generator.files_to_run if ctx.attr._legacy_main_dex_list_generator else get_android_sdk(ctx).legacy_main_dex_list_generator,
+ proguard_tool = get_android_sdk(ctx).proguard,
+ )
+ elif ctx.attr.multidex == "manual_main_dex":
+ main_dex_list = _dex.transform_dex_list_through_proguard_map(
+ ctx,
+ proguard_output_map = proguard_output_map,
+ main_dex_list = main_dex_list,
+ dex_list_obfuscator = get_android_toolchain(ctx).dex_list_obfuscator.files_to_run,
+ )
+
+ # TODO(b/261110876): potentially add codepaths below to support rex (postprocessingRewritesMap)
+ if proguard_output_map:
+ # Proguard map from preprocessing will be merged with Proguard map for desugared
+ # library.
+ if optimizing_dexer and ctx.fragments.android.desugar_java8_libs:
+ postprocessing_output_map = _dex.get_dx_artifact(ctx, "_proguard_output_for_desugared_library.map")
+ final_proguard_output_map = _dex.get_dx_artifact(ctx, "_proguard.map")
+
+ elif optimizing_dexer:
+ # No desugared library, Proguard map from postprocessing is the final Proguard map.
+ postprocessing_output_map = _dex.get_dx_artifact(ctx, "_proguard.map")
+ final_proguard_output_map = postprocessing_output_map
+
+ elif ctx.fragments.android.desugar_java8_libs:
+ # No postprocessing, Proguard map from merging with the desugared library map is the
+ # final Proguard map.
+ postprocessing_output_map = proguard_output_map
+ final_proguard_output_map = _dex.get_dx_artifact(ctx, "_proguard.map")
+
+ else:
+ # No postprocessing, no desugared library, the final Proguard map is the Proguard map
+ # from shrinking
+ postprocessing_output_map = proguard_output_map
+ final_proguard_output_map = proguard_output_map
incremental_dexing = _dex.get_effective_incremental_dexing(
force_incremental_dexing = ctx.attr.incremental_dexing,
@@ -245,24 +309,73 @@ def _process_dex(ctx, stamp_ctx, packaged_resources_ctx, jvm_ctx, proto_ctx, dep
use_incremental_dexing = ctx.fragments.android.use_incremental_dexing,
)
- # TODO(b/263473668): Implement dexing after optimization
- if incremental_dexing:
- classes_dex_zip = _dex.process_incremental_dexing(
+ classes_dex_zip = _dex.get_dx_artifact(ctx, "classes.dex.zip")
+ if optimizing_dexer and is_binary_optimized:
+ _dex.process_optimized_dexing(
ctx,
+ output = classes_dex_zip,
+ input = proguarded_jar,
+ proguard_output_map = proguard_output_map,
+ postprocessing_output_map = postprocessing_output_map,
+ dexopts = ctx.attr.dexopts,
+ native_multidex = multidex == "native",
+ min_sdk_version = ctx.attr.min_sdk_version,
+ main_dex_list = main_dex_list,
+ library_jar = optimize_ctx.proguard_output.library_jar,
+ startup_profile = bp_ctx.baseline_profile_output.startup_profile if bp_ctx.baseline_profile_output else None,
+ optimizing_dexer = optimizing_dexer.files_to_run,
+ toolchain_type = ANDROID_TOOLCHAIN_TYPE,
+ )
+ elif incremental_dexing:
+ _dex.process_incremental_dexing(
+ ctx,
+ output = classes_dex_zip,
deps = _get_dex_desugar_aspect_deps(ctx),
dexopts = ctx.attr.dexopts,
runtime_jars = runtime_jars,
- main_dex_list = ctx.file.main_dex_list,
+ main_dex_list = main_dex_list,
min_sdk_version = ctx.attr.min_sdk_version,
+ proguarded_jar = proguarded_jar,
java_info = java_info,
desugar_dict = deploy_ctx.desugar_dict,
+ shuffle_jars = get_android_toolchain(ctx).shuffle_jars.files_to_run,
dexbuilder = get_android_toolchain(ctx).dexbuilder.files_to_run,
+ dexbuilder_after_proguard = get_android_toolchain(ctx).dexbuilder_after_proguard.files_to_run,
dexmerger = get_android_toolchain(ctx).dexmerger.files_to_run,
+ dexsharder = get_android_toolchain(ctx).dexsharder.files_to_run,
+ toolchain_type = ANDROID_TOOLCHAIN_TYPE,
+ )
+ else:
+ _dex.process_monolithic_dexing(
+ ctx,
+ output = classes_dex_zip,
+ input = proguarded_jar,
+ dexopts = ctx.attr.dexopts,
+ min_sdk_version = ctx.attr.min_sdk_version,
+ main_dex_list = main_dex_list,
+ dexbuilder = get_android_sdk(ctx).dx,
toolchain_type = ANDROID_TOOLCHAIN_TYPE,
)
if ctx.fragments.android.desugar_java8_libs and classes_dex_zip.extension == "zip":
final_classes_dex_zip = _dex.get_dx_artifact(ctx, "final_classes_dex.zip")
+
+ java8_legacy_dex, java8_legacy_dex_map = _dex.get_java8_legacy_dex_and_map(
+ ctx,
+ android_jar = get_android_sdk(ctx).android_jar,
+ binary_jar = binary_jar,
+ build_customized_files = is_binary_optimized,
+ )
+
+ if final_proguard_output_map:
+ proguard.merge_proguard_maps(
+ ctx,
+ output = final_proguard_output_map,
+ inputs = [java8_legacy_dex_map, postprocessing_output_map],
+ proguard_maps_merger = get_android_toolchain(ctx).proguard_maps_merger.files_to_run,
+ toolchain_type = ANDROID_TOOLCHAIN_TYPE,
+ )
+
_dex.append_java8_legacy_dex(
ctx,
output = final_classes_dex_zip,
@@ -272,10 +385,12 @@ def _process_dex(ctx, stamp_ctx, packaged_resources_ctx, jvm_ctx, proto_ctx, dep
)
else:
final_classes_dex_zip = classes_dex_zip
+ final_proguard_output_map = postprocessing_output_map if postprocessing_output_map else proguard_output_map
dex_info = AndroidDexInfo(
deploy_jar = deploy_jar,
final_classes_dex_zip = final_classes_dex_zip,
+ final_proguard_output_map = final_proguard_output_map,
java_resource_jar = deploy_jar,
)
providers.append(dex_info)
@@ -284,6 +399,7 @@ def _process_dex(ctx, stamp_ctx, packaged_resources_ctx, jvm_ctx, proto_ctx, dep
name = "dex_ctx",
value = struct(
dex_info = dex_info,
+ java8_legacy_dex_map = java8_legacy_dex_map,
providers = providers,
),
)
@@ -295,7 +411,7 @@ def _process_deploy_jar(ctx, stamp_ctx, packaged_resources_ctx, jvm_ctx, build_i
java_toolchain = common.get_java_toolchain(ctx)
java_info = java_common.merge([jvm_ctx.java_info, stamp_ctx.java_info]) if stamp_ctx.java_info else jvm_ctx.java_info
info = _dex.merge_infos(utils.collect_providers(StarlarkAndroidDexInfo, _get_dex_desugar_aspect_deps(ctx)))
- incremental_dexopts = _dex.incremental_dexopts(ctx.attr.dexopts, ctx.fragments.android.get_dexopts_supported_in_incremental_dexing)
+ incremental_dexopts = _dex.filter_dexopts(ctx.attr.dexopts, ctx.fragments.android.get_dexopts_supported_in_incremental_dexing)
dex_archives = info.dex_archives_dict.get("".join(incremental_dexopts), depset()).to_list()
binary_runtime_jars = java_info.runtime_output_jars + [packaged_resources_ctx.class_jar]
if proto_ctx.class_jar:
@@ -306,7 +422,7 @@ def _process_deploy_jar(ctx, stamp_ctx, packaged_resources_ctx, jvm_ctx, build_i
desugar_dict = {d.jar: d.desugared_jar for d in dex_archives}
for jar in binary_runtime_jars:
- desugared_jar = ctx.actions.declare_file(ctx.label.name + "/" + jar.basename + "_desugared.jar")
+ desugared_jar = ctx.actions.declare_file(ctx.label.name + "/" + jar.basename + "_migrated_desugared.jar")
_desugar.desugar(
ctx,
input = jar,
@@ -443,11 +559,20 @@ def _is_instrumentation(ctx):
"""
return bool(ctx.attr.instruments)
-def _process_baseline_profiles(ctx, dex_ctx, **_unused_ctxs):
- providers = []
+def _process_baseline_profiles(ctx, deploy_ctx, **_unused_ctxs):
+ baseline_profile_output = None
if (ctx.attr.generate_art_profile and
acls.in_android_binary_starlark_dex_desugar_proguard(str(ctx.label))):
+ enable_optimizer_integration = acls.in_baseline_profiles_optimizer_integration(str(ctx.label))
+ has_proguard_specs = bool(ctx.files.proguard_specs)
+
+ if ctx.files.startup_profiles and not enable_optimizer_integration:
+ fail("Target %s is not allowed to set startup_profiles." % str(ctx.label))
+
+ # Include startup profiles if the optimizer is disabled since profiles won't be merged
+ # in the optimizer.
transitive_profiles = depset(
+ ctx.files.startup_profiles if enable_optimizer_integration and not has_proguard_specs else [],
transitive = [
profile_provider.files
for profile_provider in utils.collect_providers(
@@ -456,20 +581,57 @@ def _process_baseline_profiles(ctx, dex_ctx, **_unused_ctxs):
)
],
)
- if transitive_profiles:
- providers.append(
- _baseline_profiles.process(
- ctx,
- dex_ctx.dex_info.final_classes_dex_zip,
- transitive_profiles,
- ),
- )
+ baseline_profile_output = _baseline_profiles.process(
+ ctx,
+ transitive_profiles = transitive_profiles,
+ startup_profiles = ctx.files.startup_profiles,
+ deploy_jar = deploy_ctx.deploy_jar,
+ has_proguard_specs = has_proguard_specs,
+ enable_optimizer_integration = enable_optimizer_integration,
+ merge_tool = get_android_toolchain(ctx).merge_baseline_profiles_tool.files_to_run,
+ profgen = get_android_toolchain(ctx).profgen.files_to_run,
+ toolchain_type = ANDROID_TOOLCHAIN_TYPE,
+ )
return ProviderInfo(
name = "bp_ctx",
+ value = struct(
+ baseline_profile_output = baseline_profile_output,
+ ),
+ )
+
+def _process_art_profile(ctx, bp_ctx, dex_ctx, optimize_ctx, **_unused_ctxs):
+ providers = []
+ if (ctx.attr.generate_art_profile and
+ acls.in_android_binary_starlark_dex_desugar_proguard(str(ctx.label))):
+ merged_baseline_profile = bp_ctx.baseline_profile_output.baseline_profile
+ merged_baseline_profile_rewritten = \
+ optimize_ctx.proguard_output.baseline_profile_rewritten if optimize_ctx.proguard_output else None
+ proguard_output_map = dex_ctx.dex_info.final_proguard_output_map
+
+ if acls.in_baseline_profiles_optimizer_integration(str(ctx.label)):
+ # Minified symbols are emitted when rewriting, so only use map for symbols which
+ # weren't passed to bytecode optimizer (if it exists).
+ proguard_output_map = dex_ctx.java8_legacy_dex_map
+
+ # At this point, either baseline profile here also contains startup-profiles, if any.
+ if merged_baseline_profile_rewritten:
+ merged_baseline_profile = merged_baseline_profile_rewritten
+ if merged_baseline_profile:
+ providers.append(_baseline_profiles.process_art_profile(
+ ctx,
+ final_classes_dex = dex_ctx.dex_info.final_classes_dex_zip,
+ merged_profile = merged_baseline_profile,
+ proguard_output_map = proguard_output_map,
+ profgen = get_android_toolchain(ctx).profgen.files_to_run,
+ zipper = get_android_toolchain(ctx).zipper.files_to_run,
+ toolchain_type = ANDROID_TOOLCHAIN_TYPE,
+ ))
+ return ProviderInfo(
+ name = "ap_ctx",
value = struct(providers = providers),
)
-def _process_optimize(ctx, deploy_ctx, packaged_resources_ctx, **_unused_ctxs):
+def _process_optimize(ctx, deploy_ctx, packaged_resources_ctx, bp_ctx, **_unused_ctxs):
if not acls.in_android_binary_starlark_dex_desugar_proguard(str(ctx.label)):
return ProviderInfo(
name = "optimize_ctx",
@@ -490,13 +652,13 @@ def _process_optimize(ctx, deploy_ctx, packaged_resources_ctx, **_unused_ctxs):
has_proguard_specs = bool(proguard_specs)
proguard_output = struct()
+ is_resource_shrinking_enabled = _resources.is_resource_shrinking_enabled(
+ ctx.attr.shrink_resources,
+ ctx.fragments.android.use_android_resource_shrinking,
+ )
proguard_output_map = None
generate_proguard_map = (
- ctx.attr.proguard_generate_mapping or
- _resources.is_resource_shrinking_enabled(
- ctx.attr.shrink_resources,
- ctx.fragments.android.use_android_resource_shrinking,
- )
+ ctx.attr.proguard_generate_mapping or is_resource_shrinking_enabled
)
desugar_java8_libs_generates_map = ctx.fragments.android.desugar_java8
optimizing_dexing = bool(ctx.attr._optimizing_dexer)
@@ -522,6 +684,9 @@ def _process_optimize(ctx, deploy_ctx, packaged_resources_ctx, **_unused_ctxs):
proguard_seeds = ctx.actions.declare_file(ctx.label.name + "_migrated_proguard.seeds")
proguard_usage = ctx.actions.declare_file(ctx.label.name + "_migrated_proguard.usage")
+ startup_profile = bp_ctx.baseline_profile_output.startup_profile if bp_ctx.baseline_profile_output else None
+ baseline_profile = bp_ctx.baseline_profile_output.baseline_profile if bp_ctx.baseline_profile_output else None
+
proguard_output = proguard.apply_proguard(
ctx,
input_jar = deploy_ctx.deploy_jar,
@@ -532,6 +697,8 @@ def _process_optimize(ctx, deploy_ctx, packaged_resources_ctx, **_unused_ctxs):
proguard_output_map = proguard_output_map,
proguard_seeds = proguard_seeds,
proguard_usage = proguard_usage,
+ startup_profile = startup_profile,
+ baseline_profile = baseline_profile,
proguard_tool = get_android_sdk(ctx).proguard,
)
@@ -545,8 +712,37 @@ def _process_optimize(ctx, deploy_ctx, packaged_resources_ctx, **_unused_ctxs):
usage = proguard_output.usage,
library_jar = proguard_output.library_jar,
config = proguard_output.config,
+ baseline_profile_rewritten = proguard_output.baseline_profile_rewritten,
+ startup_profile_rewritten = proguard_output.startup_profile_rewritten,
))
+ use_resource_shrinking = is_resource_shrinking_enabled and has_proguard_specs
+ shrunk_resource_output = None
+ if use_resource_shrinking:
+ shrunk_resource_output = _resources.shrink(
+ ctx,
+ resources_zip = packaged_resources_ctx.validation_result,
+ aapt = get_android_toolchain(ctx).aapt2.files_to_run,
+ android_jar = get_android_sdk(ctx).android_jar,
+ r_txt = packaged_resources_ctx.r_txt,
+ shrunk_jar = proguard_output_jar,
+ proguard_mapping = proguard_output_map,
+ busybox = get_android_toolchain(ctx).android_resources_busybox.files_to_run,
+ host_javabase = common.get_host_javabase(ctx),
+ )
+ providers.append(shrunk_resource_output)
+
+ optimized_resource_output = _resources.optimize(
+ ctx,
+ resources_apk = shrunk_resource_output.resources_apk if use_resource_shrinking else packaged_resources_ctx.resources_apk,
+ resource_optimization_config = shrunk_resource_output.optimization_config if use_resource_shrinking else None,
+ is_resource_shrunk = use_resource_shrinking,
+ aapt = get_android_toolchain(ctx).aapt2.files_to_run,
+ busybox = get_android_toolchain(ctx).android_resources_busybox.files_to_run,
+ host_javabase = common.get_host_javabase(ctx),
+ )
+ providers.append(optimized_resource_output)
+
return ProviderInfo(
name = "optimize_ctx",
value = struct(
@@ -560,6 +756,7 @@ def _process_optimize(ctx, deploy_ctx, packaged_resources_ctx, **_unused_ctxs):
# insertion.
# buildifier: leave-alone
PROCESSORS = dict(
+ BaseValidationsProcessor = _base_validations_processor,
ManifestProcessor = _process_manifest,
StampProcessor = _process_build_stamp,
ResourceProcessor = _process_resources,
@@ -570,9 +767,10 @@ PROCESSORS = dict(
BuildInfoProcessor = _process_build_info,
ProtoProcessor = _process_proto,
DeployJarProcessor = _process_deploy_jar,
+ BaselineProfilesProcessor = _process_baseline_profiles,
OptimizeProcessor = _process_optimize,
DexProcessor = _process_dex,
- BaselineProfilesProcessor = _process_baseline_profiles,
+ ArtProfileProcessor = _process_art_profile,
R8Processor = process_r8,
ResourecShrinkerR8Processor = process_resource_shrinking_r8,
)
diff --git a/rules/android_binary_internal/r8.bzl b/rules/android_binary_internal/r8.bzl
index a4be61d..90c91c3 100644
--- a/rules/android_binary_internal/r8.bzl
+++ b/rules/android_binary_internal/r8.bzl
@@ -73,9 +73,12 @@ def process_r8(ctx, jvm_ctx, packaged_resources_ctx, build_info_ctx, **_unused_c
android_jar = get_android_sdk(ctx).android_jar
proguard_specs = proguard.get_proguard_specs(ctx, packaged_resources_ctx.resource_proguard_config)
+ min_sdk_version = getattr(ctx.attr, "min_sdk_version", None)
args = ctx.actions.args()
args.add("--release")
+ if min_sdk_version:
+ args.add("--min-api", min_sdk_version)
args.add("--output", dexes_zip)
args.add_all(proguard_specs, before_each = "--pg-conf")
args.add("--lib", android_jar)
diff --git a/rules/android_local_test/BUILD b/rules/android_local_test/BUILD
new file mode 100644
index 0000000..52f4637
--- /dev/null
+++ b/rules/android_local_test/BUILD
@@ -0,0 +1,28 @@
+# The android_library rule.
+
+load("@bazel_skylib//:bzl_library.bzl", "bzl_library")
+
+package(
+ default_applicable_licenses = ["//:license"],
+ default_visibility =
+ ["//:__subpackages__"],
+)
+
+licenses(["notice"])
+
+exports_files(["rule.bzl"])
+
+filegroup(
+ name = "all_files",
+ srcs = glob(["**"]),
+)
+
+bzl_library(
+ name = "bzl",
+ srcs = glob(["*.bzl"]),
+ deps = [
+ "//rules:common_bzl",
+ "//rules/flags:bzl",
+ "@bazel_skylib//rules:common_settings",
+ ],
+)
diff --git a/rules/android_local_test/attrs.bzl b/rules/android_local_test/attrs.bzl
new file mode 100644
index 0000000..4d3bec8
--- /dev/null
+++ b/rules/android_local_test/attrs.bzl
@@ -0,0 +1,220 @@
+# Copyright 2020 The Bazel Authors. All rights reserved.
+#
+# 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.
+
+"""Attributes."""
+
+load(
+ "//rules:attrs.bzl",
+ _attrs = "attrs",
+)
+
+def make_attrs(additional_aspects = [], native_libs_transition = None):
+ return _attrs.add(
+ dict(
+ deps = attr.label_list(
+ allow_files = True,
+ allow_rules = [
+ "aar_import",
+ "android_library",
+ "java_import",
+ "java_library",
+ "java_lite_proto_library",
+ ],
+ aspects = additional_aspects,
+ providers = [[CcInfo], [JavaInfo]],
+ doc = """
+ The list of libraries to be tested as well as additional libraries to be linked
+ in to the target.
+ All resources, assets and manifest files declared in Android rules in the transitive
+ closure of this attribute are made available in the test.
+
+ The list of allowed rules in `deps` are `aar_import`,
+ `android_library`, `java_import`, `java_library`,
+ and `java_lite_proto_library`.
+ """,
+ cfg = native_libs_transition,
+ ),
+ feature_flags = attr.label_keyed_string_dict(
+ doc = "This is a deprecated feature. Do not use it.",
+ ),
+ jvm_flags = attr.string_list(
+ doc = """
+ A list of flags to embed in the wrapper script generated for running this binary.
+ Subject to [$(location / execpath / rootpath)](https://docs.bazel.build/versions/main/be/make-variables.html#predefined_label_variables) and
+ ["Make variable"](https://docs.bazel.build/versions/main/be/make-variables.html) substitution, and
+ [Bourne shell tokenization](https://docs.bazel.build/versions/main/be/common-definitions.html#sh-tokenization).
+
+ The wrapper script for a Java binary includes a CLASSPATH definition
+ (to find all the dependent jars) and invokes the right Java interpreter.
+ The command line generated by the wrapper script includes the name of
+ the main class followed by a `"$@"` so you can pass along other
+ arguments after the classname. However, arguments intended for parsing
+ by the JVM must be specified _before_ the classname on the command
+ line. The contents of `jvm_flags` are added to the wrapper
+ script before the classname is listed.
+
+ Note that this attribute has _no effect_ on `*_deploy.jar`
+ outputs.
+ """,
+ ),
+ manifest_values = attr.string_dict(
+ doc = """
+ A dictionary of values to be overridden in the manifest. Any instance of ${name} in the
+ manifest will be replaced with the value corresponding to name in this dictionary.
+ `applicationId`, `versionCode`, `versionName`,
+ `minSdkVersion`, `targetSdkVersion` and
+ `maxSdkVersion` will also override the corresponding attributes
+ of the manifest and
+ uses-sdk tags. `packageName` will be ignored and will be set from either
+ `applicationId` if
+ specified or the package in the manifest.
+ It is not necessary to have a manifest on the rule in order to use manifest_values.
+ """,
+ ),
+ nocompress_extensions = attr.string_list(
+ doc = "A list of file extensions to leave uncompressed in the resource apk.",
+ ),
+ resources = attr.label_list(
+ allow_files = True,
+ doc = """
+ A list of data files to include in a Java jar.
+
+ If resources are specified, they will be bundled in the jar along with the usual
+ `.class` files produced by compilation. The location of the resources inside
+ of the jar file is determined by the project structure. Bazel first looks for Maven's
+ [standard directory layout](https://maven.apache.org/guides/introduction/introduction-to-the-standard-directory-layout.html),
+ (a "src" directory followed by a "resources" directory grandchild). If that is not
+ found, Bazel then looks for the topmost directory named "java" or "javatests" (so, for
+ example, if a resource is at `&lt;workspace root&gt;/x/java/y/java/z`, the
+ path of the resource will be `y/java/z`. This heuristic cannot be overridden.
+
+ Resources may be source files or generated files.
+
+ """,
+ ),
+ runtime_deps = attr.label_list(
+ allow_files = True,
+ doc = """
+ Libraries to make available to the final binary or test at runtime only.
+ Like ordinary `deps`, these will appear on the runtime classpath, but unlike
+ them, not on the compile-time classpath. Dependencies needed only at runtime should be
+ listed here. Dependency-analysis tools should ignore targets that appear in both
+ `runtime_deps` and `deps`.
+ """,
+ # TODO(timpeut): verify we can require JavaInfo
+ # providers = [JavaInfo],
+ cfg = native_libs_transition,
+ ),
+ srcs = attr.label_list(
+ # TODO(timpeut): order independent
+ # TODO(timpeut): direct compile time input
+ allow_files = [".java", ".srcjar", ".properties", ".xmb"],
+ doc = """
+ The list of source files that are processed to create the target.
+ Required except in special case described below.
+
+ `srcs` files of type `.java` are compiled.
+ _For readability's sake_, it is not good to put the name of a
+ generated `.java` source file into the `srcs`.
+ Instead, put the depended-on rule name in the `srcs`, as
+ described below.
+
+ `srcs` files of type `.srcjar` are unpacked and
+ compiled. (This is useful if you need to generate a set of .java files with
+ a genrule or build extension.)
+
+ All other files are ignored, as long as
+ there is at least one file of a file type described above. Otherwise an
+ error is raised.
+
+ The `srcs` attribute is required and cannot be empty, unless
+ `runtime_deps` is specified.
+ """,
+ ),
+ stamp = _attrs.tristate.create(
+ default = _attrs.tristate.no,
+ doc = """
+ Whether to encode build information into the binary. Possible values:
+
+ - `stamp = 1`: Always stamp the build information into the binary, even in
+ [`--nostamp`](https://docs.bazel.build/versions/main/user-manual.html#flag--stamp) builds. **This
+ setting should be avoided**, since it potentially kills remote caching for the
+ binary and any downstream actions that depend on it.
+
+ - `stamp = 0`: Always replace build information by constant values. This
+ gives good build result caching.
+
+ - `stamp = -1`: Embedding of build information is controlled by the
+ [`--[no]stamp`](https://docs.bazel.build/versions/main/user-manual.html#flag--stamp) flag.
+
+ Stamped binaries are _not_ rebuilt unless their dependencies change.
+ """,
+ ),
+ resource_configuration_filters = attr.string_list(
+ doc = "A list of resource configuration filters, such as 'en' " +
+ "that will limit the resources in the apk to only the " +
+ "ones in the 'en' configuration.",
+ ),
+ densities = attr.string_list(
+ doc = "Densities to filter for when building the apk. A " +
+ "corresponding compatible-screens section will also be " +
+ "added to the manifest if it does not already contain a " +
+ "superset listing.",
+ ),
+ robolectric_properties_file = attr.string(
+ doc = "The classpath to robolectric-deps.properties file.",
+ default = "${JAVA_RUNFILES}/robolectric/bazel/robolectric-deps.properties",
+ ),
+ test_class = attr.string(
+ doc = """
+ The Java class to be loaded by the test runner.
+
+ This attribute specifies the name of a Java class to be run by
+ this test. It is rare to need to set this. If this argument is omitted, the Java class
+ whose name corresponds to the `name` of this
+ `android_local_test` rule will be used.
+ The test class needs to be annotated with `org.junit.runner.RunWith`.
+ """,
+ ),
+ _runfiles_root_prefix = attr.label(
+ doc = """
+ A directory prefix that ends with a slash.
+
+ This attribute is appended to ${JAVA_RUNFILES} when the root of path to the runfile
+ resources is not directly under ${JAVA_RUNFILES}.
+ """,
+ default = "//rules/flags:runfiles_root_prefix",
+ ),
+ _flags = attr.label(
+ default = "//rules/flags",
+ ),
+ _java_toolchain = attr.label(
+ default = Label("//tools/jdk:current_java_toolchain"),
+ ),
+ _current_java_runtime = attr.label(
+ default = Label("//tools/jdk:current_java_runtime"),
+ providers = [java_common.JavaRuntimeInfo],
+ ),
+ _implicit_classpath = attr.label_list(
+ default = [
+ Label("//tools/android:android_jar"),
+ ],
+ ),
+ ),
+ _attrs.COMPILATION,
+ _attrs.DATA_CONTEXT,
+ _attrs.AUTOMATIC_EXEC_GROUPS_ENABLED,
+ )
+
+ATTRS = make_attrs()
diff --git a/rules/android_local_test/impl.bzl b/rules/android_local_test/impl.bzl
new file mode 100644
index 0000000..1606e18
--- /dev/null
+++ b/rules/android_local_test/impl.bzl
@@ -0,0 +1,566 @@
+# Copyright 2018 The Bazel Authors. All rights reserved.
+#
+# 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.
+
+"""Bazel rule for Android local test."""
+
+load("//rules:acls.bzl", "acls")
+load("//rules:attrs.bzl", "attrs")
+load("//rules:common.bzl", "common")
+load("//rules:java.bzl", "java")
+load(
+ "//rules:processing_pipeline.bzl",
+ "ProviderInfo",
+ "processing_pipeline",
+)
+load("//rules:providers.bzl", "AndroidFilteredJdepsInfo")
+load("//rules:resources.bzl", "resources")
+load(
+ "//rules:utils.bzl",
+ "ANDROID_TOOLCHAIN_TYPE",
+ "compilation_mode",
+ "get_android_sdk",
+ "get_android_toolchain",
+ "log",
+ "utils",
+)
+load("@bazel_skylib//rules:common_settings.bzl", "BuildSettingInfo")
+
+JACOCOCO_CLASS = "com.google.testing.coverage.JacocoCoverageRunner"
+TEST_RUNNER_CLASS = "com.google.testing.junit.runner.BazelTestRunner"
+
+# JVM processes for android_local_test targets are typically short lived. By
+# using TieredStopAtLevel=1, aggressive JIT compilations are avoided, which is
+# more optimal for android_local_test workloads.
+DEFAULT_JIT_FLAGS = ["-XX:+TieredCompilation", "-XX:TieredStopAtLevel=1"]
+
+# Many P99 and above android_local_test targets use a lot of memory so the default 1 GiB
+# JVM max heap size is not sufficient. Bump the max heap size to from 1 GiB -> 8 GiB. This performs
+# the best across all P% layers from profiling.
+DEFAULT_GC_FLAGS = ["-Xmx8g"]
+
+# disable class loading by default for faster classloading and consistent enviroment across
+# local and remote execution
+DEFAULT_VERIFY_FLAGS = ["-Xverify:none"]
+
+def _validations_processor(ctx, **_unused_sub_ctxs):
+ _check_src_pkg(ctx, True)
+
+def _process_manifest(ctx, java_package, **_unused_sub_ctxs):
+ manifest_ctx = None
+ manifest_values = resources.process_manifest_values(
+ ctx,
+ ctx.attr.manifest_values,
+ resources.DEPOT_MIN_SDK_FLOOR,
+ )
+ if ctx.file.manifest == None:
+ # No manifest provided, generate one
+ manifest = ctx.actions.declare_file("_generated/" + ctx.label.name + "/AndroidManifest.xml")
+ resources.generate_dummy_manifest(
+ ctx,
+ out_manifest = manifest,
+ java_package = java_package,
+ min_sdk_version = manifest_values.get("minSdkVersion", 16), # minsdk supported by robolectric framework
+ )
+ manifest_ctx = struct(processed_manifest = manifest, processed_manifest_values = manifest_values)
+ else:
+ manifest_ctx = resources.bump_min_sdk(
+ ctx,
+ manifest = ctx.file.manifest,
+ manifest_values = ctx.attr.manifest_values,
+ floor = resources.DEPOT_MIN_SDK_FLOOR if acls.in_enforce_min_sdk_floor_rollout(str(ctx.label)) else 0,
+ enforce_min_sdk_floor_tool = get_android_toolchain(ctx).enforce_min_sdk_floor_tool.files_to_run,
+ )
+
+ return ProviderInfo(
+ name = "manifest_ctx",
+ value = manifest_ctx,
+ )
+
+def _process_resources(ctx, java_package, manifest_ctx, **_unused_sub_ctxs):
+ resources_ctx = resources.package(
+ ctx,
+ deps = ctx.attr.deps,
+ manifest = manifest_ctx.processed_manifest,
+ manifest_values = manifest_ctx.processed_manifest_values,
+ resource_files = ctx.files.resource_files,
+ assets = ctx.files.assets,
+ assets_dir = ctx.attr.assets_dir,
+ resource_configs = ctx.attr.resource_configuration_filters,
+ densities = ctx.attr.densities,
+ nocompress_extensions = ctx.attr.nocompress_extensions,
+ compilation_mode = compilation_mode.get(ctx),
+ java_package = java_package,
+ shrink_resources = attrs.tristate.no,
+ aapt = get_android_toolchain(ctx).aapt2.files_to_run,
+ android_jar = get_android_sdk(ctx).android_jar,
+ busybox = get_android_toolchain(ctx).android_resources_busybox.files_to_run,
+ host_javabase = ctx.attr._host_javabase,
+ # TODO(b/140582167): Throwing on resource conflict need to be rolled
+ # out to android_local_test.
+ should_throw_on_conflict = False,
+ )
+
+ return ProviderInfo(
+ name = "resources_ctx",
+ value = resources_ctx,
+ )
+
+def _process_jvm(ctx, resources_ctx, **_unused_sub_ctxs):
+ deps = (
+ ctx.attr._implicit_classpath +
+ ctx.attr.deps +
+ [get_android_toolchain(ctx).testsupport]
+ )
+
+ if ctx.configuration.coverage_enabled:
+ deps.append(get_android_toolchain(ctx).jacocorunner)
+ java_start_class = JACOCOCO_CLASS
+ coverage_start_class = TEST_RUNNER_CLASS
+ else:
+ java_start_class = TEST_RUNNER_CLASS
+ coverage_start_class = None
+
+ java_info = java_common.add_constraints(
+ java.compile_android(
+ ctx,
+ ctx.outputs.jar,
+ ctx.actions.declare_file(ctx.label.name + "-src.jar"),
+ srcs = ctx.files.srcs,
+ resources = ctx.files.resources,
+ javac_opts = ctx.attr.javacopts,
+ r_java = resources_ctx.r_java,
+ deps = (
+ utils.collect_providers(JavaInfo, deps) +
+ [
+ JavaInfo(
+ output_jar = get_android_sdk(ctx).android_jar,
+ compile_jar = get_android_sdk(ctx).android_jar,
+ # The android_jar must not be compiled into the test, it
+ # will bloat the Jar with no benefit.
+ neverlink = True,
+ ),
+ ]
+ ),
+ plugins = utils.collect_providers(JavaPluginInfo, ctx.attr.plugins),
+ java_toolchain = common.get_java_toolchain(ctx),
+ ),
+ constraints = ["android"],
+ )
+
+ # TODO(timpeut): some conformance tests require a filtered JavaInfo
+ # with no transitive_ deps.
+ providers = [java_info]
+ runfiles = []
+
+ # Create a filtered jdeps with no resources jar. See b/129011477 for more context.
+ if java_info.outputs.jdeps != None:
+ filtered_jdeps = ctx.actions.declare_file(ctx.label.name + ".filtered.jdeps")
+ filter_jdeps(ctx, java_info.outputs.jdeps, filtered_jdeps, utils.only(resources_ctx.r_java.compile_jars.to_list()))
+ providers.append(AndroidFilteredJdepsInfo(jdeps = filtered_jdeps))
+ runfiles.append(filtered_jdeps)
+
+ return ProviderInfo(
+ name = "jvm_ctx",
+ value = struct(
+ java_info = java_info,
+ providers = providers,
+ deps = deps,
+ java_start_class = java_start_class,
+ coverage_start_class = coverage_start_class,
+ android_properties_file = ctx.attr.robolectric_properties_file,
+ additional_jvm_flags = [],
+ ),
+ runfiles = ctx.runfiles(files = runfiles),
+ )
+
+def _process_proto(_ctx, **_unused_sub_ctxs):
+ return ProviderInfo(
+ name = "proto_ctx",
+ value = struct(
+ proto_extension_registry_dep = depset(),
+ ),
+ )
+
+def _process_deploy_jar(ctx, java_package, jvm_ctx, proto_ctx, resources_ctx, **_unused_sub_ctxs):
+ res_file_path = resources_ctx.validation_result.short_path
+ subs = {
+ "%android_merged_manifest%": resources_ctx.processed_manifest.short_path,
+ "%android_merged_resources%": "jar:file:" + res_file_path + "!/res",
+ "%android_merged_assets%": "jar:file:" + res_file_path + "!/assets",
+ # The native resources_ctx has the package field, whereas the starlark resources_ctx uses the java_package
+ "%android_custom_package%": getattr(resources_ctx, "package", java_package or ""),
+ "%android_resource_apk%": resources_ctx.resources_apk.short_path,
+ }
+ res_runfiles = [
+ resources_ctx.resources_apk,
+ resources_ctx.validation_result,
+ resources_ctx.processed_manifest,
+ ]
+
+ properties_file = _genfiles_artifact(ctx, "test_config.properties")
+ properties_jar = _genfiles_artifact(ctx, "properties.jar")
+ ctx.actions.expand_template(
+ template = utils.only(get_android_toolchain(ctx).robolectric_template.files.to_list()),
+ output = properties_file,
+ substitutions = subs,
+ )
+ _zip_file(ctx, properties_file, "com/android/tools", properties_jar)
+ properties_jar_dep = depset([properties_jar])
+
+ runtime_deps = depset(transitive = [
+ x.transitive_runtime_jars
+ for x in utils.collect_providers(JavaInfo, ctx.attr.runtime_deps)
+ ])
+ android_jar_dep = depset([get_android_sdk(ctx).android_jar])
+ out_jar_dep = depset([ctx.outputs.jar])
+ classpath = depset(
+ transitive = [
+ proto_ctx.proto_extension_registry_dep,
+ out_jar_dep,
+ resources_ctx.r_java.compile_jars,
+ properties_jar_dep,
+ runtime_deps,
+ android_jar_dep,
+ jvm_ctx.java_info.transitive_runtime_jars,
+ ],
+ )
+
+ java.singlejar(
+ ctx,
+ # TODO(timpeut): investigate whether we need to filter the stub classpath as well
+ [f for f in classpath.to_list() if f.short_path.endswith(".jar")],
+ ctx.outputs.deploy_jar,
+ mnemonic = "JavaDeployJar",
+ include_build_data = True,
+ java_toolchain = common.get_java_toolchain(ctx),
+ )
+ return ProviderInfo(
+ name = "deploy_jar_ctx",
+ value = struct(
+ classpath = classpath,
+ ),
+ runfiles = ctx.runfiles(files = res_runfiles, transitive_files = classpath),
+ )
+
+def _preprocess_stub(ctx, **_unused_sub_ctxs):
+ javabase = ctx.attr._current_java_runtime[java_common.JavaRuntimeInfo]
+ java_executable = str(javabase.java_executable_runfiles_path)
+ java_executable_files = javabase.files
+
+ # Absolute java_executable does not require any munging
+ if java_executable.startswith("/"):
+ java_executable = "JAVABIN=" + java_executable
+
+ prefix = ctx.attr._runfiles_root_prefix[BuildSettingInfo].value
+ if not java_executable.startswith(prefix):
+ java_executable = prefix + java_executable
+
+ java_executable = "JAVABIN=${JAVABIN:-${JAVA_RUNFILES}/" + java_executable + "}"
+
+ substitutes = {
+ "%javabin%": java_executable,
+ "%load_lib%": "",
+ "%set_ASAN_OPTIONS%": "",
+ }
+ runfiles = [java_executable_files]
+
+ return ProviderInfo(
+ name = "stub_preprocess_ctx",
+ value = struct(
+ substitutes = substitutes,
+ runfiles = runfiles,
+ ),
+ )
+
+def _process_stub(ctx, deploy_jar_ctx, jvm_ctx, stub_preprocess_ctx, **_unused_sub_ctxs):
+ runfiles = []
+
+ merged_instr = None
+ if ctx.configuration.coverage_enabled:
+ merged_instr = ctx.actions.declare_file(ctx.label.name + "_merged_instr.jar")
+ java.singlejar(
+ ctx,
+ [f for f in deploy_jar_ctx.classpath.to_list() if f.short_path.endswith(".jar")],
+ merged_instr,
+ mnemonic = "JavaDeployJar",
+ include_build_data = True,
+ java_toolchain = common.get_java_toolchain(ctx),
+ )
+ runfiles.append(merged_instr)
+
+ stub = ctx.actions.declare_file(ctx.label.name)
+ classpath_file = ctx.actions.declare_file(ctx.label.name + "_classpath")
+ runfiles.append(classpath_file)
+ test_class = _get_test_class(ctx)
+ if not test_class:
+ # fatal error
+ log.error("test_class could not be derived for " + str(ctx.label) +
+ ". Explicitly set test_class or move this source file to " +
+ "a java source root.")
+
+ _create_stub(
+ ctx,
+ stub_preprocess_ctx.substitutes,
+ stub,
+ classpath_file,
+ deploy_jar_ctx.classpath,
+ _get_jvm_flags(ctx, test_class, jvm_ctx.android_properties_file, jvm_ctx.additional_jvm_flags),
+ jvm_ctx.java_start_class,
+ jvm_ctx.coverage_start_class,
+ merged_instr,
+ )
+ return ProviderInfo(
+ name = "stub_ctx",
+ value = struct(
+ stub = stub,
+ ),
+ runfiles = ctx.runfiles(
+ files = runfiles,
+ transitive_files = depset(
+ transitive = stub_preprocess_ctx.runfiles,
+ ),
+ ),
+ )
+
+PROCESSORS = dict(
+ ValidationsProcessor = _validations_processor,
+ ManifestProcessor = _process_manifest,
+ ResourceProcessor = _process_resources,
+ JvmProcessor = _process_jvm,
+ ProtoProcessor = _process_proto,
+ DeployJarProcessor = _process_deploy_jar,
+ StubPreProcessor = _preprocess_stub,
+ StubProcessor = _process_stub,
+)
+
+def finalize(
+ ctx,
+ jvm_ctx,
+ proto_ctx,
+ providers,
+ runfiles,
+ stub_ctx,
+ validation_outputs,
+ **_unused_sub_ctxs):
+ """Creates the final providers for the rule.
+
+ Args:
+ ctx: The context.
+ jvm_ctx: ProviderInfo. The jvm ctx.
+ proto_ctx: ProviderInfo. The proto ctx.
+ providers: sequence of providers. The providers to propagate.
+ runfiles: Runfiles. The runfiles collected during processing.
+ stub_ctx: ProviderInfo. The stub ctx.
+ validation_outputs: sequence of Files. The validation outputs.
+ **_unused_sub_ctxs: Unused ProviderInfo.
+
+ Returns:
+ A struct with Android and Java legacy providers and a list of providers.
+ """
+ runfiles = runfiles.merge(ctx.runfiles(collect_data = True))
+ runfiles = runfiles.merge(utils.get_runfiles(ctx, jvm_ctx.deps + ctx.attr.data + ctx.attr.runtime_deps))
+
+ providers.extend([
+ DefaultInfo(
+ files = depset(
+ [ctx.outputs.jar, stub_ctx.stub],
+ transitive = [proto_ctx.proto_extension_registry_dep],
+ order = "preorder",
+ ),
+ executable = stub_ctx.stub,
+ runfiles = runfiles,
+ ),
+ OutputGroupInfo(
+ _validation = depset(validation_outputs),
+ ),
+ coverage_common.instrumented_files_info(
+ ctx = ctx,
+ source_attributes = ["srcs"],
+ dependency_attributes = ["deps", "runtime_deps", "data"],
+ ),
+ ])
+ return providers
+
+_PROCESSING_PIPELINE = processing_pipeline.make_processing_pipeline(
+ processors = PROCESSORS,
+ finalize = finalize,
+)
+
+def impl(ctx):
+ java_package = java.resolve_package_from_label(ctx.label, ctx.attr.custom_package)
+ return processing_pipeline.run(ctx, java_package, _PROCESSING_PIPELINE)
+
+def _check_src_pkg(ctx, warn = True):
+ pkg = ctx.label.package
+ for attr in ctx.attr.srcs:
+ if attr.label.package != pkg:
+ msg = "Do not import %s directly. Either move the file to this package or depend on an appropriate rule there." % attr.label
+ if warn:
+ log.warn(msg)
+ else:
+ log.error(msg)
+
+def _genfiles_artifact(ctx, name):
+ return ctx.actions.declare_file(
+ "/".join([ctx.genfiles_dir.path, ctx.label.name, name]),
+ )
+
+def _get_test_class(ctx):
+ # Use the specified test_class if set
+ if ctx.attr.test_class != "":
+ return ctx.attr.test_class
+
+ # Use a heuristic based on the rule name and the "srcs" list
+ # to determine the primary Java class.
+ expected = "/" + ctx.label.name + ".java"
+ for f in ctx.attr.srcs:
+ path = f.label.package + "/" + f.label.name
+ if path.endswith(expected):
+ return java.resolve_package(path[:-5])
+
+ # Last resort: Use the name and package name of the target.
+ return java.resolve_package(ctx.label.package + "/" + ctx.label.name)
+
+def _create_stub(
+ ctx,
+ substitutes,
+ stub_file,
+ classpath_file,
+ runfiles,
+ jvm_flags,
+ java_start_class,
+ coverage_start_class,
+ merged_instr):
+ subs = {
+ "%needs_runfiles%": "1",
+ "%runfiles_manifest_only%": "",
+ # To avoid cracking open the depset, classpath is read from a separate
+ # file created in its own action. Needed as expand_template does not
+ # support ctx.actions.args().
+ "%classpath%": "$(eval echo $(<%s))" % (classpath_file.short_path),
+ "%java_start_class%": java_start_class,
+ "%jvm_flags%": " ".join(jvm_flags),
+ "%workspace_prefix%": ctx.workspace_name + "/",
+ }
+
+ if coverage_start_class:
+ prefix = ctx.attr._runfiles_root_prefix[BuildSettingInfo].value
+ subs["%set_jacoco_metadata%"] = (
+ "export JACOCO_METADATA_JAR=${JAVA_RUNFILES}/" + prefix +
+ merged_instr.short_path
+ )
+ subs["%set_jacoco_main_class%"] = (
+ "export JACOCO_MAIN_CLASS=" + coverage_start_class
+ )
+ subs["%set_jacoco_java_runfiles_root%"] = (
+ "export JACOCO_JAVA_RUNFILES_ROOT=${JAVA_RUNFILES}/" + prefix
+ )
+ else:
+ subs["%set_jacoco_metadata%"] = ""
+ subs["%set_jacoco_main_class%"] = ""
+ subs["%set_jacoco_java_runfiles_root%"] = ""
+
+ subs.update(substitutes)
+
+ ctx.actions.expand_template(
+ template = utils.only(get_android_toolchain(ctx).java_stub.files.to_list()),
+ output = stub_file,
+ substitutions = subs,
+ is_executable = True,
+ )
+
+ args = ctx.actions.args()
+ args.add_joined(
+ runfiles,
+ join_with = ":",
+ map_each = _get_classpath,
+ )
+ args.set_param_file_format("multiline")
+ ctx.actions.write(
+ output = classpath_file,
+ content = args,
+ )
+ return stub_file
+
+def _get_classpath(s):
+ return "${J3}" + s.short_path
+
+def _get_jvm_flags(ctx, main_class, robolectric_properties_path, additional_jvm_flags):
+ return [
+ "-ea",
+ "-Dbazel.test_suite=" + main_class,
+ "-Drobolectric.offline=true",
+ "-Drobolectric-deps.properties=" + robolectric_properties_path,
+ "-Duse_framework_manifest_parser=true",
+ "-Drobolectric.logging=stdout",
+ "-Drobolectric.logging.enabled=true",
+ "-Dorg.robolectric.packagesToNotAcquire=com.google.testing.junit.runner.util",
+ ] + DEFAULT_JIT_FLAGS + DEFAULT_GC_FLAGS + DEFAULT_VERIFY_FLAGS + additional_jvm_flags + [
+ ctx.expand_make_variables(
+ "jvm_flags",
+ ctx.expand_location(flag, ctx.attr.data),
+ {},
+ )
+ for flag in ctx.attr.jvm_flags
+ ]
+
+def _zip_file(ctx, f, dir_name, out_zip):
+ cmd = """
+base=$(pwd)
+tmp_dir=$(mktemp -d)
+
+cd $tmp_dir
+mkdir -p {dir_name}
+cp $base/{f} {dir_name}
+$base/{zip_tool} -jt -X -q $base/{out_zip} {dir_name}/$(basename {f})
+""".format(
+ zip_tool = get_android_toolchain(ctx).zip_tool.files_to_run.executable.path,
+ f = f.path,
+ dir_name = dir_name,
+ out_zip = out_zip.path,
+ )
+ ctx.actions.run_shell(
+ command = cmd,
+ inputs = [f],
+ tools = get_android_toolchain(ctx).zip_tool.files,
+ outputs = [out_zip],
+ mnemonic = "AddToZip",
+ toolchain = ANDROID_TOOLCHAIN_TYPE,
+ )
+
+def filter_jdeps(ctx, in_jdeps, out_jdeps, filter_suffix):
+ """Runs the JdepsFilter tool.
+
+ Args:
+ ctx: The context.
+ in_jdeps: File. The input jdeps file.
+ out_jdeps: File. The filtered jdeps output.
+ filter_suffix: File. The jdeps suffix to filter.
+ """
+ args = ctx.actions.args()
+ args.add("--in")
+ args.add(in_jdeps.path)
+ args.add("--target")
+ args.add(filter_suffix)
+ args.add("--out")
+ args.add(out_jdeps.path)
+ ctx.actions.run(
+ inputs = [in_jdeps],
+ outputs = [out_jdeps],
+ executable = get_android_toolchain(ctx).jdeps_tool.files_to_run,
+ arguments = [args],
+ mnemonic = "JdepsFilter",
+ progress_message = "Filtering jdeps",
+ toolchain = ANDROID_TOOLCHAIN_TYPE,
+ )
diff --git a/rules/android_local_test/rule.bzl b/rules/android_local_test/rule.bzl
new file mode 100644
index 0000000..a045d49
--- /dev/null
+++ b/rules/android_local_test/rule.bzl
@@ -0,0 +1,52 @@
+# Copyright 2018 The Bazel Authors. All rights reserved.
+#
+# 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.
+
+"""Bazel rule for Android local test."""
+
+load(":attrs.bzl", "ATTRS")
+load(":impl.bzl", "impl")
+
+def make_rule(
+ attrs = ATTRS,
+ implementation = impl):
+ """Makes the rule.
+
+ Args:
+ attrs: A dict. The attributes for the rule.
+ implementation: A function. The rule's implementation method.
+
+ Returns:
+ A rule.
+ """
+ return rule(
+ attrs = attrs,
+ implementation = implementation,
+ cfg = config_common.config_feature_flag_transition("feature_flags"),
+ fragments = [
+ "android",
+ "java",
+ ],
+ test = True,
+ outputs = dict(
+ deploy_jar = "%{name}_deploy.jar",
+ jar = "%{name}.jar",
+ ),
+ toolchains = [
+ "//toolchains/android:toolchain_type",
+ "//toolchains/android_sdk:toolchain_type",
+ "@bazel_tools//tools/jdk:toolchain_type",
+ ],
+ )
+
+android_local_test = make_rule()
diff --git a/rules/android_sandboxed_sdk/android_binary_with_sandboxed_sdks_macro.bzl b/rules/android_sandboxed_sdk/android_binary_with_sandboxed_sdks_macro.bzl
index 3214f34..95b8b80 100644
--- a/rules/android_sandboxed_sdk/android_binary_with_sandboxed_sdks_macro.bzl
+++ b/rules/android_sandboxed_sdk/android_binary_with_sandboxed_sdks_macro.bzl
@@ -23,32 +23,26 @@ load(
_get_android_toolchain = "get_android_toolchain",
)
load("//rules:java.bzl", _java = "java")
+load(
+ "//rules:sandboxed_sdk_toolbox.bzl",
+ _sandboxed_sdk_toolbox = "sandboxed_sdk_toolbox",
+)
def _gen_sdk_dependencies_manifest_impl(ctx):
manifest = ctx.actions.declare_file(ctx.label.name + "_sdk_dep_manifest.xml")
-
module_configs = [
bundle[AndroidSandboxedSdkBundleInfo].sdk_info.sdk_module_config
for bundle in ctx.attr.sdk_bundles
]
- args = ctx.actions.args()
- args.add("generate-sdk-dependencies-manifest")
- args.add("--manifest-package", ctx.attr.package)
- args.add("--sdk-module-configs", ",".join([config.path for config in module_configs]))
- args.add("--debug-keystore", ctx.file.debug_key.path)
- args.add("--debug-keystore-pass", "android")
- args.add("--debug-keystore-alias", "androiddebugkey")
- args.add("--output-manifest", manifest)
- _java.run(
- ctx = ctx,
+ _sandboxed_sdk_toolbox.generate_sdk_dependencies_manifest(
+ ctx,
+ output = manifest,
+ manifest_package = ctx.attr.package,
+ sdk_module_configs = module_configs,
+ debug_key = ctx.file.debug_key,
+ sandboxed_sdk_toolbox = _get_android_toolchain(ctx).sandboxed_sdk_toolbox.files_to_run,
host_javabase = _common.get_host_javabase(ctx),
- executable = _get_android_toolchain(ctx).sandboxed_sdk_toolbox.files_to_run,
- arguments = [args],
- inputs = module_configs + [ctx.file.debug_key],
- outputs = [manifest],
- mnemonic = "GenSdkDepManifest",
- progress_message = "Generate SDK dependencies manifest %s" % manifest.short_path,
)
return [
@@ -78,6 +72,7 @@ _gen_sdk_dependencies_manifest = rule(
implementation = _gen_sdk_dependencies_manifest_impl,
toolchains = [
"//toolchains/android:toolchain_type",
+ "@bazel_tools//tools/jdk:toolchain_type",
],
)
diff --git a/rules/android_sandboxed_sdk/android_sandboxed_sdk.bzl b/rules/android_sandboxed_sdk/android_sandboxed_sdk.bzl
index 87f0311..9c7063e 100644
--- a/rules/android_sandboxed_sdk/android_sandboxed_sdk.bzl
+++ b/rules/android_sandboxed_sdk/android_sandboxed_sdk.bzl
@@ -17,14 +17,17 @@
This file exists to inject the correct version of android_binary.
"""
-load(":android_sandboxed_sdk_macro.bzl", _android_sandboxed_sdk_macro = "android_sandboxed_sdk_macro")
load("//rules:android_binary.bzl", _android_binary = "android_binary")
+load(":android_sandboxed_sdk_macro.bzl", _android_sandboxed_sdk_macro = "android_sandboxed_sdk_macro")
def android_sandboxed_sdk(
name,
sdk_modules_config,
deps,
min_sdk_version = 21,
+ visibility = None,
+ testonly = None,
+ tags = [],
custom_package = None):
"""Rule to build an Android Sandboxed SDK.
@@ -38,6 +41,9 @@ def android_sandboxed_sdk(
https://github.com/google/bundletool/blob/master/src/main/proto/sdk_modules_config.proto
deps: Set of android libraries that make up this SDK.
min_sdk_version: Min SDK version for the SDK.
+ visibility: A list of targets allowed to depend on this rule.
+ testonly: Whether this library is only for testing.
+ tags: A list of string tags passed to generated targets.
custom_package: Java package for which java sources will be generated. By default the package
is inferred from the directory where the BUILD file containing the rule is. You can specify
a different package but this is highly discouraged since it can introduce classpath
@@ -49,6 +55,9 @@ def android_sandboxed_sdk(
sdk_modules_config = sdk_modules_config,
deps = deps,
min_sdk_version = min_sdk_version,
+ visibility = visibility,
+ testonly = testonly,
+ tags = tags,
custom_package = custom_package,
android_binary = _android_binary,
)
diff --git a/rules/android_sandboxed_sdk/android_sandboxed_sdk_bundle.bzl b/rules/android_sandboxed_sdk/android_sandboxed_sdk_bundle.bzl
index 102459a..d4b9e99 100644
--- a/rules/android_sandboxed_sdk/android_sandboxed_sdk_bundle.bzl
+++ b/rules/android_sandboxed_sdk/android_sandboxed_sdk_bundle.bzl
@@ -73,6 +73,7 @@ def _impl(ctx):
ctx,
out = ctx.outputs.asb,
module = module_zip,
+ sdk_api_descriptors = ctx.attr.sdk[AndroidSandboxedSdkInfo].sdk_api_descriptors,
sdk_modules_config = ctx.attr.sdk[AndroidSandboxedSdkInfo].sdk_module_config,
bundletool = _get_android_toolchain(ctx).bundletool.files_to_run,
host_javabase = host_javabase,
@@ -98,6 +99,7 @@ android_sandboxed_sdk_bundle = rule(
toolchains = [
"//toolchains/android:toolchain_type",
"//toolchains/android_sdk:toolchain_type",
+ "@bazel_tools//tools/jdk:toolchain_type",
],
fragments = ["android"],
)
diff --git a/rules/android_sandboxed_sdk/android_sandboxed_sdk_macro.bzl b/rules/android_sandboxed_sdk/android_sandboxed_sdk_macro.bzl
index 6d8deb1..787bc6c 100644
--- a/rules/android_sandboxed_sdk/android_sandboxed_sdk_macro.bzl
+++ b/rules/android_sandboxed_sdk/android_sandboxed_sdk_macro.bzl
@@ -14,16 +14,20 @@
"""Bazel rule for defining an Android Sandboxed SDK."""
-load(":providers.bzl", "AndroidSandboxedSdkInfo")
load(
"//rules:common.bzl",
_common = "common",
)
+load("//rules:java.bzl", _java = "java")
+load(
+ "//rules:sandboxed_sdk_toolbox.bzl",
+ _sandboxed_sdk_toolbox = "sandboxed_sdk_toolbox",
+)
load(
"//rules:utils.bzl",
_get_android_toolchain = "get_android_toolchain",
)
-load("//rules:java.bzl", _java = "java")
+load(":providers.bzl", "AndroidSandboxedSdkInfo")
_ATTRS = dict(
sdk_modules_config = attr.label(
@@ -41,20 +45,12 @@ _ATTRS = dict(
def _impl(ctx):
sdk_api_descriptors = ctx.actions.declare_file(ctx.label.name + "_sdk_api_descriptors.jar")
-
- args = ctx.actions.args()
- args.add("extract-api-descriptors")
- args.add("--sdk-deploy-jar", ctx.file.sdk_deploy_jar)
- args.add("--output-sdk-api-descriptors", sdk_api_descriptors)
- _java.run(
- ctx = ctx,
+ _sandboxed_sdk_toolbox.extract_api_descriptors(
+ ctx,
+ output = sdk_api_descriptors,
+ sdk_deploy_jar = ctx.file.sdk_deploy_jar,
+ sandboxed_sdk_toolbox = _get_android_toolchain(ctx).sandboxed_sdk_toolbox.files_to_run,
host_javabase = _common.get_host_javabase(ctx),
- executable = _get_android_toolchain(ctx).sandboxed_sdk_toolbox.files_to_run,
- arguments = [args],
- inputs = [ctx.file.sdk_deploy_jar],
- outputs = [sdk_api_descriptors],
- mnemonic = "ExtractApiDescriptors",
- progress_message = "Extract SDK API descriptors %s" % sdk_api_descriptors.short_path,
)
return [
DefaultInfo(
@@ -76,6 +72,7 @@ _android_sandboxed_sdk = rule(
],
toolchains = [
"//toolchains/android:toolchain_type",
+ "@bazel_tools//tools/jdk:toolchain_type",
],
)
@@ -84,6 +81,9 @@ def android_sandboxed_sdk_macro(
sdk_modules_config,
deps,
min_sdk_version = 21,
+ visibility = None,
+ testonly = None,
+ tags = [],
custom_package = None,
android_binary = None):
"""Macro for an Android Sandboxed SDK.
@@ -93,6 +93,9 @@ def android_sandboxed_sdk_macro(
sdk_modules_config: Module config for this SDK.
deps: Set of android libraries that make up this SDK.
min_sdk_version: Min SDK version for the SDK.
+ visibility: A list of targets allowed to depend on this rule.
+ testonly: Whether this library is only for testing.
+ tags: A list of string tags passed to generated targets.
custom_package: Java package for resources,
android_binary: android_binary rule used to create the intermediate SDK APK.
"""
@@ -119,13 +122,19 @@ EOF
android_binary(
name = bin_label.name,
manifest = str(manifest_label),
+ generate_art_profile = False,
deps = deps,
+ testonly = testonly,
+ tags = tags,
)
sdk_deploy_jar = Label("%s_deploy.jar" % bin_fqn)
_android_sandboxed_sdk(
name = name,
sdk_modules_config = sdk_modules_config,
+ visibility = visibility,
+ testonly = testonly,
+ tags = tags,
internal_android_binary = bin_label,
sdk_deploy_jar = sdk_deploy_jar,
)
diff --git a/rules/android_sandboxed_sdk/asar_import.bzl b/rules/android_sandboxed_sdk/asar_import.bzl
new file mode 100644
index 0000000..b2d9388
--- /dev/null
+++ b/rules/android_sandboxed_sdk/asar_import.bzl
@@ -0,0 +1,69 @@
+# Copyright 2023 The Bazel Authors. All rights reserved.
+#
+# 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.
+
+"""Rule for importing an Android Sandboxed SDK archive for further processing."""
+
+load(
+ "//rules:attrs.bzl",
+ _attrs = "attrs",
+)
+load(
+ "//rules:common.bzl",
+ _common = "common",
+)
+load(
+ "//rules:sandboxed_sdk_toolbox.bzl",
+ _sandboxed_sdk_toolbox = "sandboxed_sdk_toolbox",
+)
+load(
+ "//rules:utils.bzl",
+ _get_android_toolchain = "get_android_toolchain",
+)
+load(":providers.bzl", "AndroidArchivedSandboxedSdkInfo")
+
+def _impl(ctx):
+ sdk_api_descriptors = ctx.actions.declare_file(ctx.label.name + "_sdk_api_descriptors.jar")
+ _sandboxed_sdk_toolbox.extract_api_descriptors_from_asar(
+ ctx,
+ output = sdk_api_descriptors,
+ asar = ctx.file.asar,
+ sandboxed_sdk_toolbox = _get_android_toolchain(ctx).sandboxed_sdk_toolbox.files_to_run,
+ host_javabase = _common.get_host_javabase(ctx),
+ )
+ return [
+ AndroidArchivedSandboxedSdkInfo(
+ asar = ctx.file.asar,
+ sdk_api_descriptors = sdk_api_descriptors,
+ ),
+ ]
+
+asar_import = rule(
+ attrs = _attrs.add(
+ dict(
+ asar = attr.label(
+ allow_single_file = [".asar"],
+ ),
+ ),
+ _attrs.JAVA_RUNTIME,
+ ),
+ executable = False,
+ implementation = _impl,
+ provides = [
+ AndroidArchivedSandboxedSdkInfo,
+ ],
+ toolchains = [
+ "//toolchains/android:toolchain_type",
+ "@bazel_tools//tools/jdk:toolchain_type",
+ ],
+)
diff --git a/rules/android_sandboxed_sdk/providers.bzl b/rules/android_sandboxed_sdk/providers.bzl
index 0771d99..d4917bc 100644
--- a/rules/android_sandboxed_sdk/providers.bzl
+++ b/rules/android_sandboxed_sdk/providers.bzl
@@ -28,6 +28,16 @@ AndroidSandboxedSdkInfo = provider(
),
)
+AndroidArchivedSandboxedSdkInfo = provider(
+ doc = "Provides information about an Android Sandboxed SDK archive.",
+ fields = dict(
+ asar = "Android Sandboxed SDK archive file, as generated by Bundletool.",
+ sdk_api_descriptors = "Jar file with the SDK API Descriptors. This can later be used to " +
+ "generate sources for communicating with this SDK from the app " +
+ "process.",
+ ),
+)
+
AndroidSandboxedSdkBundleInfo = provider(
doc = "Provides information about a sandboxed Android SDK Bundle (ASB).",
fields = dict(
diff --git a/rules/android_sdk_repository.bzl b/rules/android_sdk_repository.bzl
deleted file mode 100644
index f82f6e6..0000000
--- a/rules/android_sdk_repository.bzl
+++ /dev/null
@@ -1,25 +0,0 @@
-# Copyright 2018 The Bazel Authors. All rights reserved.
-#
-# 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.
-
-"""Bazel rule for Android sdk repository."""
-
-def android_sdk_repository(**attrs):
- """Bazel android_sdk_repository rule.
-
- https://docs.bazel.build/versions/master/be/android.html#android_sdk_repository
-
- Args:
- **attrs: Rule attributes
- """
- native.android_sdk_repository(**attrs)
diff --git a/rules/android_sdk_repository/BUILD b/rules/android_sdk_repository/BUILD
new file mode 100644
index 0000000..e9701b1
--- /dev/null
+++ b/rules/android_sdk_repository/BUILD
@@ -0,0 +1,18 @@
+# Description:
+# The android_sdk_repository repository rule for using an Android SDK with Bazel.
+
+load("@bazel_skylib//:bzl_library.bzl", "bzl_library")
+
+bzl_library(
+ name = "bzl",
+ srcs = [
+ "empty.template.bzl",
+ "helper.bzl",
+ "rule.bzl",
+ "template.bzl",
+ ],
+ visibility = ["//:__subpackages__"],
+ deps = [
+ "//rules:android_revision_bzl",
+ ],
+)
diff --git a/rules/android_sdk_repository/empty.template.bzl b/rules/android_sdk_repository/empty.template.bzl
new file mode 100644
index 0000000..bfef88c
--- /dev/null
+++ b/rules/android_sdk_repository/empty.template.bzl
@@ -0,0 +1,60 @@
+# Copyright 2023 The Bazel Authors. All rights reserved.
+#
+# 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.
+"""
+This module adds no-op repository rules when the Android SDK is not installed.
+"""
+
+package(default_visibility = ["//visibility:public"])
+
+# android_sdk_repository was used without a valid Android SDK being set.
+# Either the path attribute of android_sdk_repository or the ANDROID_HOME
+# environment variable must be set.
+# This is a minimal BUILD file to allow non-Android builds to continue.
+
+alias(
+ name = "has_androidsdk",
+ actual = "@bazel_tools//tools/android:always_false",
+)
+
+filegroup(
+ name = "files",
+ srcs = [":error_message"],
+)
+
+filegroup(
+ name = "sdk",
+ srcs = [":error_message"],
+)
+
+filegroup(
+ name = "d8_jar_import",
+ srcs = [":error_message"],
+)
+
+filegroup(
+ name = "dx_jar_import",
+ srcs = [":error_message"],
+)
+
+genrule(
+ name = "invalid_android_sdk_repository_error",
+ outs = [
+ "error_message",
+ ],
+ cmd = """echo \
+ android_sdk_repository was used without a valid Android SDK being set. \
+ Either the path attribute of android_sdk_repository or the ANDROID_HOME \
+ environment variable must be set. ; \
+ exit 1 """,
+)
diff --git a/rules/android_sdk_repository/helper.bzl b/rules/android_sdk_repository/helper.bzl
new file mode 100644
index 0000000..43f715f
--- /dev/null
+++ b/rules/android_sdk_repository/helper.bzl
@@ -0,0 +1,507 @@
+# Copyright 2016 The Bazel Authors. All rights reserved.
+#
+# 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.
+
+"""Helpers for the build file used in android_sdk_repository."""
+
+load("@local_config_platform//:constraints.bzl", "HOST_CONSTRAINTS")
+load("@rules_java//java:defs.bzl", "java_binary", "java_import")
+
+def _bool_flag_impl(_unused_ctx):
+ pass
+
+_bool_flag = rule(
+ implementation = _bool_flag_impl,
+ build_setting = config.bool(flag = True),
+)
+
+def _int_flag_impl(ctx):
+ allowed_values = ctx.attr.values
+ value = ctx.build_setting_value
+ if len(allowed_values) != 0 and value not in ctx.attr.values:
+ fail(
+ "Error setting %s: invalid value '%d'. Allowed values are %s" % (
+ ctx.label,
+ value,
+ ",".join([str(val) for val in allowed_values]),
+ ),
+ )
+
+int_flag = rule(
+ implementation = _int_flag_impl,
+ build_setting = config.int(flag = True),
+ attrs = {
+ "values": attr.int_list(
+ doc = "The list of allowed values for this setting. An error is raised if any other value is given.",
+ ),
+ },
+ doc = "An int-typed build setting that can be set on the command line",
+)
+
+def _create_config_setting_rule():
+ """Create config_setting rule for windows.
+
+ These represent the matching --host_cpu values.
+ """
+ name = "windows"
+ if not native.existing_rule(name):
+ native.config_setting(
+ name = name,
+ values = {"host_cpu": "x64_" + name},
+ )
+
+ native.config_setting(
+ name = "d8_standalone_dexer",
+ values = {"define": "android_standalone_dexing_tool=d8_compat_dx"},
+ )
+
+ native.config_setting(
+ name = "dx_standalone_dexer",
+ values = {"define": "android_standalone_dexing_tool=dx_compat_dx"},
+ )
+
+ _bool_flag(
+ name = "allow_proguard",
+ build_setting_default = True,
+ )
+
+ native.config_setting(
+ name = "disallow_proguard",
+ flag_values = {":allow_proguard": "false"},
+ )
+
+def create_android_sdk_rules(
+ name,
+ build_tools_version,
+ build_tools_directory,
+ api_levels,
+ default_api_level):
+ """Generate android_sdk rules for the API levels in the Android SDK.
+
+ Args:
+ name: string, the name of the repository being generated.
+ build_tools_version: string, the version of Android's build tools to use.
+ build_tools_directory: string, the directory name of the build tools in
+ sdk's build-tools directory.
+ api_levels: list of ints, the API levels from which to get android.jar
+ et al. and create android_sdk rules.
+ default_api_level: int, the API level to alias the default sdk to if
+ --android_sdk is not specified on the command line.
+ """
+
+ _create_config_setting_rule()
+
+ int_flag(
+ name = "api_level",
+ build_setting_default = default_api_level,
+ values = api_levels,
+ visibility = ["//visibility:public"],
+ )
+
+ windows_only_files = [
+ "build-tools/%s/aapt.exe" % build_tools_directory,
+ "build-tools/%s/aidl.exe" % build_tools_directory,
+ "build-tools/%s/zipalign.exe" % build_tools_directory,
+ "platform-tools/adb.exe",
+ ] + native.glob(
+ ["build-tools/%s/aapt2.exe" % build_tools_directory],
+ allow_empty = True,
+ )
+
+ linux_only_files = [
+ "build-tools/%s/aapt" % build_tools_directory,
+ "build-tools/%s/aidl" % build_tools_directory,
+ "build-tools/%s/zipalign" % build_tools_directory,
+ "platform-tools/adb",
+ ] + native.glob(
+ ["extras", "build-tools/%s/aapt2" % build_tools_directory],
+ allow_empty = True,
+ exclude_directories = 0,
+ )
+
+ # This filegroup is used to pass the minimal contents of the SDK to the
+ # Android integration tests. Note that in order to work on Windows, we cannot
+ # include directories and must keep the size small.
+ native.filegroup(
+ name = "files",
+ srcs = [
+ "build-tools/%s/lib/apksigner.jar" % build_tools_directory,
+ "build-tools/%s/lib/d8.jar" % build_tools_directory,
+ "build-tools/%s/lib/dx.jar" % build_tools_directory,
+ "build-tools/%s/mainDexClasses.rules" % build_tools_directory,
+ ":build_tools_libs",
+ ] + [
+ "platforms/android-%d/%s" % (api_level, filename)
+ for api_level in api_levels
+ for filename in ["android.jar", "framework.aidl"]
+ ] + select({
+ ":windows": windows_only_files,
+ "//conditions:default": linux_only_files,
+ }),
+ )
+
+ for api_level in api_levels:
+ if api_level >= 23:
+ # Android 23 removed most of org.apache.http from android.jar and moved it
+ # to a separate jar.
+ java_import(
+ name = "org_apache_http_legacy-%d" % api_level,
+ jars = ["platforms/android-%d/optional/org.apache.http.legacy.jar" % api_level],
+ )
+
+ if api_level >= 28:
+ # Android 28 removed most of android.test from android.jar and moved it
+ # to separate jars.
+ java_import(
+ name = "legacy_test-%d" % api_level,
+ jars = [
+ "platforms/android-%d/optional/android.test.base.jar" % api_level,
+ "platforms/android-%d/optional/android.test.mock.jar" % api_level,
+ "platforms/android-%d/optional/android.test.runner.jar" % api_level,
+ ],
+ neverlink = 1,
+ )
+
+ native.config_setting(
+ name = "api_%d_enabled" % api_level,
+ flag_values = {
+ ":api_level": str(api_level),
+ },
+ )
+
+ # TODO(katre): Use the Starlark android_sdk
+ native.android_sdk(
+ name = "sdk-%d" % api_level,
+ aapt = select({
+ ":windows": "build-tools/%s/aapt.exe" % build_tools_directory,
+ "//conditions:default": ":aapt_binary",
+ }),
+ aapt2 = select({
+ ":windows": "build-tools/%s/aapt2.exe" % build_tools_directory,
+ "//conditions:default": ":aapt2_binary",
+ }),
+ adb = select({
+ ":windows": "platform-tools/adb.exe",
+ "//conditions:default": "platform-tools/adb",
+ }),
+ aidl = select({
+ ":windows": "build-tools/%s/aidl.exe" % build_tools_directory,
+ "//conditions:default": ":aidl_binary",
+ }),
+ android_jar = "platforms/android-%d/android.jar" % api_level,
+ apksigner = ":apksigner",
+ build_tools_version = build_tools_version,
+ dx = select({
+ "d8_standalone_dexer": ":d8_compat_dx",
+ "dx_standalone_dexer": ":dx_binary",
+ "//conditions:default": ":d8_compat_dx",
+ }),
+ framework_aidl = "platforms/android-%d/framework.aidl" % api_level,
+ legacy_main_dex_list_generator = ":generate_main_dex_list",
+ main_dex_classes = "build-tools/%s/mainDexClasses.rules" % build_tools_directory,
+ proguard = select({
+ ":disallow_proguard": ":fail",
+ "//conditions:default": "@bazel_tools//tools/jdk:proguard",
+ }),
+ shrinked_android_jar = "platforms/android-%d/android.jar" % api_level,
+ # See https://github.com/bazelbuild/bazel/issues/8757
+ tags = ["__ANDROID_RULES_MIGRATION__"],
+ zipalign = select({
+ ":windows": "build-tools/%s/zipalign.exe" % build_tools_directory,
+ "//conditions:default": ":zipalign_binary",
+ }),
+ )
+
+ native.toolchain(
+ name = "sdk-%d-toolchain" % api_level,
+ exec_compatible_with = HOST_CONSTRAINTS,
+ target_compatible_with = [
+ "@platforms//os:android",
+ ],
+ toolchain = ":sdk-%d" % api_level,
+ toolchain_type = "@bazel_tools//tools/android:sdk_toolchain_type",
+ target_settings = [
+ ":api_%d_enabled" % api_level,
+ ],
+ )
+
+ native.alias(
+ name = "org_apache_http_legacy",
+ actual = ":org_apache_http_legacy-%d" % default_api_level,
+ )
+
+ sdk_alias_dict = {
+ "//conditions:default": "sdk-%d" % default_api_level,
+ }
+
+ for api_level in api_levels:
+ sdk_alias_dict[":api_%d_enabled" % api_level] = "sdk-%d" % api_level
+
+ native.alias(
+ name = "sdk",
+ actual = select(
+ sdk_alias_dict,
+ no_match_error = "Unknown Android SDK level, valid levels are %s" % ",".join([str(level) for level in api_levels]),
+ ),
+ )
+
+ java_binary(
+ name = "apksigner",
+ main_class = "com.android.apksigner.ApkSignerTool",
+ runtime_deps = ["build-tools/%s/lib/apksigner.jar" % build_tools_directory],
+ )
+
+ native.filegroup(
+ name = "build_tools_libs",
+ srcs = native.glob([
+ "build-tools/%s/lib/**" % build_tools_directory,
+ # Build tools version 24.0.0 added a lib64 folder.
+ "build-tools/%s/lib64/**" % build_tools_directory,
+ ], allow_empty = True),
+ )
+
+ for tool in ["aapt", "aapt2", "aidl", "zipalign"]:
+ native.genrule(
+ name = tool + "_runner",
+ srcs = [],
+ outs = [tool + "_runner.sh"],
+ cmd = "\n".join([
+ "cat > $@ << 'EOF'",
+ "#!/bin/bash",
+ "set -eu",
+ # The tools under build-tools/VERSION require the libraries under
+ # build-tools/VERSION/lib, so we can't simply depend on them as a
+ # file like we do with aapt.
+ # On Windows however we can use these binaries directly because
+ # there's no runfiles support so Bazel just creates a junction to
+ # {SDK}/build-tools.
+ "SDK=$${0}.runfiles/%s" % name,
+ # If $${SDK} is not a directory, it means that this tool is running
+ # from a runfiles directory, in the case of
+ # android_instrumentation_test. Hence, use the androidsdk
+ # that's already present in the runfiles of the current context.
+ "if [[ ! -d $${SDK} ]] ; then",
+ " SDK=$$(pwd)/../%s" % name,
+ "fi",
+ "tool=$${SDK}/build-tools/%s/%s" % (build_tools_directory, tool),
+ "exec env LD_LIBRARY_PATH=$${SDK}/build-tools/%s/lib64 $$tool $$*" % build_tools_directory,
+ "EOF\n",
+ ]),
+ )
+
+ native.sh_binary(
+ name = tool + "_binary",
+ srcs = [tool + "_runner.sh"],
+ data = [
+ ":build_tools_libs",
+ "build-tools/%s/%s" % (build_tools_directory, tool),
+ ],
+ )
+
+ native.sh_binary(
+ name = "fail",
+ srcs = select({
+ ":windows": [":generate_fail_cmd"],
+ "//conditions:default": [":generate_fail_sh"],
+ }),
+ )
+
+ native.genrule(
+ name = "generate_fail_sh",
+ outs = ["fail.sh"],
+ cmd = "echo -e '#!/bin/bash\\nexit 1' >> $@; chmod +x $@",
+ executable = 1,
+ )
+
+ native.genrule(
+ name = "generate_fail_cmd",
+ outs = ["fail.cmd"],
+ cmd = "echo @exit /b 1 > $@",
+ executable = 1,
+ )
+
+ native.genrule(
+ name = "main_dex_list_creator_source",
+ srcs = [],
+ outs = ["main_dex_list_creator.sh"],
+ cmd = "\n".join([
+ "cat > $@ <<'EOF'",
+ "#!/bin/bash",
+ "",
+ "MAIN_DEX_LIST=$$1",
+ "STRIPPED_JAR=$$2",
+ "JAR=$$3",
+ "" +
+ "JAVA_BINARY=$$0.runfiles/%s/main_dex_list_creator_java" % name,
+ "$$JAVA_BINARY $$STRIPPED_JAR $$JAR > $$MAIN_DEX_LIST",
+ "exit $$?",
+ "",
+ "EOF\n",
+ ]),
+ )
+
+ native.sh_binary(
+ name = "main_dex_list_creator",
+ srcs = ["main_dex_list_creator.sh"],
+ data = [":main_dex_list_creator_java"],
+ )
+ java_binary(
+ name = "main_dex_list_creator_java",
+ main_class = "com.android.multidex.ClassReferenceListBuilder",
+ runtime_deps = [":dx_jar_import"],
+ )
+ java_binary(
+ name = "dx_binary",
+ main_class = "com.android.dx.command.Main",
+ runtime_deps = [":dx_jar_import"],
+ )
+ java_import(
+ name = "dx_jar_import",
+ jars = ["build-tools/%s/lib/dx.jar" % build_tools_directory],
+ )
+ java_binary(
+ name = "generate_main_dex_list",
+ jvm_flags = [
+ "-XX:+TieredCompilation",
+ "-XX:TieredStopAtLevel=1",
+ # Consistent with what we use for desugar.
+ "-Xms8g",
+ "-Xmx8g",
+ ],
+ main_class = "com.android.tools.r8.GenerateMainDexList",
+ runtime_deps = ["@bazel_tools//src/tools/android/java/com/google/devtools/build/android/r8"],
+ )
+ java_binary(
+ name = "d8_compat_dx",
+ main_class = "com.google.devtools.build.android.r8.CompatDx",
+ runtime_deps = [
+ "@bazel_tools//src/tools/android/java/com/google/devtools/build/android/r8",
+ ],
+ )
+ native.alias(
+ name = "d8_jar_import",
+ actual = "@android_gmaven_r8//jar",
+ )
+
+TAGDIR_TO_TAG_MAP = {
+ "google_apis_playstore": "playstore",
+ "google_apis": "google",
+ "default": "android",
+ "android-tv": "tv",
+ "android-wear": "wear",
+}
+
+ARCHDIR_TO_ARCH_MAP = {
+ "x86": "x86",
+ "armeabi-v7a": "arm",
+}
+
+# buildifier: disable=unnamed-macro
+def create_system_images_filegroups(system_image_dirs):
+ """Generate filegroups for the system images in the Android SDK.
+
+ Args:
+ system_image_dirs: list of strings, the directories containing system image
+ files to be used to create android_device rules.
+ """
+
+ # These images will need to be updated as Android releases new system images.
+ # We are intentionally not adding future releases because there is no
+ # guarantee that they will work out of the box. Supported system images should
+ # be added here once they have been confirmed to work with the Bazel Android
+ # testing infrastructure.
+ system_images = [
+ (tag, str(api), arch)
+ for tag in ["android", "google"]
+ for api in [10] + list(range(15, 20)) + list(range(21, 30))
+ for arch in ("x86", "arm")
+ ] + [
+ ("playstore", str(api), "x86")
+ for api in list(range(24, 30))
+ ]
+ tv_images = [
+ ("tv", str(api), "x86")
+ for api in range(21, 30)
+ ] + [
+ ("tv", "21", "arm"),
+ ("tv", "23", "arm"),
+ ]
+ wear_images = [
+ ("wear", str(api), "x86")
+ for api in [23, 25, 26, 28]
+ ] + [
+ ("wear", str(api), "arm")
+ for api in [23, 25]
+ ]
+ supported_system_images = system_images + tv_images + wear_images
+
+ installed_system_images_dirs = {}
+ for system_image_dir in system_image_dirs:
+ apidir, tagdir, archdir = system_image_dir.split("/")[1:]
+ if "-" not in apidir:
+ continue
+ api = apidir.split("-")[1] # "android-24" --> "24", "android-O" --> "O"
+ if tagdir not in TAGDIR_TO_TAG_MAP:
+ continue
+ tag = TAGDIR_TO_TAG_MAP[tagdir]
+ if archdir not in ARCHDIR_TO_ARCH_MAP:
+ continue
+ arch = ARCHDIR_TO_ARCH_MAP[archdir]
+ if (tag, api, arch) in supported_system_images:
+ name = "emulator_images_%s_%s_%s" % (tag, api, arch)
+ installed_system_images_dirs[name] = system_image_dir
+ else:
+ # TODO(bazel-team): If the user has an unsupported system image installed,
+ # should we print a warning? This includes all 64-bit system-images.
+ pass
+
+ for (tag, api, arch) in supported_system_images:
+ name = "emulator_images_%s_%s_%s" % (tag, api, arch)
+ if name in installed_system_images_dirs:
+ system_image_dir = installed_system_images_dirs[name]
+
+ # For supported system images that exist in /sdk/system-images/, we
+ # create a filegroup with their contents.
+ native.filegroup(
+ name = name,
+ srcs = native.glob([
+ "%s/**" % system_image_dir,
+ ]),
+ )
+ native.filegroup(
+ name = "%s_qemu2_extra" % name,
+ srcs = native.glob(["%s/kernel-ranchu" % system_image_dir], allow_empty = True),
+ )
+ else:
+ # For supported system images that are not installed in the SDK, we
+ # create a "poison pill" genrule to display a helpful error message to
+ # a user who attempts to run a test against an android_device that
+ # they don't have the system image for installed.
+ native.genrule(
+ name = name,
+ outs = [
+ # Necessary so that the build doesn't fail in analysis because
+ # android_device expects a file named source.properties.
+ "poison_pill_for_%s/source.properties" % name,
+ ],
+ cmd = """echo \
+ This rule requires that the Android SDK used by Bazel has the \
+ following system image installed: %s. Please install this system \
+ image through the Android SDK Manager and try again. ; \
+ exit 1
+ """ % name,
+ )
+ native.filegroup(
+ name = "%s_qemu2_extra" % name,
+ srcs = [],
+ )
diff --git a/rules/android_sdk_repository/rule.bzl b/rules/android_sdk_repository/rule.bzl
new file mode 100644
index 0000000..8b6e5eb
--- /dev/null
+++ b/rules/android_sdk_repository/rule.bzl
@@ -0,0 +1,202 @@
+# Copyright 2018 The Bazel Authors. All rights reserved.
+#
+# 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.
+
+"""Bazel rule for Android sdk repository."""
+
+load("//rules:android_revision.bzl", "compare_android_revisions", "parse_android_revision")
+
+_SDK_REPO_TEMPLATE = Label(":template.bzl")
+_EMPTY_SDK_REPO_TEMPLATE = Label(":empty.template.bzl")
+
+_BUILD_TOOLS_DIR = "build-tools"
+_PLATFORMS_DIR = "platforms"
+_SYSTEM_IMAGES_DIR = "system-images"
+_LOCAL_MAVEN_REPOS = [
+ "extras/android/m2repository",
+ "extras/google/m2repository",
+ "extras/m2repository",
+]
+_DIRS_TO_LINK = [
+ _BUILD_TOOLS_DIR,
+ "emulator",
+ "platform-tools",
+ _PLATFORMS_DIR,
+ _SYSTEM_IMAGES_DIR,
+] + _LOCAL_MAVEN_REPOS
+
+_MIN_BUILD_TOOLS_VERSION = parse_android_revision("30.0.0")
+
+def _read_api_levels(repo_ctx, android_sdk_path):
+ platforms_dir = "%s/%s" % (android_sdk_path, _PLATFORMS_DIR)
+ api_levels = []
+ platforms_path = repo_ctx.path(platforms_dir)
+ if not platforms_path.exists:
+ return api_levels
+ for entry in platforms_path.readdir():
+ name = entry.basename
+ if name.startswith("android-"):
+ level = int(name[len("android-"):])
+ api_levels.append(level)
+ return api_levels
+
+def _newest_build_tools(repo_ctx, android_sdk_path):
+ build_tools_dir = "%s/%s" % (android_sdk_path, _BUILD_TOOLS_DIR)
+ highest = None
+ build_tools_path = repo_ctx.path(build_tools_dir)
+ if not build_tools_path.exists:
+ return None
+ for entry in build_tools_path.readdir():
+ name = entry.basename
+ revision = parse_android_revision(name)
+ highest = compare_android_revisions(highest, revision)
+ return highest
+
+def _find_system_images(repo_ctx, android_sdk_path):
+ system_images_dir = "%s/%s" % (android_sdk_path, _SYSTEM_IMAGES_DIR)
+ system_images = []
+
+ system_images_path = repo_ctx.path(system_images_dir)
+ if not system_images_path.exists:
+ return system_images
+
+ # The directory structure needed is "system-images/android-API/apis-enabled/arch"
+ for api_entry in system_images_path.readdir():
+ for enabled_entry in api_entry.readdir():
+ for arch_entry in enabled_entry.readdir():
+ image_path = "%s/%s/%s/%s" % (
+ _SYSTEM_IMAGES_DIR,
+ api_entry.basename,
+ enabled_entry.basename,
+ arch_entry.basename,
+ )
+ system_images.append(image_path)
+
+ return system_images
+
+def _android_sdk_repository_impl(repo_ctx):
+ # Determine the SDK path to use, either from the attribute or the environment.
+ android_sdk_path = repo_ctx.attr.path
+ if not android_sdk_path:
+ android_sdk_path = repo_ctx.os.environ.get("ANDROID_HOME")
+ if not android_sdk_path:
+ # Create an empty repository that allows non-Android code to build.
+ repo_ctx.template("BUILD.bazel", _EMPTY_SDK_REPO_TEMPLATE)
+ return None
+
+ # Symlink the needed contents to this repository.
+ for dir_to_link in _DIRS_TO_LINK:
+ source = "%s/%s" % (android_sdk_path, dir_to_link)
+ dest = dir_to_link
+ repo_ctx.symlink(source, dest)
+
+ # Read list of supported SDK levels
+ api_levels = _read_api_levels(repo_ctx, android_sdk_path)
+ if len(api_levels) == 0:
+ fail("No Android SDK apis found in the Android SDK at %s. Please install APIs from the Android SDK Manager." % android_sdk_path)
+
+ # Determine default SDK level.
+ default_api_level = max(api_levels)
+ if repo_ctx.attr.api_level:
+ default_api_level = int(repo_ctx.attr.api_level)
+ if default_api_level not in api_levels:
+ fail("Android SDK api level %s was requested but it is not installed in the Android SDK at %s. The api levels found were %s. Please choose an available api level or install api level %s from the Android SDK Manager." % (
+ default_api_level,
+ android_sdk_path,
+ api_levels,
+ default_api_level,
+ ))
+
+ # Determine build_tools directory (and version)
+ build_tools = None
+ if repo_ctx.attr.build_tools_version:
+ build_tools = parse_android_revision(repo_ctx.attr.build_tools_version)
+ else:
+ build_tools = _newest_build_tools(repo_ctx, android_sdk_path)
+
+ # Check validity of build_tools
+ if not build_tools:
+ fail("Unable to determine build tools version")
+ if compare_android_revisions(build_tools, _MIN_BUILD_TOOLS_VERSION) != build_tools:
+ fail("Bazel requires Android build tools version %s or newer, %s was provided" % (
+ _MIN_BUILD_TOOLS_VERSION.dir,
+ build_tools.dir,
+ ))
+
+ # Determine system image dirs
+ system_images = _find_system_images(repo_ctx, android_sdk_path)
+
+ # Write the build file.
+ repo_ctx.symlink(Label(":helper.bzl"), "helper.bzl")
+ repo_ctx.template(
+ "BUILD.bazel",
+ _SDK_REPO_TEMPLATE,
+ substitutions = {
+ "__repository_name__": repo_ctx.name,
+ "__build_tools_version__": build_tools.version,
+ "__build_tools_directory__": build_tools.dir,
+ "__api_levels__": ",".join([str(level) for level in api_levels]),
+ "__default_api_level__": str(default_api_level),
+ "__system_image_dirs__": "\n".join(["'%s'," % d for d in system_images]),
+ # TODO(katre): implement these.
+ #"__exported_files__": "",
+ },
+ )
+
+ # repo is reproducible
+ return None
+
+_android_sdk_repository = repository_rule(
+ implementation = _android_sdk_repository_impl,
+ attrs = {
+ "api_level": attr.int(default = 0),
+ "build_tools_version": attr.string(),
+ "path": attr.string(),
+ },
+ environ = ["ANDROID_HOME"],
+ local = True,
+)
+
+def _bind(repo_name, bind_name, target):
+ native.bind(name = bind_name, actual = "@%s//%s" % (repo_name, target))
+
+def android_sdk_repository(
+ name,
+ path = "",
+ api_level = 0,
+ build_tools_version = ""):
+ """Create a repository with Android SDK bindings and toolchains.
+
+ The SDK will be located at the given path, or via the ANDROID_HOME
+ environment variable if the path attribute is unset.
+
+ Args:
+ name: The repository name.
+ api_level: The SDK API level to use.
+ build_tools_version: The build_tools in the SDK to use.
+ path: The path to the Android SDK.
+ """
+
+ _android_sdk_repository(
+ name = name,
+ path = path,
+ api_level = api_level,
+ build_tools_version = build_tools_version,
+ )
+
+ _bind(name, "android/sdk", ":sdk")
+ _bind(name, "android/d8_jar_import", ":d8_jar_import")
+ _bind(name, "android/dx_jar_import", ":dx_jar_import")
+ _bind(name, "android_sdk_for_testing", ":files")
+ _bind(name, "has_android_sdk", ":has_android_sdk")
+ native.register_toolchains("@%s//:all" % name)
diff --git a/rules/android_sdk_repository/template.bzl b/rules/android_sdk_repository/template.bzl
new file mode 100644
index 0000000..69df99e
--- /dev/null
+++ b/rules/android_sdk_repository/template.bzl
@@ -0,0 +1,104 @@
+# Copyright 2023 The Bazel Authors. All rights reserved.
+#
+# 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.
+"""
+This module contains repository rules and helpers needed to configure the Android SDK for Bazel.
+"""
+
+load(
+ ":helper.bzl",
+ "create_android_sdk_rules",
+ "create_system_images_filegroups",
+)
+
+package(default_visibility = ["//visibility:public"])
+
+alias(
+ name = "has_androidsdk",
+ actual = "@bazel_tools//tools/android:always_true",
+)
+
+create_android_sdk_rules(
+ name = "__repository_name__",
+ build_tools_version = "__build_tools_version__",
+ build_tools_directory = "__build_tools_directory__",
+ api_levels = [__api_levels__],
+ default_api_level = __default_api_level__,
+)
+
+alias(
+ name = "adb",
+ actual = "platform-tools/adb",
+)
+
+alias(
+ name = "emulator",
+ actual = "emulator/emulator",
+)
+
+# emulator v29+ removed the arm and x86 specific binaries.
+# Keeping these aliases around for backwards compatibility.
+alias(
+ name = "emulator_arm",
+ actual = "emulator/emulator",
+)
+
+alias(
+ name = "emulator_x86",
+ actual = "emulator/emulator",
+)
+
+filegroup(
+ name = "emulator_x86_bios",
+ srcs = glob(
+ ["emulator/lib/pc-bios/*"],
+ allow_empty = True,
+ ),
+)
+
+alias(
+ name = "mksd",
+ actual = "emulator/mksdcard",
+)
+
+filegroup(
+ name = "emulator_shared_libs",
+ srcs = glob(
+ ["emulator/lib64/**"],
+ allow_empty = True,
+ ),
+)
+
+filegroup(
+ name = "sdk_path",
+ srcs = ["."],
+)
+
+filegroup(
+ name = "qemu2_x86",
+ srcs = ["emulator/emulator"] + select({
+ "@bazel_tools//src/conditions:darwin_x86_64": ["emulator/qemu/darwin-x86_64/qemu-system-i386"],
+ "@bazel_tools//src/conditions:darwin_arm64": ["emulator/qemu/darwin-aarch64/qemu-system-aarch64"],
+ "//conditions:default": ["emulator/qemu/linux-x86_64/qemu-system-i386"],
+ }),
+)
+
+create_system_images_filegroups(
+ system_image_dirs = [__system_image_dirs__],
+)
+
+exports_files(
+ # TODO(katre): implement these.
+ #[ __exported_files__] +
+ glob(["system-images/**"], allow_empty = True),
+)
diff --git a/rules/baseline_profiles.bzl b/rules/baseline_profiles.bzl
index 581631b..9818a78 100644
--- a/rules/baseline_profiles.bzl
+++ b/rules/baseline_profiles.bzl
@@ -13,13 +13,97 @@
# limitations under the License.
"""
-Defines baseline profiles processing.
+Defines baseline profiles processing methods in Android Rules.
"""
-load("//rules:utils.bzl", "ANDROID_TOOLCHAIN_TYPE", "get_android_toolchain")
+_BASELINE_PROFILE_DIR_SUFFIX = "-baseline-profile/"
-def _process(ctx, final_classes_dex, transitive_profiles):
- """ Merges/compiles all the baseline profiles propagated from android_library and aar_import.
+def _process(
+ ctx,
+ transitive_profiles = depset(),
+ startup_profiles = [],
+ deploy_jar = None,
+ has_proguard_specs = False,
+ enable_optimizer_integration = False,
+ merge_tool = None,
+ profgen = None,
+ toolchain_type = None):
+ """Processes all the transitive baseline profiles.
+
+ Baseline profiles propagated from libraries will be merged, and if optimizer integration is
+ enabled, startup profiles will be merged as well, and wildcards in baseline profiles will be
+ expanded.
+
+ Args:
+ ctx: The context.
+ transitive_profiles: Depset. The transitive baseline profiles propagated from android_library
+ and aar_import.
+ startup_profiles: List. The startup profiles.
+ deploy_jar: File. The deploy jar.
+ has_proguard_specs: Boolean. Whether to have proguard specs.
+ enable_optimizer_integration: Boolean. Whether to use startup profile and baseline profiles in optimization.
+ merge_tool: FilesToRunProvider. An executable for merging baseline profiles.
+ profgen: FilesToRunProvider: An executable for compiling baseline profiles.
+ toolchain_type: Label or String. Toolchain type of the executable used in actions.
+ Returns:
+ A struct containing all the outputs from processing baseline profiles.
+ """
+
+ baseline_profile = None
+ startup_profile = None
+ if transitive_profiles:
+ baseline_profile = _get_profile_artifact(ctx, "static-prof.txt")
+ _merge(
+ ctx,
+ baseline_profile,
+ transitive_profiles,
+ "MergeBaselineProfiles",
+ merge_tool = merge_tool,
+ toolchain_type = toolchain_type,
+ )
+
+ if has_proguard_specs and enable_optimizer_integration:
+ # This is only needed for optimized builds since otherwise the dexer doesn't process this.
+ if startup_profiles:
+ startup_profile = _get_profile_artifact(ctx, "static-startup-prof.txt")
+ _merge(
+ ctx,
+ output = startup_profile,
+ inputs = ctx.files.startup_profiles,
+ mnemonic = "MergeStartupProfiles",
+ merge_tool = merge_tool,
+ toolchain_type = toolchain_type,
+ )
+
+ # Wildcards only need to be expanded for optimized builds since if these aren't consumed by
+ # the optimizer, they can just be expanded during profile compilation instead.
+ # Start-up profiles are not expanded because it shouldn't be necessary as these should
+ # contain profiles generated by devices on start-up.
+ if baseline_profile:
+ expanded_baseline_profile = _get_profile_artifact(ctx, "expanded-static-prof.txt")
+ _expand_wildcards(
+ ctx,
+ output = expanded_baseline_profile,
+ deploy_jar = deploy_jar,
+ profile = baseline_profile,
+ profgen = profgen,
+ toolchain_type = toolchain_type,
+ )
+ baseline_profile = expanded_baseline_profile
+ return struct(
+ baseline_profile = baseline_profile,
+ startup_profile = startup_profile,
+ )
+
+def _process_art_profile(
+ ctx,
+ final_classes_dex,
+ merged_profile,
+ proguard_output_map = None,
+ profgen = None,
+ zipper = None,
+ toolchain_type = None):
+ """ Compiles the merged baseline profile.
Profiles are compiled with profgen into binary ART profiles. The binary
profiles will be bundled into the final APK and used at installation time to speed up app
@@ -27,74 +111,113 @@ def _process(ctx, final_classes_dex, transitive_profiles):
Args:
ctx: The context.
- final_classes_dex: Final classes zip artifact.
- transitive_profiles: Depset of incoming baseline profile files.
-
+ final_classes_dex: File. Final classes zip artifact.
+ merged_profile: File. The merged profile from transitive baseline profile files.
+ proguard_output_map: File. Optional. The proguard output mapping file.
+ profgen: FilesToRunProvider. The profgen executable for profile compilation.
+ zipper: FilesToRunProvider. An executable for compressing files to an archive.
+ toolchain_type: Label or String. Toolchain type of the executable used in actions.
Returns:
Provider info containing BaselineProfileProvider for all merged profiles.
"""
- # TODO(b/256652067) Pass proguard_output_map after AppReduce starlark migration.
- proguard_output_map = None
- merge_args = ctx.actions.args()
- profile_dir = ctx.label.name + "-baseline-profile/"
- merged_profile = ctx.actions.declare_file(profile_dir + "static-prof.txt")
- merge_args.add_all(transitive_profiles, before_each = "--input")
- merge_args.add("--output", merged_profile.path)
- ctx.actions.run(
- mnemonic = "MergeBaselineProfiles",
- executable = get_android_toolchain(ctx).merge_baseline_profiles_tool.files_to_run,
- arguments = [merge_args],
- inputs = transitive_profiles,
- outputs = [merged_profile],
- use_default_shell_env = True,
- toolchain = ANDROID_TOOLCHAIN_TYPE,
- )
-
# Profgen
- output_profile = ctx.actions.declare_file(profile_dir + "baseline.prof")
- output_profile_meta = ctx.actions.declare_file(profile_dir + "baseline.profm")
+ output_profile = _get_profile_artifact(ctx, "baseline.prof")
+ output_profile_meta = _get_profile_artifact(ctx, "baseline.profm")
profgen_inputs = [final_classes_dex, merged_profile]
profgen_args = ctx.actions.args()
profgen_args.add("bin", merged_profile)
- profgen_args.add("--apk", final_classes_dex.path)
- profgen_args.add("--output", output_profile.path)
- profgen_args.add("--output-meta", output_profile_meta.path)
+ profgen_args.add("--apk", final_classes_dex)
+ profgen_args.add("--output", output_profile)
+ profgen_args.add("--output-meta", output_profile_meta)
if proguard_output_map:
- profgen_args.add("--map", proguard_output_map.path)
+ profgen_args.add("--map", proguard_output_map)
profgen_inputs.append(proguard_output_map)
ctx.actions.run(
mnemonic = "GenerateARTProfile",
- executable = get_android_toolchain(ctx).profgen.files_to_run,
+ executable = profgen,
progress_message = "Generating Android P-R ART profile for %{label} APK",
arguments = [profgen_args],
inputs = profgen_inputs,
outputs = [output_profile, output_profile_meta],
use_default_shell_env = True,
- toolchain = ANDROID_TOOLCHAIN_TYPE,
+ toolchain = toolchain_type,
)
# Zip ART profiles
- output_profile_zip = ctx.actions.declare_file(profile_dir + "art_profile.zip")
+ output_profile_zip = _get_profile_artifact(ctx, "art_profile.zip")
zip_args = ctx.actions.args()
zip_args.add("c", output_profile_zip)
zip_args.add(output_profile.path, format = "assets/dexopt/baseline.prof=%s")
zip_args.add(output_profile_meta.path, format = "assets/dexopt/baseline.profm=%s")
ctx.actions.run(
mnemonic = "ZipARTProfiles",
- executable = get_android_toolchain(ctx).zipper.files_to_run,
+ executable = zipper,
progress_message = "Zip ART Profiles for %{label}",
arguments = [zip_args],
inputs = [output_profile, output_profile_meta],
outputs = [output_profile_zip],
use_default_shell_env = True,
- toolchain = ANDROID_TOOLCHAIN_TYPE,
+ toolchain = toolchain_type,
)
return BaselineProfileProvider(
- transitive_profiles,
+ # Unnecessary to pass the transitive profiles to native rule
+ depset(),
output_profile_zip,
)
+def _get_profile_dir(ctx):
+ return ctx.label.name + _BASELINE_PROFILE_DIR_SUFFIX
+
+def _get_profile_artifact(ctx, name):
+ return ctx.actions.declare_file(_get_profile_dir(ctx) + name)
+
+def _merge(
+ ctx,
+ output,
+ inputs = [],
+ mnemonic = "MergeBaselineProfiles",
+ merge_tool = None,
+ toolchain_type = None):
+ args = ctx.actions.args()
+ args.add_all(inputs, before_each = "--input")
+ args.add("--output", output)
+
+ ctx.actions.run(
+ executable = merge_tool,
+ mnemonic = mnemonic,
+ arguments = [args],
+ inputs = inputs,
+ outputs = [output],
+ use_default_shell_env = True,
+ toolchain = toolchain_type,
+ )
+
+def _expand_wildcards(
+ ctx,
+ output,
+ deploy_jar = None,
+ profile = None,
+ profgen = None,
+ toolchain_type = None):
+ args = ctx.actions.args()
+ args.add("expandWildcards", deploy_jar)
+ args.add("--profile", profile)
+ args.add("--output", output)
+
+ ctx.actions.run(
+ executable = profgen,
+ outputs = [output],
+ inputs = [deploy_jar, profile],
+ arguments = [args],
+ mnemonic = "ExpandBaselineProfileWildcards",
+ progress_message = "Expanding baseline profile wildcards for %{label} APK",
+ toolchain = toolchain_type,
+ )
+
baseline_profiles = struct(
+ expand_wildcards = _expand_wildcards,
+ get_profile_artifact = _get_profile_artifact,
process = _process,
+ process_art_profile = _process_art_profile,
)
diff --git a/rules/bundletool.bzl b/rules/bundletool.bzl
index 7988bac..b0651ec 100644
--- a/rules/bundletool.bzl
+++ b/rules/bundletool.bzl
@@ -14,6 +14,11 @@
"""Bazel Bundletool Commands."""
+load(
+ "//rules:utils.bzl",
+ "ANDROID_TOOLCHAIN_TYPE",
+)
+load("@bazel_skylib//lib:paths.bzl", "paths")
load(":common.bzl", _common = "common")
load(":java.bzl", _java = "java")
@@ -83,7 +88,10 @@ def _build_sdk_apks(
debug_key = None,
bundletool = None,
host_javabase = None):
- apks_out = ctx.actions.declare_directory(ctx.label.name + "_sdk_apks")
+ apks_out = ctx.actions.declare_directory(
+ "%s_apks_out" % paths.basename(out.path).replace(".", "_"),
+ sibling = out,
+ )
args = ctx.actions.args()
args.add("build-sdk-apks")
args.add("--aapt2", aapt2.executable.path)
@@ -133,6 +141,7 @@ def _build_sdk_bundle(
ctx,
out = None,
module = None,
+ sdk_api_descriptors = None,
sdk_modules_config = None,
bundletool = None,
host_javabase = None):
@@ -140,6 +149,7 @@ def _build_sdk_bundle(
args.add("build-sdk-bundle")
args.add("--sdk-modules-config", sdk_modules_config)
+ args.add("--sdk-interface-descriptors", sdk_api_descriptors)
args.add("--modules", module)
args.add("--output", out)
_java.run(
@@ -149,6 +159,7 @@ def _build_sdk_bundle(
arguments = [args],
inputs = [
module,
+ sdk_api_descriptors,
sdk_modules_config,
],
outputs = [out],
@@ -172,6 +183,7 @@ def _build_sdk_module(
arguments = [args],
mnemonic = "BuildSdkModule",
progress_message = "Building ASB zip module %s" % out.short_path,
+ toolchain = ANDROID_TOOLCHAIN_TYPE,
)
def _bundle_to_apks(
@@ -267,6 +279,7 @@ echo "$contents" > %s
mnemonic = "ExtractBundleConfig",
progress_message = "Extract bundle config to %s" % out.short_path,
command = cmd,
+ exec_group = "android_and_java",
)
def _extract_manifest(
@@ -302,6 +315,7 @@ echo "$contents" > %s
mnemonic = "ExtractBundleManifest",
progress_message = "Extract bundle manifest to %s" % out.short_path,
command = cmd,
+ exec_group = "android_and_java",
)
def _proto_apk_to_module(
@@ -373,6 +387,7 @@ cd "${OUT_DIR}"
outputs = [out],
mnemonic = "Rebundle",
progress_message = "Rebundle to %s" % out.short_path,
+ toolchain = ANDROID_TOOLCHAIN_TYPE,
)
bundletool = struct(
diff --git a/rules/busybox.bzl b/rules/busybox.bzl
index 0cda726..ce36d52 100644
--- a/rules/busybox.bzl
+++ b/rules/busybox.bzl
@@ -1047,6 +1047,144 @@ def _make_aar(
progress_message = "Generating AAR package for %s" % ctx.label,
)
+def _shrink(
+ ctx,
+ out_apk,
+ out_zip,
+ out_log,
+ out_config = None,
+ resources_zip = None,
+ aapt = None,
+ android_jar = None,
+ r_txt = None,
+ shrunk_jar = None,
+ proguard_mapping = None,
+ debug = True,
+ busybox = None,
+ host_javabase = None):
+ """Shrinks the resource apk by removing the resources unused from the packaged app.
+
+ Args:
+ ctx: The context.
+ out_apk: File. The output shrunk resource ap_ package.
+ out_zip: File. The output shrunk resources file zip.
+ out_log: File. The output shrinker log.
+ out_config: File. The output config for the optimizer.
+ resources_zip: File. The input resources file zip.
+ aapt: FilesToRunProvider. The AAPT executable.
+ android_jar: File. The Android Jar.
+ r_txt: File. The resource IDs outputted by linking resources in text.
+ shrunk_jar: File. The proguarded jar.
+ proguard_mapping: File. The Proguard Mapping file.
+ debug: Boolean. Whether to enable debug mode.
+ busybox: FilesToRunProvider. The ResourceBusyBox executable.
+ host_javabase: Target. The host javabase.
+ """
+
+ args = ctx.actions.args()
+ args.use_param_file("@%s")
+ args.add("--tool", "SHRINK_AAPT2")
+ args.add("--")
+ args.add("--aapt2", aapt.executable)
+ args.add("--androidJar", android_jar)
+ args.add("--resources", resources_zip)
+ args.add("--shrunkJar", shrunk_jar)
+ args.add("--proguardMapping", proguard_mapping)
+ args.add("--rTxt", r_txt)
+ args.add("--shrunkResourceApk", out_apk)
+ args.add("--shrunkResources", out_zip)
+ args.add("--log", out_log)
+ args.add("--useDataBindingAndroidX")
+ if debug:
+ args.add("--debug")
+
+ input_files = [
+ android_jar,
+ resources_zip,
+ shrunk_jar,
+ proguard_mapping,
+ r_txt,
+ ]
+ output_files = [
+ out_apk,
+ out_zip,
+ out_log,
+ ]
+ if out_config:
+ args.add("--resourcesConfigOutput", out_config)
+ output_files.append(out_config)
+
+ _java.run(
+ ctx = ctx,
+ executable = busybox,
+ tools = [aapt],
+ outputs = output_files,
+ inputs = input_files,
+ arguments = [args],
+ mnemonic = "ResourceShrinker",
+ progress_message =
+ "Shrinking resources for " + str(ctx.label),
+ host_javabase = host_javabase,
+ use_default_shell_env = True,
+ )
+
+def _optimize(
+ ctx,
+ out_apk,
+ in_apk,
+ resource_path_shortening_map = None,
+ resource_optimization_config = None,
+ aapt = None,
+ busybox = None,
+ host_javabase = None):
+ """Optimizes the resource apk including resource obfuscation, sparse encoding and path shortening.
+
+ Args:
+ ctx: The context.
+ out_apk: File. The output optimized resource ap_ package.
+ in_apk: File. The resource ap_ package to be optimized.
+ resource_path_shortening_map: File. The output path shortening map. Optional.
+ resource_optimization_config: File. The input optimization config. Optional.
+ aapt: FilesToRunProvider. The AAPT executable.
+ busybox: FilesToRunProvider. The ResourceBusyBox executable.
+ host_javabase: Target. The host javabase.
+ """
+
+ output_files = []
+ input_files = []
+
+ args = ctx.actions.args()
+ args.use_param_file("@%s")
+ args.add("--tool", "AAPT2_OPTIMIZE")
+ args.add("--")
+ args.add("--aapt2", aapt.executable)
+ args.add("--")
+ if resource_path_shortening_map:
+ args.add("--shorten-resource-paths")
+ args.add("--resource-path-shortening-map", resource_path_shortening_map)
+ output_files.append(resource_path_shortening_map)
+ if resource_optimization_config:
+ args.add("--collapse-resource-names")
+ args.add("--resources-config-path", resource_optimization_config)
+ input_files.append(resource_optimization_config)
+ args.add("-o", out_apk)
+ output_files.append(out_apk)
+ args.add(in_apk)
+
+ _java.run(
+ ctx = ctx,
+ host_javabase = host_javabase,
+ executable = busybox,
+ tools = [aapt],
+ arguments = [args],
+ inputs = input_files,
+ outputs = output_files,
+ mnemonic = "Aapt2Optimize",
+ progress_message =
+ "Optimizing Android resources for " + str(ctx.label),
+ use_default_shell_env = True,
+ )
+
busybox = struct(
compile = _compile,
merge_compiled = _merge_compiled,
@@ -1059,6 +1197,8 @@ busybox = struct(
process_databinding = _process_databinding,
generate_binary_r = _generate_binary_r,
make_aar = _make_aar,
+ shrink = _shrink,
+ optimize = _optimize,
# Exposed for testing
mergee_manifests_flag = _mergee_manifests_flag,
diff --git a/rules/desugar.bzl b/rules/desugar.bzl
index 9d4420f..cc54450 100644
--- a/rules/desugar.bzl
+++ b/rules/desugar.bzl
@@ -38,6 +38,8 @@ def _desugar(
"""
args = ctx.actions.args()
+ args.use_param_file("@%s", use_always = True) # Required for workers.
+ args.set_param_file_format("multiline")
args.add("--input", input)
args.add("--output", output)
args.add_all(classpath, before_each = "--classpath_entry")
diff --git a/rules/dex.bzl b/rules/dex.bzl
index d9d9273..4ab7704 100644
--- a/rules/dex.bzl
+++ b/rules/dex.bzl
@@ -14,61 +14,331 @@
"""Bazel Dex Commands."""
-load(":utils.bzl", "ANDROID_TOOLCHAIN_TYPE", "get_android_toolchain", "utils")
-load(":providers.bzl", "StarlarkAndroidDexInfo")
-load("@bazel_skylib//lib:collections.bzl", "collections")
load("//rules:attrs.bzl", _attrs = "attrs")
+load("//rules:common.bzl", _common = "common")
+load("//rules:java.bzl", _java = "java")
+load("@bazel_skylib//lib:collections.bzl", "collections")
+load(":providers.bzl", "StarlarkAndroidDexInfo")
+load(":utils.bzl", "ANDROID_TOOLCHAIN_TYPE", "get_android_toolchain", "utils")
+
+_DEX_MEMORY = 4096
+_DEX_THREADS = 5
_tristate = _attrs.tristate
+def _resource_set_for_monolithic_dexing():
+ return {"cpu": _DEX_THREADS, "memory": _DEX_MEMORY}
+
def _process_incremental_dexing(
ctx,
+ output,
deps = [],
runtime_jars = [],
dexopts = [],
- main_dex_list = [],
+ main_dex_list = None,
min_sdk_version = 0,
+ proguarded_jar = None,
java_info = None,
desugar_dict = {},
+ shuffle_jars = None,
dexbuilder = None,
+ dexbuilder_after_proguard = None,
dexmerger = None,
+ dexsharder = None,
toolchain_type = None):
- classes_dex_zip = _get_dx_artifact(ctx, "classes.dex.zip")
info = _merge_infos(utils.collect_providers(StarlarkAndroidDexInfo, deps))
+ incremental_dexopts = _filter_dexopts(dexopts, ctx.fragments.android.get_dexopts_supported_in_incremental_dexing)
+ inclusion_filter_jar = proguarded_jar
+ if not proguarded_jar:
+ dex_archives_list = info.dex_archives_dict.get("".join(incremental_dexopts), depset()).to_list()
+ dex_archives = _to_dexed_classpath(
+ dex_archives_dict = {d.jar: d.dex for d in dex_archives_list},
+ classpath = _filter(java_info.transitive_runtime_jars.to_list(), excludes = _get_library_r_jars(deps)),
+ runtime_jars = runtime_jars,
+ )
+ for jar in runtime_jars:
+ dex_archive = _get_dx_artifact(ctx, jar.basename + ".dex.zip")
+ _dex(
+ ctx,
+ input = desugar_dict[jar] if jar in desugar_dict else jar,
+ output = dex_archive,
+ incremental_dexopts = incremental_dexopts,
+ min_sdk_version = min_sdk_version,
+ dex_exec = dexbuilder,
+ toolchain_type = toolchain_type,
+ )
+ dex_archives.append(dex_archive)
+ else:
+ java_resource_jar = ctx.actions.declare_file(ctx.label.name + "_files/java_resources.jar")
+ if ctx.fragments.android.incremental_dexing_shards_after_proguard > 1:
+ dex_archives = _shard_proguarded_jar_and_dex(
+ ctx,
+ java_resource_jar = java_resource_jar,
+ num_shards = ctx.fragments.android.incremental_dexing_shards_after_proguard,
+ dexopts = incremental_dexopts,
+ proguarded_jar = proguarded_jar,
+ main_dex_list = main_dex_list,
+ min_sdk_version = min_sdk_version,
+ shuffle_jars = shuffle_jars,
+ dexbuilder_after_proguard = dexbuilder_after_proguard,
+ toolchain_type = toolchain_type,
+ )
+ inclusion_filter_jar = None
+ else:
+ # No need to shuffle if there is only one shard
+ dex_archive = _get_dx_artifact(ctx, "classes.jar")
+ _dex(
+ ctx,
+ input = proguarded_jar,
+ output = dex_archive,
+ incremental_dexopts = incremental_dexopts,
+ min_sdk_version = min_sdk_version,
+ dex_exec = dexbuilder_after_proguard,
+ toolchain_type = toolchain_type,
+ )
+ dex_archives = [dex_archive]
+
+ if len(dex_archives) == 1:
+ _dex_merge(
+ ctx,
+ output = output,
+ inputs = dex_archives,
+ multidex_strategy = "minimal",
+ main_dex_list = main_dex_list,
+ dexopts = _filter_dexopts(dexopts, ctx.fragments.android.get_dexopts_supported_in_dex_merger),
+ dexmerger = dexmerger,
+ toolchain_type = toolchain_type,
+ )
+ else:
+ shards = ctx.actions.declare_directory("dexsplits/" + ctx.label.name)
+ dexes = ctx.actions.declare_directory("dexfiles/" + ctx.label.name)
+ _shard_dexes(
+ ctx,
+ output = shards,
+ inputs = dex_archives,
+ dexopts = _filter_dexopts(dexopts, ctx.fragments.android.get_dexopts_supported_in_dex_sharder),
+ main_dex_list = main_dex_list,
+ inclusion_filter_jar = inclusion_filter_jar,
+ dexsharder = dexsharder,
+ toolchain_type = toolchain_type,
+ )
+
+ # TODO(b/130571505): Implement this after SpawnActionTemplate is supported in Starlark
+ android_common.create_dex_merger_actions(
+ ctx,
+ output = dexes,
+ input = shards,
+ dexopts = dexopts,
+ dexmerger = dexmerger,
+ )
+ _java.singlejar(
+ ctx,
+ output = output,
+ inputs = [dexes],
+ mnemonic = "MergeDexZips",
+ progress_message = "Merging dex shards for %s." % ctx.label,
+ java_toolchain = _common.get_java_toolchain(ctx),
+ )
+
+def _process_optimized_dexing(
+ ctx,
+ output,
+ input = None,
+ proguard_output_map = None,
+ postprocessing_output_map = None,
+ dexopts = [],
+ native_multidex = True,
+ min_sdk_version = 0,
+ main_dex_list = None,
+ library_jar = None,
+ startup_profile = None,
+ optimizing_dexer = None,
+ toolchain_type = None):
+ inputs = [input]
+ outputs = [output]
+
+ args = ctx.actions.args()
+ args.add(input)
+ args.add("--release")
+ args.add("--no-desugaring")
+ args.add("--output", output)
+ args.add_all(dexopts)
+
+ if proguard_output_map:
+ args.add("--pg-map", proguard_output_map)
+ args.add("--pg-map-output", postprocessing_output_map)
+ inputs.append(proguard_output_map)
+ outputs.append(postprocessing_output_map)
+
+ if startup_profile and native_multidex:
+ args.add("--startup-profile", startup_profile)
+ inputs.append(startup_profile)
+
+ # TODO(b/261110876): Pass min SDK through here based on the value in the merged manifest. The
+ # current value is statically defined for the entire depot.
+ # We currently set the minimum SDK version to 21 if you are doing native multidex as that is
+ # required for native multidex to work in the first place and as a result is required for
+ # correct behavior from the dexer.
+ sdk = max(min_sdk_version, 21) if native_multidex else min_sdk_version
+ if sdk != 0:
+ args.add("--min-api", sdk)
+ if main_dex_list:
+ args.add("--main-dex-list", main_dex_list)
+ inputs.append(main_dex_list)
+ if library_jar:
+ args.add("--lib", library_jar)
+ inputs.append(library_jar)
+
+ ctx.actions.run(
+ outputs = outputs,
+ executable = optimizing_dexer,
+ inputs = inputs,
+ arguments = [args],
+ mnemonic = "OptimizingDex",
+ progress_message = "Optimized dexing for " + str(ctx.label),
+ use_default_shell_env = True,
+ toolchain = toolchain_type,
+ )
+
+def _process_monolithic_dexing(
+ ctx,
+ output,
+ input,
+ dexopts = [],
+ min_sdk_version = 0,
+ main_dex_list = None,
+ dexbuilder = None,
+ toolchain_type = None):
+ # Create an artifact for the intermediate zip output generated by AndroidDexer that includes
+ # non-.dex files. A subsequent TrimDexZip action will filter out all non-.dex files.
+ classes_dex_intermediate = _get_dx_artifact(ctx, "intermediate_classes.dex.zip")
+ inputs = [input]
+
+ args = ctx.actions.args()
+ args.add("--dex")
+ args.add_all(dexopts)
+ if min_sdk_version > 0:
+ args.add("--min_sdk_version", min_sdk_version)
+ args.add("--multi-dex")
+ if main_dex_list:
+ args.add(main_dex_list, format = "--main-dex-list=%s")
+ inputs.append(main_dex_list)
+ args.add(classes_dex_intermediate, format = "--output=%s")
+ args.add(input)
+
+ ctx.actions.run(
+ executable = dexbuilder,
+ inputs = inputs,
+ outputs = [classes_dex_intermediate],
+ arguments = [args],
+ progress_message = "Converting %s to dex format" % input.short_path,
+ mnemonic = "AndroidDexer",
+ use_default_shell_env = True,
+ resource_set = _resource_set_for_monolithic_dexing,
+ toolchain = toolchain_type,
+ )
+
+ # Because the dexer also places resources into this zip, we also need to create a cleanup
+ # action that removes all non-.dex files before staging for apk building.
+ _java.singlejar(
+ ctx,
+ inputs = [classes_dex_intermediate],
+ output = output,
+ include_prefixes = ["classes"],
+ java_toolchain = _common.get_java_toolchain(ctx),
+ mnemonic = "TrimDexZip",
+ progress_message = "Trimming %s." % classes_dex_intermediate.short_path,
+ )
+
+def _shard_proguarded_jar_and_dex(
+ ctx,
+ java_resource_jar,
+ num_shards = 50,
+ dexopts = [],
+ proguarded_jar = None,
+ main_dex_list = None,
+ min_sdk_version = 0,
+ shuffle_jars = None,
+ dexbuilder_after_proguard = None,
+ toolchain_type = None):
+ if num_shards <= 1:
+ fail("num_shards expects to be larger than 1.")
+
+ shards = _make_shard_artifacts(ctx, num_shards, ".jar.dex.zip")
+ shuffle_outputs = _make_shard_artifacts(ctx, num_shards, ".jar")
+ inputs = []
+ args = ctx.actions.args()
+ args.add_all(shuffle_outputs, before_each = "--output_jar")
+ args.add("--output_resources", java_resource_jar)
- incremental_dexopts = _incremental_dexopts(dexopts, ctx.fragments.android.get_dexopts_supported_in_incremental_dexing)
- dex_archives_list = info.dex_archives_dict.get("".join(incremental_dexopts), depset()).to_list()
- dex_archives = _to_dexed_classpath(
- dex_archives_dict = {d.jar: d.dex for d in dex_archives_list},
- classpath = _filter(java_info.transitive_runtime_jars.to_list(), excludes = _get_library_r_jars(deps)),
- runtime_jars = runtime_jars,
+ if main_dex_list:
+ args.add("--main_dex_filter", main_dex_list)
+ inputs.append(main_dex_list)
+
+ # If we need to run Proguard, all the class files will be in the Proguarded jar, which has to
+ # be converted to dex.
+ args.add("--input_jar", proguarded_jar)
+ inputs.append(proguarded_jar)
+
+ ctx.actions.run(
+ executable = shuffle_jars,
+ outputs = shuffle_outputs + [java_resource_jar],
+ inputs = inputs,
+ arguments = [args],
+ mnemonic = "ShardClassesToDex",
+ progress_message = "Sharding classes for dexing for " + str(ctx.label),
+ use_default_shell_env = True,
+ toolchain = toolchain_type,
)
- for jar in runtime_jars:
- dex_archive = _get_dx_artifact(ctx, jar.basename + ".dex.zip")
+ for i in range(len(shards)):
_dex(
ctx,
- input = desugar_dict[jar] if jar in desugar_dict else jar,
- output = dex_archive,
- incremental_dexopts = incremental_dexopts,
+ input = shuffle_outputs[i],
+ output = shards[i],
+ incremental_dexopts = dexopts,
min_sdk_version = min_sdk_version,
- dex_exec = dexbuilder,
+ dex_exec = dexbuilder_after_proguard,
toolchain_type = toolchain_type,
)
- dex_archives.append(dex_archive)
+ return shards
+
+def _make_shard_artifacts(ctx, n, suffix):
+ return [_get_dx_artifact(ctx, "shard" + str(i) + suffix) for i in range(1, n + 1)]
- _dex_merge(
+def _shard_dexes(
ctx,
- output = classes_dex_zip,
- inputs = dex_archives,
- multidex_strategy = "minimal",
- main_dex_list = main_dex_list,
- dexopts = dexopts,
- dexmerger = dexmerger,
- toolchain_type = toolchain_type,
+ output,
+ inputs = [],
+ dexopts = [],
+ main_dex_list = None,
+ inclusion_filter_jar = None,
+ dexsharder = None,
+ toolchain_type = None):
+ args = ctx.actions.args().use_param_file(param_file_arg = "@%s")
+ args.add_all(inputs, before_each = "--input")
+ args.add("--output", output.path)
+ if main_dex_list:
+ inputs.append(main_dex_list)
+ args.add("--main-dex-list", main_dex_list)
+ if inclusion_filter_jar:
+ inputs.append(inclusion_filter_jar)
+ args.add("--inclusion_filter_jar", inclusion_filter_jar)
+
+ args.add_all(dexopts)
+
+ ctx.actions.run(
+ executable = dexsharder,
+ outputs = [output],
+ inputs = inputs,
+ arguments = [args],
+ mnemonic = "ShardsForMultiDex",
+ progress_message = "Assembling dex files for " + ctx.label.name,
+ use_default_shell_env = True,
+ toolchain = toolchain_type,
)
- return classes_dex_zip
+ return output
def _append_java8_legacy_dex(
ctx,
@@ -225,11 +495,11 @@ def _dex_merge(
args.add("--multidex", multidex_strategy)
args.add_all(inputs, before_each = "--input")
args.add("--output", output)
- args.add_all(_merger_dexopts(dexopts, ctx.fragments.android.get_dexopts_supported_in_dex_merger))
+ args.add_all(dexopts)
if main_dex_list:
inputs.append(main_dex_list)
- args.add("-main_dex_list", main_dex_list)
+ args.add("--main-dex-list", main_dex_list)
ctx.actions.run(
executable = dexmerger,
@@ -241,12 +511,6 @@ def _dex_merge(
toolchain = toolchain_type,
)
-def _merger_dexopts(tokenized_dexopts, dexopts_supported_in_dex_merger):
- return _normalize_dexopts(_filter(tokenized_dexopts, includes = dexopts_supported_in_dex_merger))
-
-def _incremental_dexopts(tokenized_dexopts, dexopts_supported_in_incremental_dexing):
- return _normalize_dexopts(_filter(tokenized_dexopts, includes = dexopts_supported_in_incremental_dexing))
-
def _merge_infos(infos):
dex_archives_dict = {}
for info in infos:
@@ -260,6 +524,9 @@ def _merge_infos(infos):
{dexopts: depset(direct = [], transitive = dex_archives) for dexopts, dex_archives in dex_archives_dict.items()},
)
+def _filter_dexopts(tokenized_dexopts, includes):
+ return _normalize_dexopts(_filter(tokenized_dexopts, includes = includes))
+
def _filter(candidates, includes = [], excludes = []):
if excludes and includes:
fail("Only one of excludes list and includes list can be set.")
@@ -275,15 +542,133 @@ def _normalize_dexopts(tokenized_dexopts):
return collections.uniq(sorted([_dx_to_dexbuilder(token) for token in tokenized_dexopts]))
+def _generate_main_dex_list(
+ ctx,
+ jar,
+ android_jar = None,
+ desugar_java8_libs = True,
+ main_dex_classes = None,
+ main_dex_list_opts = [],
+ main_dex_proguard_spec = None,
+ proguard_specs = [],
+ legacy_apis = [],
+ shrinked_android_jar = None,
+ toolchain_type = None,
+ main_dex_list_creator = None,
+ legacy_main_dex_list_generator = None,
+ proguard_tool = None):
+ main_dex_list = _get_dx_artifact(ctx, "main_dex_list.txt")
+ if not proguard_specs:
+ proguard_specs.append(main_dex_classes)
+ if main_dex_proguard_spec:
+ proguard_specs.append(main_dex_proguard_spec)
+
+ # If legacy_main_dex_list_generator is not set by either the SDK or the flag, use ProGuard and
+ # the main dext list creator specified by the android_sdk rule. If
+ # legacy_main_dex_list_generator is provided, use that tool instead.
+ # TODO(b/147692286): Remove the old main-dex list generation that relied on ProGuard.
+ if not legacy_main_dex_list_generator:
+ if not shrinked_android_jar:
+ fail("In \"legacy\" multidex mode, either legacy_main_dex_list_generator or " +
+ "shrinked_android_jar must be set in the android_sdk.")
+
+ # Process the input jar through Proguard into an intermediate, streamlined jar.
+ stripped_jar = _get_dx_artifact(ctx, "main_dex_intermediate.jar")
+ args = ctx.actions.args()
+ args.add("-forceprocessing")
+ args.add("-injars", jar)
+ args.add("-libraryjars", shrinked_android_jar)
+ args.add("-outjars", stripped_jar)
+ args.add("-dontwarn")
+ args.add("-dontnote")
+ args.add("-dontoptimize")
+ args.add("-dontobfuscate")
+ ctx.actions.run(
+ outputs = [stripped_jar],
+ executable = proguard_tool,
+ args = [args],
+ inputs = [jar, shrinked_android_jar],
+ mnemonic = "MainDexClassesIntermediate",
+ progress_message = "Generating streamlined input jar for main dex classes list",
+ use_default_shell_dev = True,
+ toolchain = toolchain_type,
+ )
+
+ args = ctx.actions.args()
+ args.add_all([main_dex_list, stripped_jar, jar])
+ args.add_all(main_dex_list_opts)
+
+ ctx.actions.run(
+ outputs = [main_dex_list],
+ executable = main_dex_list_creator,
+ arguments = [args],
+ inputs = [jar, stripped_jar],
+ mnemonic = "MainDexClasses",
+ progress_message = "Generating main dex classes list",
+ toolchain = toolchain_type,
+ )
+ else:
+ inputs = [jar, android_jar] + proguard_specs
+
+ args = ctx.actions.args()
+ args.add("--main-dex-list-output", main_dex_list)
+ args.add("--lib", android_jar)
+ if desugar_java8_libs:
+ args.add_all(legacy_apis, before_each = "--lib")
+ inputs += legacy_apis
+ args.add_all(proguard_specs, before_each = "--main-dex-rules")
+ args.add(jar)
+ ctx.actions.run(
+ executable = legacy_main_dex_list_generator,
+ arguments = [args],
+ outputs = [main_dex_list],
+ inputs = inputs,
+ mnemonic = "MainDexClasses",
+ progress_message = "Generating main dex classes list",
+ toolchain = toolchain_type,
+ )
+ return main_dex_list
+
+def _transform_dex_list_through_proguard_map(
+ ctx,
+ proguard_output_map = None,
+ main_dex_list = None,
+ toolchain_type = None,
+ dex_list_obfuscator = None):
+ if not proguard_output_map:
+ return main_dex_list
+
+ obfuscated_main_dex_list = _get_dx_artifact(ctx, "main_dex_list_obfuscated.txt")
+
+ args = ctx.actions.args()
+ args.add("--input", main_dex_list)
+ args.add("--output", obfuscated_main_dex_list)
+ args.add("--obfuscation_map", proguard_output_map)
+ ctx.actions.run(
+ executable = dex_list_obfuscator,
+ arguments = [args],
+ outputs = [obfuscated_main_dex_list],
+ inputs = [main_dex_list],
+ mnemonic = "MainDexProguardClasses",
+ progress_message = "Obfuscating main dex classes list",
+ toolchain = toolchain_type,
+ )
+
+ return obfuscated_main_dex_list
+
dex = struct(
append_java8_legacy_dex = _append_java8_legacy_dex,
dex = _dex,
dex_merge = _dex_merge,
+ generate_main_dex_list = _generate_main_dex_list,
get_dx_artifact = _get_dx_artifact,
get_effective_incremental_dexing = _get_effective_incremental_dexing,
get_java8_legacy_dex_and_map = _get_java8_legacy_dex_and_map,
- incremental_dexopts = _incremental_dexopts,
+ filter_dexopts = _filter_dexopts,
merge_infos = _merge_infos,
normalize_dexopts = _normalize_dexopts,
+ process_monolithic_dexing = _process_monolithic_dexing,
process_incremental_dexing = _process_incremental_dexing,
+ process_optimized_dexing = _process_optimized_dexing,
+ transform_dex_list_through_proguard_map = _transform_dex_list_through_proguard_map,
)
diff --git a/rules/dex_desugar_aspect.bzl b/rules/dex_desugar_aspect.bzl
index a360764..9d692d3 100644
--- a/rules/dex_desugar_aspect.bzl
+++ b/rules/dex_desugar_aspect.bzl
@@ -69,11 +69,8 @@ def _aspect_impl(target, ctx):
if not acls.in_android_binary_starlark_dex_desugar_proguard(str(ctx.label)):
return []
- min_sdk_version = getattr(ctx.rule.attr, "min_sdk_version", 0)
- if min_sdk_version != 0 and not acls.in_android_binary_min_sdk_version_attribute(str(ctx)):
- fail("Target is not allowed to set a min_sdk_version value.")
-
incremental_dexing = getattr(ctx.rule.attr, "incremental_dexing", _tristate.auto)
+ min_sdk_version = getattr(ctx.rule.attr, "min_sdk_version", 0)
if incremental_dexing == _tristate.no or \
(not ctx.fragments.android.use_incremental_dexing and
diff --git a/rules/flags/BUILD b/rules/flags/BUILD
index cf2b61a..f113f07 100644
--- a/rules/flags/BUILD
+++ b/rules/flags/BUILD
@@ -20,7 +20,7 @@ bzl_library(
string_flag(
name = "runfiles_root_prefix",
- build_setting_default = "",
+ build_setting_default = "rules_android/",
visibility = ["//visibility:public"],
)
diff --git a/rules/java.bzl b/rules/java.bzl
index 57c343a..5eb74b0 100644
--- a/rules/java.bzl
+++ b/rules/java.bzl
@@ -363,15 +363,18 @@ def _singlejar(
mnemonic = "SingleJar",
progress_message = "Merge into a single jar.",
build_target = "",
- deploy_manifest_lines = [],
check_desugar_deps = False,
+ compression = True,
+ deploy_manifest_lines = [],
include_build_data = False,
+ include_prefixes = [],
java_toolchain = None,
resource_set = None):
args = ctx.actions.args()
args.add("--output")
args.add(output)
- args.add("--compression")
+ if compression:
+ args.add("--compression")
args.add("--normalize")
if not include_build_data:
args.add("--exclude_build_data")
@@ -386,6 +389,8 @@ def _singlejar(
args.add("--check_desugar_deps")
if deploy_manifest_lines:
args.add_all("--deploy_manifest_lines", deploy_manifest_lines)
+ if include_prefixes:
+ args.add_all("--include_prefixes", include_prefixes)
args.use_param_file("@%s")
args.set_param_file_format("multiline")
@@ -465,8 +470,9 @@ def _create_deploy_jar(
progress_message = "Building deploy jar %s" % output.short_path,
java_toolchain = java_toolchain,
build_target = build_target,
- deploy_manifest_lines = deploy_manifest_lines,
check_desugar_deps = True,
+ compression = False,
+ deploy_manifest_lines = deploy_manifest_lines,
resource_set = _resource_set_for_deploy_jar,
)
return output
diff --git a/rules/native_deps.bzl b/rules/native_deps.bzl
index 53d61ec..d503389 100644
--- a/rules/native_deps.bzl
+++ b/rules/native_deps.bzl
@@ -55,13 +55,15 @@ def _get_libs_dir_name(android_config, target_platform):
name = name + "-hwasan"
return name
-def process(ctx, filename):
+def process(ctx, filename, merged_native_libs = {}):
""" Links native deps into a shared library
Args:
ctx: The context.
filename: String. The name of the artifact containing the name of the
linked shared library
+ merged_native_libs: A dict that maps cpu to merged native libraries. This maps to empty
+ lists if native library merging is not enabled.
Returns:
Tuple of (libs, libs_name) where libs is a depset of all native deps
@@ -95,13 +97,15 @@ def process(ctx, filename):
),
)
libraries = []
+ if merged_native_libs:
+ libraries.extend(merged_native_libs[key])
native_deps_lib = _link_native_deps_if_present(ctx, cc_info, cc_toolchain, build_config, actual_target_name)
if native_deps_lib:
libraries.append(native_deps_lib)
native_libs_basename = native_deps_lib.basename
- libraries.extend(_filter_unique_shared_libs(native_deps_lib, cc_info))
+ libraries.extend(_filter_unique_shared_libs(libraries, cc_info))
if libraries:
libs[libs_dir_name] = depset(libraries)
@@ -133,11 +137,18 @@ def _all_inputs(cc_info):
for lib in input.libraries
]
-def _filter_unique_shared_libs(linked_lib, cc_info):
+def _filter_unique_shared_libs(linked_libs, cc_info):
basenames = {}
artifacts = {}
- if linked_lib:
- basenames[linked_lib.basename] = linked_lib
+ if linked_libs:
+ basenames = {
+ linked_lib.basename: linked_lib
+ for linked_lib in linked_libs
+ }
+ artifacts = {
+ linked_lib: None
+ for linked_lib in linked_libs
+ }
for input in _all_inputs(cc_info):
if input.pic_static_library or input.static_library:
# This is not a shared library and will not be loaded by Android, so skip it.
@@ -169,7 +180,7 @@ def _filter_unique_shared_libs(linked_lib, cc_info):
"unique basename to avoid name collisions when packaged into " +
"an apk, but two libraries have the basename '" + basename +
"': " + artifact + " and " + old_artifact + (
- " (the library compiled for this target)" if old_artifact == linked_lib else ""
+ " (the library already seen by this target)" if old_artifact in linked_libs else ""
),
)
else:
diff --git a/rules/proguard.bzl b/rules/proguard.bzl
index 6273c5c..d5caabb 100644
--- a/rules/proguard.bzl
+++ b/rules/proguard.bzl
@@ -15,6 +15,7 @@
"""Bazel Android Proguard library for the Android rules."""
load(":android_neverlink_aspect.bzl", "StarlarkAndroidNeverlinkInfo")
+load(":baseline_profiles.bzl", _baseline_profiles = "baseline_profiles")
load(":common.bzl", "common")
load(":java.bzl", "java")
load(":utils.bzl", "ANDROID_TOOLCHAIN_TYPE", "get_android_sdk", "utils")
@@ -41,6 +42,8 @@ _ProguardOutputInfo = provider(
usage = "Output usage",
library_jar = "Merged library jar",
config = "Output config",
+ baseline_profile_rewritten = "Optimized baseline profile",
+ startup_profile_rewritten = "Optimized startup profile",
),
)
@@ -194,6 +197,10 @@ def _optimization_action(
proguard_seeds = None,
proguard_usage = None,
proguard_config_output = None,
+ startup_profile = None,
+ startup_profile_rewritten = None,
+ baseline_profile = None,
+ baseline_profile_rewritten = None,
runtype = None,
last_stage_output = None,
next_stage_output = None,
@@ -225,8 +232,12 @@ def _optimization_action(
classes and members which match a keep rule.
proguard_usage: File. Optional file used to write all classes and members that are removed
during shrinking (i.e. unused code).
- proguard_config_output:File. Optional file used to write the entire configuration that has
+ proguard_config_output: File. Optional file used to write the entire configuration that has
been parsed, included files and replaced variables. Useful for debugging.
+ startup_profile: File. Optional. The merged startup profile to be optimized.
+ startup_profile_rewritten: File. Optional file used to write the optimized startup profile.
+ baseline_profile: File. Optional. The merged baseline profile to be optimized.
+ baseline_profile_rewritten: File. Optional file used to write the optimized profile rules.
runtype: String. Optional string identifying this run. One of [INITIAL, OPTIMIZATION, FINAL]
last_stage_output: File. Optional input file to this optimization stage, which was output by
the previous optimization stage.
@@ -281,6 +292,22 @@ def _optimization_action(
args.add("-printconfiguration", proguard_config_output)
outputs.append(proguard_config_output)
+ if startup_profile:
+ args.add("-startupprofile", startup_profile)
+ inputs.append(startup_profile)
+
+ if startup_profile_rewritten:
+ args.add("-printstartupprofile", startup_profile)
+ outputs.append(startup_profile_rewritten)
+
+ if baseline_profile:
+ args.add("-baselineprofile", baseline_profile)
+ inputs.append(baseline_profile)
+
+ if baseline_profile_rewritten:
+ args.add("-printbaselineprofile", baseline_profile_rewritten)
+ outputs.append(baseline_profile_rewritten)
+
if runtype:
args.add("-runtype " + runtype)
@@ -322,6 +349,8 @@ def _apply_proguard(
proguard_output_map = None,
proguard_seeds = None,
proguard_usage = None,
+ startup_profile = None,
+ baseline_profile = None,
proguard_tool = None):
"""Top-level method to apply proguard to a jar.
@@ -335,6 +364,8 @@ def _apply_proguard(
proguard_output_map: File. The output proguard map.
proguard_seeds: File. The output proguard seeds.
proguard_usage: File. The output proguard usage.
+ startup_profile: File. The input merged startup profile to be optimized.
+ baseline_profile: File. The input merged baseline profile to be optimized.
proguard_tool: FilesToRun. The proguard executable.
Returns:
@@ -370,6 +401,8 @@ def _apply_proguard(
proguard_output_map,
input_jar,
library_jars,
+ startup_profile,
+ baseline_profile,
proguard_tool,
)
@@ -379,7 +412,9 @@ def _get_proguard_output(
proguard_seeds,
proguard_usage,
proguard_output_map,
- combined_library_jar):
+ combined_library_jar,
+ startup_profile_rewritten,
+ baseline_profile_rewritten):
"""Helper method to get a struct of all proguard outputs."""
config_output = _get_proguard_temp_artifact(ctx, "_proguard.config")
@@ -390,6 +425,8 @@ def _get_proguard_output(
usage = proguard_usage,
library_jar = combined_library_jar,
config = config_output,
+ startup_profile_rewritten = startup_profile_rewritten,
+ baseline_profile_rewritten = baseline_profile_rewritten,
)
def _create_optimization_actions(
@@ -403,6 +440,8 @@ def _create_optimization_actions(
proguard_output_map = None,
input_jar = None,
library_jars = depset(),
+ startup_profile = None,
+ baseline_profile = None,
proguard_tool = None):
"""Helper method to create all optimizaction actions based on the target configuration."""
if not proguard_specs:
@@ -426,6 +465,13 @@ def _create_optimization_actions(
filter_zips = [input_jar],
)
+ startup_profile_rewritten = None
+ baseline_profile_rewritten = None
+ if startup_profile:
+ startup_profile_rewritten = _baseline_profiles.get_profile_artifact(ctx, "rewritten-startup-prof.txt")
+ if baseline_profile and startup_profile:
+ baseline_profile_rewritten = _baseline_profiles.get_profile_artifact(ctx, "rewritten-merged-prof.txt")
+
outputs = _get_proguard_output(
ctx,
proguard_output_jar,
@@ -433,6 +479,8 @@ def _create_optimization_actions(
proguard_usage,
proguard_output_map,
combined_library_jar,
+ startup_profile_rewritten,
+ baseline_profile_rewritten,
)
# TODO(timpeut): Validate that optimizer target selection is correct
@@ -452,6 +500,10 @@ def _create_optimization_actions(
proguard_seeds = outputs.seeds,
proguard_usage = outputs.usage,
proguard_config_output = outputs.config,
+ startup_profile = startup_profile,
+ startup_profile_rewritten = outputs.startup_profile_rewritten,
+ baseline_profile = baseline_profile,
+ baseline_profile_rewritten = outputs.baseline_profile_rewritten,
final = True,
mnemonic = mnemonic,
progress_message = "Trimming binary with %s: %s" % (mnemonic, ctx.label),
@@ -474,6 +526,10 @@ def _create_optimization_actions(
proguard_seeds = outputs.seeds,
proguard_usage = None,
proguard_config_output = None,
+ startup_profile = startup_profile,
+ startup_profile_rewritten = None,
+ baseline_profile = baseline_profile,
+ baseline_profile_rewritten = None,
final = False,
runtype = "INITIAL",
next_stage_output = last_stage_output,
@@ -536,6 +592,10 @@ def _create_optimization_actions(
proguard_seeds = None,
proguard_usage = outputs.usage,
proguard_config_output = outputs.config,
+ startup_profile = None,
+ startup_profile_rewritten = outputs.startup_profile_rewritten,
+ baseline_profile = None,
+ baseline_profile_rewritten = outputs.baseline_profile_rewritten,
final = True,
runtype = "FINAL",
last_stage_output = last_stage_output,
@@ -575,9 +635,30 @@ def _create_single_optimization_action(
)
return next_stage_output
+def _merge_proguard_maps(
+ ctx,
+ output,
+ inputs = [],
+ proguard_maps_merger = None,
+ toolchain_type = None):
+ args = ctx.actions.args()
+ args.add_all(inputs, before_each = "--pg-map")
+ args.add("--pg-map-output", output)
+
+ ctx.actions.run(
+ outputs = [output],
+ executable = proguard_maps_merger,
+ inputs = inputs,
+ arguments = [args],
+ mnemonic = "MergeProguardMaps",
+ progress_message = "Merging app and desugared library Proguard maps for %s" % ctx.label,
+ use_default_shell_env = True,
+ toolchain = toolchain_type,
+ )
+
def _fail_action(ctx, *outputs):
ctx.actions.run_shell(
- outputs = outputs,
+ outputs = [output for output in outputs if output != None],
command = "echo \"Unable to run proguard without `proguard_specs`\"; exit 1;",
)
@@ -589,6 +670,7 @@ proguard = struct(
get_proguard_specs = _get_proguard_specs,
get_proguard_temp_artifact = _get_proguard_temp_artifact,
get_proguard_temp_artifact_with_prefix = _get_proguard_temp_artifact_with_prefix,
+ merge_proguard_maps = _merge_proguard_maps,
)
testing = struct(
diff --git a/rules/resources.bzl b/rules/resources.bzl
index aec519f..ba163a2 100644
--- a/rules/resources.bzl
+++ b/rules/resources.bzl
@@ -14,6 +14,7 @@
"""Bazel Android Resources."""
+load("//rules:acls.bzl", "acls")
load(":attrs.bzl", _attrs = "attrs")
load(":busybox.bzl", _busybox = "busybox")
load(":common.bzl", _common = "common")
@@ -30,7 +31,6 @@ load(
_compilation_mode = "compilation_mode",
_log = "log",
)
-load("//rules:acls.bzl", "acls")
# Depot-wide min SDK floor
_DEPOT_MIN_SDK_FLOOR = 14
@@ -72,12 +72,14 @@ _INCORRECT_RESOURCE_LAYOUT_ERROR = (
# Keys for manifest_values
_VERSION_NAME = "versionName"
_VERSION_CODE = "versionCode"
+_MIN_SDK_VERSION = "minSdkVersion"
# Resources context attributes.
_ASSETS_PROVIDER = "assets_provider"
_DATA_BINDING_LAYOUT_INFO = "data_binding_layout_info"
_DEFINES_RESOURCES = "defines_resources"
_DIRECT_ANDROID_RESOURCES = "direct_android_resources"
+_MAIN_DEX_PROGUARD_CONFIG = "main_dex_proguard_config"
_MERGED_MANIFEST = "merged_manifest"
_PROVIDERS = "providers"
_R_JAVA = "r_java"
@@ -117,6 +119,7 @@ _PACKAGED_FINAL_MANIFEST = "processed_manifest"
_PACKAGED_RESOURCE_APK = "resources_apk"
_PACKAGED_CLASS_JAR = "class_jar"
_PACKAGED_VALIDATION_RESULT = "validation_result"
+_PACKAGED_R_TXT = "r_txt"
_RESOURCE_MINSDK_PROGUARD_CONFIG = "resource_minsdk_proguard_config"
_RESOURCE_PROGUARD_CONFIG = "resource_proguard_config"
_ANDROID_APPLICATION_RESOURCE = "android_application_resource"
@@ -128,10 +131,12 @@ _ResourcesPackageContextInfo = provider(
_PACKAGED_RESOURCE_APK: "ResourceApk.",
_PACKAGED_CLASS_JAR: "R class jar.",
_PACKAGED_VALIDATION_RESULT: "Validation result.",
+ _PACKAGED_R_TXT: "R text file",
_R_JAVA: "JavaInfo for R.jar",
_DATA_BINDING_LAYOUT_INFO: "Databinding layout info file.",
_RESOURCE_MINSDK_PROGUARD_CONFIG: "Resource minSdkVersion proguard config",
_RESOURCE_PROGUARD_CONFIG: "Resource proguard config",
+ _MAIN_DEX_PROGUARD_CONFIG: "Main dex proguard config",
_PROVIDERS: "The list of all providers to propagate.",
_ANDROID_APPLICATION_RESOURCE: "The AndroidApplicationResourceInfo provider.",
},
@@ -139,11 +144,13 @@ _ResourcesPackageContextInfo = provider(
# Manifest context attributes
_PROCESSED_MANIFEST = "processed_manifest"
+_PROCESSED_MANIFEST_VALUES = "processed_manifest_values"
_ManifestContextInfo = provider(
"Manifest context object",
fields = {
_PROCESSED_MANIFEST: "The manifest after the min SDK has been changed as necessary.",
+ _PROCESSED_MANIFEST_VALUES: "Optional, dict of manifest values that have been processed.",
},
)
@@ -154,6 +161,36 @@ _ManifestValidationContextInfo = provider(
},
)
+_SHRUNK_RESOURCE_APK = "resources_apk"
+_SHRUNK_RESOURCE_ZIP = "resources_zip"
+_RESOURCE_SHRINKER_LOG = "shrinker_log"
+_RESOURCE_OPTIMIZATION_CONFIG = "optimization_config"
+
+_ResourcesShrinkContextInfo = provider(
+ "Shrunk resources context object",
+ fields = {
+ _SHRUNK_RESOURCE_APK: "Shrunk resource apk.",
+ _SHRUNK_RESOURCE_ZIP: "Shrunk resource zip.",
+ _RESOURCE_SHRINKER_LOG: "Shrinker log.",
+ _RESOURCE_OPTIMIZATION_CONFIG: "Resource optimization config.",
+ },
+)
+
+_RESOURCE_PATH_SHORTENING_MAP = "path_shortening_map"
+_OPTIMIZED_RESOURCE_APK = "resources_apk"
+
+_ResourcesOptimizeContextInfo = provider(
+ "Optimized resources context object",
+ fields = {
+ _OPTIMIZED_RESOURCE_APK: "Optimized resource apk",
+ _RESOURCE_PATH_SHORTENING_MAP: "Path shortening map.",
+ },
+)
+
+# Feature which would enable AAPT2's resource name obfuscation optimization for android_binary
+# rules with resource shrinking and ProGuard enabled.
+_FEATURE_RESOURCE_NAME_OBFUSCATION = "resource_name_obfuscation"
+
def _generate_dummy_manifest(
ctx,
out_manifest = None,
@@ -728,6 +765,8 @@ def _package(
packaged_resources_ctx[_PACKAGED_VALIDATION_RESULT] = resource_files_zip
packaged_resources_ctx[_RESOURCE_PROGUARD_CONFIG] = proguard_cfg
packaged_resources_ctx[_RESOURCE_MINSDK_PROGUARD_CONFIG] = minsdk_proguard_config
+ packaged_resources_ctx[_MAIN_DEX_PROGUARD_CONFIG] = main_dex_proguard_cfg
+ packaged_resources_ctx[_PACKAGED_R_TXT] = r_txt
# Fix class jar name because some tests depend on {label_name}_resources.jar being the suffix of
# the path, with _common.PACKAGED_RESOURCES_SUFFIX removed from the label name.
@@ -1041,16 +1080,26 @@ def _validate_resources(resource_files = None):
if res_type not in _RESOURCE_FOLDER_TYPES:
fail(_INCORRECT_RESOURCE_LAYOUT_ERROR % resource_file)
+def _process_manifest_values(ctx, manifest_values, min_sdk_floor = _DEPOT_MIN_SDK_FLOOR):
+ expanded_manifest_values = utils.expand_make_vars(ctx, manifest_values)
+ if _MIN_SDK_VERSION in expanded_manifest_values and min_sdk_floor > 0:
+ expanded_manifest_values[_MIN_SDK_VERSION] = str(
+ max(int(expanded_manifest_values[_MIN_SDK_VERSION]), min_sdk_floor),
+ )
+ return expanded_manifest_values
+
def _bump_min_sdk(
ctx,
- manifest,
- floor,
- enforce_min_sdk_floor_tool):
+ manifest = None,
+ manifest_values = None,
+ floor = _DEPOT_MIN_SDK_FLOOR,
+ enforce_min_sdk_floor_tool = None):
"""Bumps the min SDK attribute of AndroidManifest to the floor.
Args:
ctx: The rules context.
manifest: File. The AndroidManifest.xml file.
+ manifest_values: Dictionary. The optional manifest_values to process.
floor: int. The min SDK floor. Manifest is unchanged if floor <= 0.
enforce_min_sdk_floor_tool: FilesToRunProvider. The enforce_min_sdk_tool executable or
FilesToRunprovider
@@ -1059,6 +1108,14 @@ def _bump_min_sdk(
A dict containing _ManifestContextInfo provider fields.
"""
manifest_ctx = {}
+
+ if manifest_values != None:
+ manifest_ctx[_PROCESSED_MANIFEST_VALUES] = _process_manifest_values(
+ ctx,
+ manifest_values,
+ floor,
+ )
+
if not manifest or floor <= 0:
manifest_ctx[_PROCESSED_MANIFEST] = manifest
return _ManifestContextInfo(**manifest_ctx)
@@ -1892,6 +1949,133 @@ def _process(
return _ResourcesProcessContextInfo(**out_ctx)
+def _shrink(
+ ctx,
+ resources_zip = None,
+ aapt = None,
+ android_jar = None,
+ r_txt = None,
+ shrunk_jar = None,
+ proguard_mapping = None,
+ busybox = None,
+ host_javabase = None):
+ """Shrinks the resources apk.
+
+ Args:
+ ctx: The context.
+ resources_zip: File. The input resources file zip containing the merged assets and resources to be shrunk.
+ aapt: FilesToRunProvider. The AAPT executable.
+ android_jar: File. The Android Jar.
+ r_txt: File. The resource IDs outputted by linking resources in text.
+ shrunk_jar: File. The proguarded output jar.
+ proguard_mapping: File. The Proguard Mapping file.
+ busybox: FilesToRunProvider. The ResourceBusyBox executable.
+ host_javabase: Target. The host javabase.
+
+ Returns:
+ A dict contaning all of the shrunk resource outputs.
+ """
+ shrunk_ctx = {
+ _SHRUNK_RESOURCE_APK: None,
+ _SHRUNK_RESOURCE_ZIP: None,
+ _RESOURCE_SHRINKER_LOG: None,
+ _RESOURCE_OPTIMIZATION_CONFIG: None,
+ }
+
+ out_apk = ctx.actions.declare_file(ctx.label.name + "_shrunk.ap_")
+ out_zip = ctx.actions.declare_file(ctx.label.name + "_files/resource_files_shrunk.zip")
+ out_log = ctx.actions.declare_file(ctx.label.name + "_files/resource_shrinker.log")
+ out_config = ctx.actions.declare_file(ctx.label.name + "_files/resource_optimization.cfg")
+ _busybox.shrink(
+ ctx,
+ out_apk,
+ out_zip,
+ out_log,
+ out_config,
+ resources_zip = resources_zip,
+ aapt = aapt,
+ android_jar = android_jar,
+ r_txt = r_txt,
+ shrunk_jar = shrunk_jar,
+ proguard_mapping = proguard_mapping,
+ debug = _compilation_mode.get(ctx) != _compilation_mode.OPT,
+ busybox = busybox,
+ host_javabase = host_javabase,
+ )
+
+ shrunk_ctx[_SHRUNK_RESOURCE_APK] = out_apk
+ shrunk_ctx[_SHRUNK_RESOURCE_ZIP] = out_zip
+ shrunk_ctx[_RESOURCE_SHRINKER_LOG] = out_log
+ shrunk_ctx[_RESOURCE_OPTIMIZATION_CONFIG] = out_config
+
+ return _ResourcesShrinkContextInfo(**shrunk_ctx)
+
+def _optimize(
+ ctx,
+ resources_apk = None,
+ resource_optimization_config = None,
+ is_resource_shrunk = False,
+ aapt = None,
+ busybox = None,
+ host_javabase = None):
+ """Optimizes the resources apk if necessary.
+
+ Args:
+ ctx: The context.
+ resources_apk: File. The resources apk.
+ resource_optimization_config: File. The resource optimization config outputted
+ by resource shrinking. It will only be used if resource name obfuscation is enabled.
+ is_resource_shrunk: Boolean. Whether the resources has been shrunk or not.
+ aapt: FilesToRunProvider. The AAPT executable.
+ busybox: FilesToRunProvider. The ResourceBusyBox executable.
+ host_javabase: Target. The host javabase.
+
+ Returns:
+ A dict contaning all of the optimized resource outputs.
+ """
+ optimize_ctx = {
+ _OPTIMIZED_RESOURCE_APK: None,
+ _RESOURCE_PATH_SHORTENING_MAP: None,
+ }
+
+ use_resource_path_shortening_map = _is_resource_path_shortening_enabled(ctx)
+ use_resource_optimization_config = _is_resource_name_obfuscation_enabled(ctx, is_resource_shrunk)
+
+ if not (use_resource_path_shortening_map or use_resource_optimization_config):
+ return _ResourcesOptimizeContextInfo(**optimize_ctx)
+
+ optimized_resource_apk = ctx.actions.declare_file(ctx.label.name + "optimized.ap_")
+ optimize_ctx[_OPTIMIZED_RESOURCE_APK] = optimized_resource_apk
+
+ resource_path_shortening_map = None
+ if use_resource_path_shortening_map:
+ resource_path_shortening_map = ctx.actions.declare_file(ctx.label.name + "_resource_paths.map")
+ optimize_ctx[_RESOURCE_PATH_SHORTENING_MAP] = resource_path_shortening_map
+
+ _busybox.optimize(
+ ctx,
+ out_apk = optimized_resource_apk,
+ in_apk = resources_apk,
+ resource_path_shortening_map = optimize_ctx[_RESOURCE_PATH_SHORTENING_MAP],
+ resource_optimization_config = resource_optimization_config if use_resource_optimization_config else None,
+ aapt = aapt,
+ busybox = busybox,
+ host_javabase = host_javabase,
+ )
+
+ return _ResourcesOptimizeContextInfo(**optimize_ctx)
+
+def _is_resource_path_shortening_enabled(ctx):
+ return ctx.fragments.android.use_android_resource_path_shortening and \
+ _compilation_mode.get(ctx) == _compilation_mode.OPT and \
+ not acls.in_android_binary_raw_access_to_resource_paths_allowlist(str(ctx.label))
+
+def _is_resource_name_obfuscation_enabled(ctx, is_resource_shrunk):
+ return (ctx.fragments.android.use_android_resource_name_obfuscation or
+ _FEATURE_RESOURCE_NAME_OBFUSCATION in ctx.features) and \
+ is_resource_shrunk and \
+ not acls.in_android_binary_raw_access_to_resource_paths_allowlist(str(ctx.label))
+
resources = struct(
process = _process,
process_starlark = _process_starlark,
@@ -1905,8 +2089,9 @@ resources = struct(
# Exposed for android_local_test and android_library
generate_dummy_manifest = _generate_dummy_manifest,
- # Exposed for android_library, aar_import, and android_binary
+ # Exposed for android_library, aar_import, android_local_test and android_binary
bump_min_sdk = _bump_min_sdk,
+ process_manifest_values = _process_manifest_values,
# Exposed for use in AOSP
set_default_min_sdk = _set_default_min_sdk,
@@ -1914,6 +2099,8 @@ resources = struct(
# Exposed for android_binary
is_resource_shrinking_enabled = _is_resource_shrinking_enabled,
validate_min_sdk = _validate_min_sdk,
+ shrink = _shrink,
+ optimize = _optimize,
# Exposed for android_library, aar_import, and android_binary
DEPOT_MIN_SDK_FLOOR = _DEPOT_MIN_SDK_FLOOR,
@@ -1926,4 +2113,6 @@ testing = struct(
make_databinding_outputs = _make_databinding_outputs,
ResourcesPackageContextInfo = _ResourcesPackageContextInfo,
ResourcesProcessContextInfo = _ResourcesProcessContextInfo,
+ ResourcesShrinkContextInfo = _ResourcesShrinkContextInfo,
+ ResourcesOptimizeContextInfo = _ResourcesOptimizeContextInfo,
)
diff --git a/rules/rules.bzl b/rules/rules.bzl
index ed1cd2d..3505ecb 100644
--- a/rules/rules.bzl
+++ b/rules/rules.bzl
@@ -33,6 +33,10 @@ load(
_android_library = "android_library_macro",
)
load(
+ "//rules/android_local_test:rule.bzl",
+ _android_local_test = "android_local_test",
+)
+load(
"//rules:android_ndk_repository.bzl",
_android_ndk_repository = "android_ndk_repository",
)
@@ -49,13 +53,17 @@ load(
_android_sdk = "android_sdk",
)
load(
- "//rules:android_sdk_repository.bzl",
+ "//rules/android_sdk_repository:rule.bzl",
_android_sdk_repository = "android_sdk_repository",
)
load(
"//rules:android_tools_defaults_jar.bzl",
_android_tools_defaults_jar = "android_tools_defaults_jar",
)
+load(
+ "//rules/android_sandboxed_sdk:asar_import.bzl",
+ _asar_import = "asar_import",
+)
# Current version. Tools may check this to determine compatibility.
RULES_ANDROID_VERSION = "0.1.0"
@@ -64,9 +72,11 @@ aar_import = _aar_import
android_application = _android_application
android_binary = _android_binary
android_library = _android_library
+android_local_test = _android_local_test
android_ndk_repository = _android_ndk_repository
android_sandboxed_sdk = _android_sandboxed_sdk
android_sandboxed_sdk_bundle = _android_sandboxed_sdk_bundle
android_sdk = _android_sdk
android_sdk_repository = _android_sdk_repository
android_tools_defaults_jar = _android_tools_defaults_jar
+asar_import = _asar_import
diff --git a/rules/sandboxed_sdk_toolbox.bzl b/rules/sandboxed_sdk_toolbox.bzl
new file mode 100644
index 0000000..1c1a5dd
--- /dev/null
+++ b/rules/sandboxed_sdk_toolbox.bzl
@@ -0,0 +1,172 @@
+# Copyright 2023 The Bazel Authors. All rights reserved.
+#
+# 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.
+
+"""Bazel SandboxedSdkToolbox commands."""
+
+load(":java.bzl", _java = "java")
+
+def _extract_api_descriptors(
+ ctx,
+ output = None,
+ sdk_deploy_jar = None,
+ sandboxed_sdk_toolbox = None,
+ host_javabase = None):
+ """Extracts API descriptors from a sandboxed SDK classpath.
+
+ The API descriptors can later be used to generate sources for communicating with this SDK.
+
+ Args:
+ ctx: The context.
+ output: Output API descriptors jar file.
+ sdk_deploy_jar: The SDK classpath, with transitive dependencies.
+ sandboxed_sdk_toolbox: Toolbox executable files.
+ host_javabase: Javabase used to run the toolbox.
+ """
+ args = ctx.actions.args()
+ args.add("extract-api-descriptors")
+ args.add("--sdk-deploy-jar", sdk_deploy_jar)
+ args.add("--output-sdk-api-descriptors", output)
+ _java.run(
+ ctx = ctx,
+ host_javabase = host_javabase,
+ executable = sandboxed_sdk_toolbox,
+ arguments = [args],
+ inputs = [sdk_deploy_jar],
+ outputs = [output],
+ mnemonic = "ExtractApiDescriptors",
+ progress_message = "Extract SDK API descriptors %s" % output.short_path,
+ )
+
+def _extract_api_descriptors_from_asar(
+ ctx,
+ output = None,
+ asar = None,
+ sandboxed_sdk_toolbox = None,
+ host_javabase = None):
+ """Extracts API descriptors from a sandboxed SDK archive.
+
+ The API descriptors can later be used to generate sources for communicating with this SDK.
+
+ Args:
+ ctx: The context.
+ output: Output API descriptors jar file.
+ asar: The sandboxed sdk archive.
+ sandboxed_sdk_toolbox: Toolbox executable files.
+ host_javabase: Javabase used to run the toolbox.
+ """
+ args = ctx.actions.args()
+ args.add("extract-api-descriptors-from-asar")
+ args.add("--asar", asar)
+ args.add("--output-sdk-api-descriptors", output)
+ _java.run(
+ ctx = ctx,
+ host_javabase = host_javabase,
+ executable = sandboxed_sdk_toolbox,
+ arguments = [args],
+ inputs = [asar],
+ outputs = [output],
+ mnemonic = "ExtractApiDescriptorsFromAsar",
+ progress_message = "Extract SDK API descriptors from ASAR %s" % output.short_path,
+ )
+
+def _generate_client_sources(
+ ctx,
+ output_kotlin_dir = None,
+ output_java_dir = None,
+ sdk_api_descriptors = None,
+ aidl_compiler = None,
+ framework_aidl = None,
+ sandboxed_sdk_toolbox = None,
+ host_javabase = None):
+ """Generate Kotlin and Java sources for SDK communication.
+
+ Args:
+ ctx: The context.
+ output_kotlin_dir: Directory for Kotlin source tree. It depends on the Java sources.
+ output_java_dir: Directory for Java source tree. Doesn't depend on Kotlin sources.
+ sdk_api_descriptors: SDK API descriptor jar.
+ aidl_compiler: Executable files for the AOSP AIDL compiler.
+ framework_aidl: Framework.aidl file used to compile AIDL sources.
+ sandboxed_sdk_toolbox: Toolbox executable files.
+ host_javabase: Javabase used to run the toolbox.
+ """
+ args = ctx.actions.args()
+ args.add("generate-client-sources")
+ args.add("--sdk-api-descriptors", sdk_api_descriptors)
+ args.add("--aidl-compiler", aidl_compiler)
+ args.add("--framework-aidl", framework_aidl)
+ args.add("--output-kotlin-dir", output_kotlin_dir.path)
+ args.add("--output-java-dir", output_java_dir.path)
+ _java.run(
+ ctx = ctx,
+ host_javabase = host_javabase,
+ executable = sandboxed_sdk_toolbox,
+ arguments = [args],
+ inputs = [
+ sdk_api_descriptors,
+ aidl_compiler,
+ framework_aidl,
+ ],
+ outputs = [output_kotlin_dir, output_java_dir],
+ mnemonic = "GenClientSources",
+ progress_message = "Generate client sources for %s" % output_kotlin_dir.short_path,
+ )
+
+def _generate_sdk_dependencies_manifest(
+ ctx,
+ output = None,
+ manifest_package = None,
+ sdk_module_configs = None,
+ debug_key = None,
+ sandboxed_sdk_toolbox = None,
+ host_javabase = None):
+ """Generates a manifest that lists all sandboxed SDK dependencies.
+
+ The generated manifest will contain <uses-sdk-library> tags for each SDK. This is required for
+ loading the SDK in the Privacy Sandbox.
+
+ Args:
+ ctx: The context.
+ output: File where the final manifest will be written.
+ manifest_package: The package used in the manifest.
+ sdk_module_configs: List of SDK Module config JSON files with SDK packages and versions.
+ debug_key: Keystore that will later be used to sign the SDK APKs. It's expected to be a
+ sandboxed_sdk_toolbox: Toolbox executable files.
+ host_javabase: Javabase used to run the toolbox.
+ """
+ args = ctx.actions.args()
+ args.add("generate-sdk-dependencies-manifest")
+ args.add("--manifest-package", manifest_package)
+ args.add("--sdk-module-configs", ",".join([config.path for config in sdk_module_configs]))
+ args.add("--debug-keystore", debug_key)
+ args.add("--debug-keystore-pass", "android")
+ args.add("--debug-keystore-alias", "androiddebugkey")
+ args.add("--output-manifest", output)
+ _java.run(
+ ctx = ctx,
+ host_javabase = host_javabase,
+ executable = sandboxed_sdk_toolbox,
+ arguments = [args],
+ inputs = sdk_module_configs + [debug_key],
+ outputs = [output],
+ mnemonic = "GenSdkDepManifest",
+ progress_message = "Generate SDK dependencies manifest %s" % output.short_path,
+ )
+
+sandboxed_sdk_toolbox = struct(
+ extract_api_descriptors = _extract_api_descriptors,
+ extract_api_descriptors_from_asar = _extract_api_descriptors_from_asar,
+ generate_client_sources = _generate_client_sources,
+ generate_sdk_dependencies_manifest = _generate_sdk_dependencies_manifest,
+)
diff --git a/rules/utils.bzl b/rules/utils.bzl
index 79b3afd..b3d34a1 100644
--- a/rules/utils.bzl
+++ b/rules/utils.bzl
@@ -16,8 +16,7 @@
load(":providers.bzl", "FailureInfo")
-# AOSP only change
-ANDROID_TOOLCHAIN_TYPE = "@rules_android//toolchains/android:toolchain_type"
+ANDROID_TOOLCHAIN_TYPE = Label("//toolchains/android:toolchain_type")
_CUU = "\033[A"
_EL = "\033[K"
diff --git a/rules_android_maven_install.json b/rules_android_maven_install.json
new file mode 100644
index 0000000..5a1c017
--- /dev/null
+++ b/rules_android_maven_install.json
@@ -0,0 +1,3627 @@
+{
+ "dependency_tree": {
+ "__AUTOGENERATED_FILE_DO_NOT_MODIFY_THIS_FILE_MANUALLY": "THERE_IS_NO_DATA_ONLY_ZUUL",
+ "__INPUT_ARTIFACTS_HASH": -222111098,
+ "__RESOLVED_ARTIFACTS_HASH": -1128666162,
+ "conflict_resolution": {
+ "com.google.protobuf:protobuf-java-util:3.9.2": "com.google.protobuf:protobuf-java-util:3.19.3"
+ },
+ "dependencies": [
+ {
+ "coord": "androidx.annotation:annotation-experimental:1.1.0",
+ "dependencies": [],
+ "directDependencies": [],
+ "file": "v1/https/maven.google.com/androidx/annotation/annotation-experimental/1.1.0/annotation-experimental-1.1.0.aar",
+ "mirror_urls": [
+ "https://maven.google.com/androidx/annotation/annotation-experimental/1.1.0/annotation-experimental-1.1.0.aar",
+ "https://repo1.maven.org/maven2/androidx/annotation/annotation-experimental/1.1.0/annotation-experimental-1.1.0.aar"
+ ],
+ "sha256": "0157de61a2064047896a058080f3fd67ba57ad9a94857b3f7a363660243e3f90",
+ "url": "https://maven.google.com/androidx/annotation/annotation-experimental/1.1.0/annotation-experimental-1.1.0.aar"
+ },
+ {
+ "coord": "androidx.annotation:annotation:1.3.0",
+ "dependencies": [],
+ "directDependencies": [],
+ "file": "v1/https/maven.google.com/androidx/annotation/annotation/1.3.0/annotation-1.3.0.jar",
+ "mirror_urls": [
+ "https://maven.google.com/androidx/annotation/annotation/1.3.0/annotation-1.3.0.jar",
+ "https://repo1.maven.org/maven2/androidx/annotation/annotation/1.3.0/annotation-1.3.0.jar"
+ ],
+ "sha256": "97dc45afefe3a1e421da42b8b6e9f90491477c45fc6178203e3a5e8a05ee8553",
+ "url": "https://maven.google.com/androidx/annotation/annotation/1.3.0/annotation-1.3.0.jar"
+ },
+ {
+ "coord": "androidx.concurrent:concurrent-futures:1.1.0",
+ "dependencies": [
+ "androidx.annotation:annotation:1.3.0",
+ "com.google.guava:listenablefuture:9999.0-empty-to-avoid-conflict-with-guava"
+ ],
+ "directDependencies": [
+ "androidx.annotation:annotation:1.3.0",
+ "com.google.guava:listenablefuture:9999.0-empty-to-avoid-conflict-with-guava"
+ ],
+ "file": "v1/https/maven.google.com/androidx/concurrent/concurrent-futures/1.1.0/concurrent-futures-1.1.0.jar",
+ "mirror_urls": [
+ "https://maven.google.com/androidx/concurrent/concurrent-futures/1.1.0/concurrent-futures-1.1.0.jar",
+ "https://repo1.maven.org/maven2/androidx/concurrent/concurrent-futures/1.1.0/concurrent-futures-1.1.0.jar"
+ ],
+ "sha256": "0ce067c514a0d1049d1bebdf709e344ed3266fe9744275682937cdcb13334e9e",
+ "url": "https://maven.google.com/androidx/concurrent/concurrent-futures/1.1.0/concurrent-futures-1.1.0.jar"
+ },
+ {
+ "coord": "androidx.databinding:databinding-common:8.2.0-alpha15",
+ "dependencies": [],
+ "directDependencies": [],
+ "file": "v1/https/maven.google.com/androidx/databinding/databinding-common/8.2.0-alpha15/databinding-common-8.2.0-alpha15.jar",
+ "mirror_urls": [
+ "https://maven.google.com/androidx/databinding/databinding-common/8.2.0-alpha15/databinding-common-8.2.0-alpha15.jar",
+ "https://repo1.maven.org/maven2/androidx/databinding/databinding-common/8.2.0-alpha15/databinding-common-8.2.0-alpha15.jar"
+ ],
+ "sha256": "66cab82639dac0f6c2433464c093b074d608c4bb887ec38a9b8bc4ac98126732",
+ "url": "https://maven.google.com/androidx/databinding/databinding-common/8.2.0-alpha15/databinding-common-8.2.0-alpha15.jar"
+ },
+ {
+ "coord": "androidx.databinding:databinding-compiler-common:8.2.0-alpha15",
+ "dependencies": [
+ "org.jetbrains.kotlin:kotlin-stdlib:1.9.0-Beta",
+ "jakarta.activation:jakarta.activation-api:1.2.1",
+ "org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.9.0-Beta",
+ "com.android.databinding:baseLibrary:8.2.0-alpha15",
+ "com.google.guava:guava:32.1.2-jre",
+ "org.glassfish.jaxb:jaxb-runtime:2.3.2",
+ "org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.9.0-Beta",
+ "org.glassfish.jaxb:txw2:2.3.2",
+ "commons-io:commons-io:2.4",
+ "androidx.databinding:databinding-common:8.2.0-alpha15",
+ "jakarta.xml.bind:jakarta.xml.bind-api:2.3.2",
+ "com.googlecode.juniversalchardet:juniversalchardet:1.0.3",
+ "com.sun.xml.fastinfoset:FastInfoset:1.2.16",
+ "com.squareup:javapoet:1.10.0",
+ "org.jvnet.staxex:stax-ex:1.8.1",
+ "org.jetbrains.kotlin:kotlin-stdlib-common:1.9.0-Beta",
+ "com.sun.istack:istack-commons-runtime:3.0.8",
+ "com.google.code.gson:gson:2.10",
+ "org.jetbrains:annotations:13.0",
+ "com.android.tools:annotations:31.2.0-alpha15",
+ "com.android.tools.build.jetifier:jetifier-core:1.0.0-beta10"
+ ],
+ "directDependencies": [
+ "com.android.databinding:baseLibrary:8.2.0-alpha15",
+ "com.google.guava:guava:32.1.2-jre",
+ "org.glassfish.jaxb:jaxb-runtime:2.3.2",
+ "org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.9.0-Beta",
+ "commons-io:commons-io:2.4",
+ "androidx.databinding:databinding-common:8.2.0-alpha15",
+ "com.googlecode.juniversalchardet:juniversalchardet:1.0.3",
+ "com.squareup:javapoet:1.10.0",
+ "com.google.code.gson:gson:2.10",
+ "com.android.tools:annotations:31.2.0-alpha15",
+ "com.android.tools.build.jetifier:jetifier-core:1.0.0-beta10"
+ ],
+ "file": "v1/https/maven.google.com/androidx/databinding/databinding-compiler-common/8.2.0-alpha15/databinding-compiler-common-8.2.0-alpha15.jar",
+ "mirror_urls": [
+ "https://maven.google.com/androidx/databinding/databinding-compiler-common/8.2.0-alpha15/databinding-compiler-common-8.2.0-alpha15.jar",
+ "https://repo1.maven.org/maven2/androidx/databinding/databinding-compiler-common/8.2.0-alpha15/databinding-compiler-common-8.2.0-alpha15.jar"
+ ],
+ "sha256": "b89d68cdc28bd70d7041a780228f9c788b8693bd638d4bc8f591128c7885d304",
+ "url": "https://maven.google.com/androidx/databinding/databinding-compiler-common/8.2.0-alpha15/databinding-compiler-common-8.2.0-alpha15.jar"
+ },
+ {
+ "coord": "androidx.lifecycle:lifecycle-common:2.3.1",
+ "dependencies": [
+ "androidx.annotation:annotation:1.3.0"
+ ],
+ "directDependencies": [
+ "androidx.annotation:annotation:1.3.0"
+ ],
+ "file": "v1/https/maven.google.com/androidx/lifecycle/lifecycle-common/2.3.1/lifecycle-common-2.3.1.jar",
+ "mirror_urls": [
+ "https://maven.google.com/androidx/lifecycle/lifecycle-common/2.3.1/lifecycle-common-2.3.1.jar",
+ "https://repo1.maven.org/maven2/androidx/lifecycle/lifecycle-common/2.3.1/lifecycle-common-2.3.1.jar"
+ ],
+ "sha256": "15848fb56db32f4c7cdc72b324003183d52a4884d6bf09be708ac7f587d139b5",
+ "url": "https://maven.google.com/androidx/lifecycle/lifecycle-common/2.3.1/lifecycle-common-2.3.1.jar"
+ },
+ {
+ "coord": "androidx.privacysandbox.tools:tools-apigenerator:1.0.0-alpha06",
+ "dependencies": [
+ "org.jetbrains.kotlin:kotlin-stdlib:1.9.0-Beta",
+ "androidx.privacysandbox.tools:tools-core:1.0.0-alpha06",
+ "com.google.guava:guava:32.1.2-jre",
+ "com.squareup:kotlinpoet:1.14.2",
+ "org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.9.0-Beta",
+ "org.ow2.asm:asm-commons:9.5",
+ "org.ow2.asm:asm:9.5",
+ "org.jetbrains.kotlin:kotlin-stdlib-common:1.9.0-Beta",
+ "androidx.annotation:annotation:1.3.0",
+ "org.ow2.asm:asm-tree:9.5",
+ "org.jetbrains.kotlin:kotlin-reflect:1.9.0-Beta",
+ "com.google.protobuf:protobuf-java:3.21.8",
+ "org.jetbrains.kotlinx:kotlinx-metadata-jvm:0.6.2",
+ "androidx.privacysandbox.tools:tools:1.0.0-alpha06",
+ "org.ow2.asm:asm-analysis:9.5",
+ "org.jetbrains:annotations:13.0"
+ ],
+ "directDependencies": [
+ "org.jetbrains.kotlin:kotlin-stdlib:1.9.0-Beta",
+ "androidx.privacysandbox.tools:tools-core:1.0.0-alpha06",
+ "com.squareup:kotlinpoet:1.14.2",
+ "org.ow2.asm:asm-commons:9.5",
+ "org.ow2.asm:asm:9.5",
+ "org.jetbrains.kotlinx:kotlinx-metadata-jvm:0.6.2",
+ "androidx.privacysandbox.tools:tools:1.0.0-alpha06"
+ ],
+ "file": "v1/https/maven.google.com/androidx/privacysandbox/tools/tools-apigenerator/1.0.0-alpha06/tools-apigenerator-1.0.0-alpha06.jar",
+ "mirror_urls": [
+ "https://maven.google.com/androidx/privacysandbox/tools/tools-apigenerator/1.0.0-alpha06/tools-apigenerator-1.0.0-alpha06.jar",
+ "https://repo1.maven.org/maven2/androidx/privacysandbox/tools/tools-apigenerator/1.0.0-alpha06/tools-apigenerator-1.0.0-alpha06.jar"
+ ],
+ "sha256": "e37efef8a51df25d414aa6d3c5d4b7514ee98d83f3fc764f326fe96c646e0da0",
+ "url": "https://maven.google.com/androidx/privacysandbox/tools/tools-apigenerator/1.0.0-alpha06/tools-apigenerator-1.0.0-alpha06.jar"
+ },
+ {
+ "coord": "androidx.privacysandbox.tools:tools-apipackager:1.0.0-alpha06",
+ "dependencies": [
+ "org.jetbrains.kotlin:kotlin-stdlib:1.9.0-Beta",
+ "androidx.privacysandbox.tools:tools-core:1.0.0-alpha06",
+ "com.google.guava:guava:32.1.2-jre",
+ "com.squareup:kotlinpoet:1.14.2",
+ "org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.9.0-Beta",
+ "org.ow2.asm:asm-commons:9.5",
+ "org.ow2.asm:asm:9.5",
+ "org.jetbrains.kotlin:kotlin-stdlib-common:1.9.0-Beta",
+ "androidx.annotation:annotation:1.3.0",
+ "org.ow2.asm:asm-tree:9.5",
+ "org.jetbrains.kotlin:kotlin-reflect:1.9.0-Beta",
+ "com.google.protobuf:protobuf-java:3.21.8",
+ "androidx.privacysandbox.tools:tools:1.0.0-alpha06",
+ "org.ow2.asm:asm-analysis:9.5",
+ "org.jetbrains:annotations:13.0"
+ ],
+ "directDependencies": [
+ "org.jetbrains.kotlin:kotlin-stdlib:1.9.0-Beta",
+ "androidx.privacysandbox.tools:tools-core:1.0.0-alpha06",
+ "org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.9.0-Beta",
+ "org.ow2.asm:asm-commons:9.5",
+ "org.ow2.asm:asm:9.5",
+ "androidx.privacysandbox.tools:tools:1.0.0-alpha06"
+ ],
+ "file": "v1/https/maven.google.com/androidx/privacysandbox/tools/tools-apipackager/1.0.0-alpha06/tools-apipackager-1.0.0-alpha06.jar",
+ "mirror_urls": [
+ "https://maven.google.com/androidx/privacysandbox/tools/tools-apipackager/1.0.0-alpha06/tools-apipackager-1.0.0-alpha06.jar",
+ "https://repo1.maven.org/maven2/androidx/privacysandbox/tools/tools-apipackager/1.0.0-alpha06/tools-apipackager-1.0.0-alpha06.jar"
+ ],
+ "sha256": "bc5934f84730b7c4fe10d96e767beaf756197fc5bb7dc1c123ebf9d40a512d6c",
+ "url": "https://maven.google.com/androidx/privacysandbox/tools/tools-apipackager/1.0.0-alpha06/tools-apipackager-1.0.0-alpha06.jar"
+ },
+ {
+ "coord": "androidx.privacysandbox.tools:tools-core:1.0.0-alpha06",
+ "dependencies": [
+ "org.jetbrains.kotlin:kotlin-stdlib:1.9.0-Beta",
+ "com.google.guava:guava:32.1.2-jre",
+ "com.squareup:kotlinpoet:1.14.2",
+ "org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.9.0-Beta",
+ "org.jetbrains.kotlin:kotlin-stdlib-common:1.9.0-Beta",
+ "androidx.annotation:annotation:1.3.0",
+ "org.jetbrains.kotlin:kotlin-reflect:1.9.0-Beta",
+ "com.google.protobuf:protobuf-java:3.21.8",
+ "androidx.privacysandbox.tools:tools:1.0.0-alpha06",
+ "org.jetbrains:annotations:13.0"
+ ],
+ "directDependencies": [
+ "org.jetbrains.kotlin:kotlin-stdlib:1.9.0-Beta",
+ "com.google.guava:guava:32.1.2-jre",
+ "com.squareup:kotlinpoet:1.14.2",
+ "com.google.protobuf:protobuf-java:3.21.8",
+ "androidx.privacysandbox.tools:tools:1.0.0-alpha06"
+ ],
+ "file": "v1/https/maven.google.com/androidx/privacysandbox/tools/tools-core/1.0.0-alpha06/tools-core-1.0.0-alpha06.jar",
+ "mirror_urls": [
+ "https://maven.google.com/androidx/privacysandbox/tools/tools-core/1.0.0-alpha06/tools-core-1.0.0-alpha06.jar",
+ "https://repo1.maven.org/maven2/androidx/privacysandbox/tools/tools-core/1.0.0-alpha06/tools-core-1.0.0-alpha06.jar"
+ ],
+ "sha256": "c2b88a261f38e0c3f09d46f8dc9daa0f562e26b3ebeffb4cb52903e4704f870a",
+ "url": "https://maven.google.com/androidx/privacysandbox/tools/tools-core/1.0.0-alpha06/tools-core-1.0.0-alpha06.jar"
+ },
+ {
+ "coord": "androidx.privacysandbox.tools:tools:1.0.0-alpha06",
+ "dependencies": [
+ "org.jetbrains.kotlin:kotlin-stdlib-common:1.9.0-Beta",
+ "org.jetbrains:annotations:13.0",
+ "androidx.annotation:annotation:1.3.0",
+ "org.jetbrains.kotlin:kotlin-stdlib:1.9.0-Beta"
+ ],
+ "directDependencies": [
+ "androidx.annotation:annotation:1.3.0",
+ "org.jetbrains.kotlin:kotlin-stdlib:1.9.0-Beta"
+ ],
+ "file": "v1/https/maven.google.com/androidx/privacysandbox/tools/tools/1.0.0-alpha06/tools-1.0.0-alpha06.jar",
+ "mirror_urls": [
+ "https://maven.google.com/androidx/privacysandbox/tools/tools/1.0.0-alpha06/tools-1.0.0-alpha06.jar",
+ "https://repo1.maven.org/maven2/androidx/privacysandbox/tools/tools/1.0.0-alpha06/tools-1.0.0-alpha06.jar"
+ ],
+ "sha256": "83b78a665834bb554e8fb6cee1bc8fb81f0c55383f9fb44aedea44682393d4c8",
+ "url": "https://maven.google.com/androidx/privacysandbox/tools/tools/1.0.0-alpha06/tools-1.0.0-alpha06.jar"
+ },
+ {
+ "coord": "androidx.test.espresso:espresso-idling-resource:aar:3.5.1",
+ "dependencies": [],
+ "directDependencies": [],
+ "exclusions": [
+ "*:*"
+ ],
+ "file": "v1/https/maven.google.com/androidx/test/espresso/espresso-idling-resource/3.5.1/espresso-idling-resource-3.5.1.aar",
+ "mirror_urls": [
+ "https://maven.google.com/androidx/test/espresso/espresso-idling-resource/3.5.1/espresso-idling-resource-3.5.1.aar",
+ "https://repo1.maven.org/maven2/androidx/test/espresso/espresso-idling-resource/3.5.1/espresso-idling-resource-3.5.1.aar"
+ ],
+ "sha256": "84fb8e2f5eda937771bee28582f5d2cfa61b0e9438d02041ca61b81e3dac3c87",
+ "url": "https://maven.google.com/androidx/test/espresso/espresso-idling-resource/3.5.1/espresso-idling-resource-3.5.1.aar"
+ },
+ {
+ "coord": "androidx.test.ext:junit:1.2.0-alpha01",
+ "dependencies": [
+ "com.google.guava:listenablefuture:9999.0-empty-to-avoid-conflict-with-guava",
+ "org.jetbrains.kotlin:kotlin-stdlib:1.9.0-Beta",
+ "androidx.test:monitor:1.7.0-alpha01",
+ "androidx.test:annotation:1.1.0-alpha01",
+ "androidx.lifecycle:lifecycle-common:2.3.1",
+ "androidx.annotation:annotation-experimental:1.1.0",
+ "androidx.tracing:tracing:1.1.0",
+ "org.hamcrest:hamcrest-core:1.3",
+ "androidx.test.services:storage:1.5.0-alpha01",
+ "androidx.annotation:annotation:1.3.0",
+ "junit:junit:4.13.2",
+ "androidx.test:core:1.6.0-alpha01",
+ "androidx.concurrent:concurrent-futures:1.1.0"
+ ],
+ "directDependencies": [
+ "androidx.test:monitor:1.7.0-alpha01",
+ "androidx.test.services:storage:1.5.0-alpha01",
+ "androidx.annotation:annotation:1.3.0",
+ "junit:junit:4.13.2",
+ "androidx.test:core:1.6.0-alpha01"
+ ],
+ "file": "v1/https/maven.google.com/androidx/test/ext/junit/1.2.0-alpha01/junit-1.2.0-alpha01.aar",
+ "mirror_urls": [
+ "https://maven.google.com/androidx/test/ext/junit/1.2.0-alpha01/junit-1.2.0-alpha01.aar",
+ "https://repo1.maven.org/maven2/androidx/test/ext/junit/1.2.0-alpha01/junit-1.2.0-alpha01.aar"
+ ],
+ "sha256": "54362f0f2589d0d32fe8866bedd1471f63847a7e56f74b2cd6b71355eb134304",
+ "url": "https://maven.google.com/androidx/test/ext/junit/1.2.0-alpha01/junit-1.2.0-alpha01.aar"
+ },
+ {
+ "coord": "androidx.test.services:storage:1.5.0-alpha01",
+ "dependencies": [
+ "org.jetbrains.kotlin:kotlin-stdlib:1.9.0-Beta",
+ "androidx.test:monitor:1.7.0-alpha01",
+ "androidx.test:annotation:1.1.0-alpha01",
+ "androidx.annotation:annotation-experimental:1.1.0",
+ "androidx.tracing:tracing:1.1.0",
+ "androidx.annotation:annotation:1.3.0"
+ ],
+ "directDependencies": [
+ "androidx.annotation:annotation:1.3.0",
+ "androidx.test:annotation:1.1.0-alpha01",
+ "androidx.test:monitor:1.7.0-alpha01"
+ ],
+ "file": "v1/https/maven.google.com/androidx/test/services/storage/1.5.0-alpha01/storage-1.5.0-alpha01.aar",
+ "mirror_urls": [
+ "https://maven.google.com/androidx/test/services/storage/1.5.0-alpha01/storage-1.5.0-alpha01.aar",
+ "https://repo1.maven.org/maven2/androidx/test/services/storage/1.5.0-alpha01/storage-1.5.0-alpha01.aar"
+ ],
+ "sha256": "f6540dd19e7cb6fb5f075232c3c582fc04c6a6d25ec8c5fdfac2c35e18a673d0",
+ "url": "https://maven.google.com/androidx/test/services/storage/1.5.0-alpha01/storage-1.5.0-alpha01.aar"
+ },
+ {
+ "coord": "androidx.test:annotation:1.1.0-alpha01",
+ "dependencies": [
+ "androidx.annotation:annotation-experimental:1.1.0",
+ "androidx.annotation:annotation:1.3.0"
+ ],
+ "directDependencies": [
+ "androidx.annotation:annotation:1.3.0",
+ "androidx.annotation:annotation-experimental:1.1.0"
+ ],
+ "file": "v1/https/maven.google.com/androidx/test/annotation/1.1.0-alpha01/annotation-1.1.0-alpha01.aar",
+ "mirror_urls": [
+ "https://maven.google.com/androidx/test/annotation/1.1.0-alpha01/annotation-1.1.0-alpha01.aar",
+ "https://repo1.maven.org/maven2/androidx/test/annotation/1.1.0-alpha01/annotation-1.1.0-alpha01.aar"
+ ],
+ "sha256": "361dd1910ced2fb3a01c0ff9d1f318affb76466a9173b3648a4f2d3c6c2c2cdf",
+ "url": "https://maven.google.com/androidx/test/annotation/1.1.0-alpha01/annotation-1.1.0-alpha01.aar"
+ },
+ {
+ "coord": "androidx.test:core:1.6.0-alpha01",
+ "dependencies": [
+ "com.google.guava:listenablefuture:9999.0-empty-to-avoid-conflict-with-guava",
+ "org.jetbrains.kotlin:kotlin-stdlib:1.9.0-Beta",
+ "androidx.test:monitor:1.7.0-alpha01",
+ "androidx.test:annotation:1.1.0-alpha01",
+ "androidx.lifecycle:lifecycle-common:2.3.1",
+ "androidx.annotation:annotation-experimental:1.1.0",
+ "androidx.tracing:tracing:1.1.0",
+ "androidx.test.services:storage:1.5.0-alpha01",
+ "androidx.annotation:annotation:1.3.0",
+ "androidx.concurrent:concurrent-futures:1.1.0"
+ ],
+ "directDependencies": [
+ "com.google.guava:listenablefuture:9999.0-empty-to-avoid-conflict-with-guava",
+ "org.jetbrains.kotlin:kotlin-stdlib:1.9.0-Beta",
+ "androidx.test:monitor:1.7.0-alpha01",
+ "androidx.test:annotation:1.1.0-alpha01",
+ "androidx.lifecycle:lifecycle-common:2.3.1",
+ "androidx.tracing:tracing:1.1.0",
+ "androidx.test.services:storage:1.5.0-alpha01",
+ "androidx.annotation:annotation:1.3.0",
+ "androidx.concurrent:concurrent-futures:1.1.0"
+ ],
+ "file": "v1/https/maven.google.com/androidx/test/core/1.6.0-alpha01/core-1.6.0-alpha01.aar",
+ "mirror_urls": [
+ "https://maven.google.com/androidx/test/core/1.6.0-alpha01/core-1.6.0-alpha01.aar",
+ "https://repo1.maven.org/maven2/androidx/test/core/1.6.0-alpha01/core-1.6.0-alpha01.aar"
+ ],
+ "sha256": "404e752d20e4f1b8e1f5a31ea4bfa00ee777ecc39e9e81f837c7f3571ba21cf1",
+ "url": "https://maven.google.com/androidx/test/core/1.6.0-alpha01/core-1.6.0-alpha01.aar"
+ },
+ {
+ "coord": "androidx.test:monitor:1.7.0-alpha01",
+ "dependencies": [
+ "org.jetbrains.kotlin:kotlin-stdlib:1.9.0-Beta",
+ "androidx.test:annotation:1.1.0-alpha01",
+ "androidx.annotation:annotation-experimental:1.1.0",
+ "androidx.tracing:tracing:1.1.0",
+ "androidx.annotation:annotation:1.3.0"
+ ],
+ "directDependencies": [
+ "androidx.annotation:annotation:1.3.0",
+ "androidx.test:annotation:1.1.0-alpha01",
+ "androidx.tracing:tracing:1.1.0",
+ "org.jetbrains.kotlin:kotlin-stdlib:1.9.0-Beta"
+ ],
+ "file": "v1/https/maven.google.com/androidx/test/monitor/1.7.0-alpha01/monitor-1.7.0-alpha01.aar",
+ "mirror_urls": [
+ "https://maven.google.com/androidx/test/monitor/1.7.0-alpha01/monitor-1.7.0-alpha01.aar",
+ "https://repo1.maven.org/maven2/androidx/test/monitor/1.7.0-alpha01/monitor-1.7.0-alpha01.aar"
+ ],
+ "sha256": "a78d9b7db40ad49e1e944cccf28b8f9b729e2e0200587aa88b0472b5ec004ee0",
+ "url": "https://maven.google.com/androidx/test/monitor/1.7.0-alpha01/monitor-1.7.0-alpha01.aar"
+ },
+ {
+ "coord": "androidx.tracing:tracing:1.1.0",
+ "dependencies": [
+ "androidx.annotation:annotation:1.3.0"
+ ],
+ "directDependencies": [
+ "androidx.annotation:annotation:1.3.0"
+ ],
+ "file": "v1/https/maven.google.com/androidx/tracing/tracing/1.1.0/tracing-1.1.0.aar",
+ "mirror_urls": [
+ "https://maven.google.com/androidx/tracing/tracing/1.1.0/tracing-1.1.0.aar",
+ "https://repo1.maven.org/maven2/androidx/tracing/tracing/1.1.0/tracing-1.1.0.aar"
+ ],
+ "sha256": "5b78e2c618fc10b3d14decc01df76158f15954ad746aacf0607766721da081f6",
+ "url": "https://maven.google.com/androidx/tracing/tracing/1.1.0/tracing-1.1.0.aar"
+ },
+ {
+ "coord": "com.almworks.sqlite4java:sqlite4java:1.0.392",
+ "dependencies": [],
+ "directDependencies": [],
+ "file": "v1/https/repo1.maven.org/maven2/com/almworks/sqlite4java/sqlite4java/1.0.392/sqlite4java-1.0.392.jar",
+ "mirror_urls": [
+ "https://maven.google.com/com/almworks/sqlite4java/sqlite4java/1.0.392/sqlite4java-1.0.392.jar",
+ "https://repo1.maven.org/maven2/com/almworks/sqlite4java/sqlite4java/1.0.392/sqlite4java-1.0.392.jar"
+ ],
+ "sha256": "243a64470fda0e86a6fddeb0af4c7aa9426ce84e68cbfe18d75ee5da4b7e0b92",
+ "url": "https://repo1.maven.org/maven2/com/almworks/sqlite4java/sqlite4java/1.0.392/sqlite4java-1.0.392.jar"
+ },
+ {
+ "coord": "com.android.databinding:baseLibrary:8.2.0-alpha15",
+ "dependencies": [],
+ "directDependencies": [],
+ "file": "v1/https/maven.google.com/com/android/databinding/baseLibrary/8.2.0-alpha15/baseLibrary-8.2.0-alpha15.jar",
+ "mirror_urls": [
+ "https://maven.google.com/com/android/databinding/baseLibrary/8.2.0-alpha15/baseLibrary-8.2.0-alpha15.jar",
+ "https://repo1.maven.org/maven2/com/android/databinding/baseLibrary/8.2.0-alpha15/baseLibrary-8.2.0-alpha15.jar"
+ ],
+ "sha256": "794113709dab21b06c262b3795e73cb708fbacae61715f34361e1af6237a1870",
+ "url": "https://maven.google.com/com/android/databinding/baseLibrary/8.2.0-alpha15/baseLibrary-8.2.0-alpha15.jar"
+ },
+ {
+ "coord": "com.android.tools.analytics-library:crash:31.2.0-alpha15",
+ "dependencies": [
+ "org.apache.httpcomponents:httpclient:4.5.14",
+ "commons-logging:commons-logging:1.2",
+ "com.google.guava:guava:32.1.2-jre",
+ "commons-codec:commons-codec:1.11",
+ "org.apache.httpcomponents:httpmime:4.5.6",
+ "org.apache.httpcomponents:httpcore:4.4.16",
+ "com.android.tools:annotations:31.2.0-alpha15"
+ ],
+ "directDependencies": [
+ "org.apache.httpcomponents:httpclient:4.5.14",
+ "com.google.guava:guava:32.1.2-jre",
+ "org.apache.httpcomponents:httpmime:4.5.6",
+ "org.apache.httpcomponents:httpcore:4.4.16",
+ "com.android.tools:annotations:31.2.0-alpha15"
+ ],
+ "file": "v1/https/maven.google.com/com/android/tools/analytics-library/crash/31.2.0-alpha15/crash-31.2.0-alpha15.jar",
+ "mirror_urls": [
+ "https://maven.google.com/com/android/tools/analytics-library/crash/31.2.0-alpha15/crash-31.2.0-alpha15.jar",
+ "https://repo1.maven.org/maven2/com/android/tools/analytics-library/crash/31.2.0-alpha15/crash-31.2.0-alpha15.jar"
+ ],
+ "sha256": "d5be79bfa90311d39dd767516539afa122f9d40bc1e4bd8fc76e07b8151379f3",
+ "url": "https://maven.google.com/com/android/tools/analytics-library/crash/31.2.0-alpha15/crash-31.2.0-alpha15.jar"
+ },
+ {
+ "coord": "com.android.tools.analytics-library:protos:31.2.0-alpha15",
+ "dependencies": [
+ "com.google.protobuf:protobuf-java:3.21.8"
+ ],
+ "directDependencies": [
+ "com.google.protobuf:protobuf-java:3.21.8"
+ ],
+ "file": "v1/https/maven.google.com/com/android/tools/analytics-library/protos/31.2.0-alpha15/protos-31.2.0-alpha15.jar",
+ "mirror_urls": [
+ "https://maven.google.com/com/android/tools/analytics-library/protos/31.2.0-alpha15/protos-31.2.0-alpha15.jar",
+ "https://repo1.maven.org/maven2/com/android/tools/analytics-library/protos/31.2.0-alpha15/protos-31.2.0-alpha15.jar"
+ ],
+ "sha256": "28024d2d414db7be4cd175868288fd8a9ca01de3526caa34c4d07497510035c2",
+ "url": "https://maven.google.com/com/android/tools/analytics-library/protos/31.2.0-alpha15/protos-31.2.0-alpha15.jar"
+ },
+ {
+ "coord": "com.android.tools.analytics-library:shared:31.2.0-alpha15",
+ "dependencies": [
+ "com.android.tools:common:31.2.0-alpha15",
+ "org.jetbrains.kotlin:kotlin-stdlib:1.9.0-Beta",
+ "org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.9.0-Beta",
+ "com.google.guava:guava:32.1.2-jre",
+ "org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.9.0-Beta",
+ "net.java.dev.jna:jna:5.6.0",
+ "org.jetbrains.kotlin:kotlin-stdlib-common:1.9.0-Beta",
+ "com.android.tools.analytics-library:protos:31.2.0-alpha15",
+ "com.google.protobuf:protobuf-java:3.21.8",
+ "com.google.code.gson:gson:2.10",
+ "net.java.dev.jna:jna-platform:5.6.0",
+ "org.jetbrains:annotations:13.0",
+ "com.android.tools:annotations:31.2.0-alpha15"
+ ],
+ "directDependencies": [
+ "com.android.tools:common:31.2.0-alpha15",
+ "com.google.guava:guava:32.1.2-jre",
+ "org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.9.0-Beta",
+ "com.android.tools.analytics-library:protos:31.2.0-alpha15",
+ "com.google.code.gson:gson:2.10",
+ "net.java.dev.jna:jna-platform:5.6.0",
+ "com.android.tools:annotations:31.2.0-alpha15"
+ ],
+ "file": "v1/https/maven.google.com/com/android/tools/analytics-library/shared/31.2.0-alpha15/shared-31.2.0-alpha15.jar",
+ "mirror_urls": [
+ "https://maven.google.com/com/android/tools/analytics-library/shared/31.2.0-alpha15/shared-31.2.0-alpha15.jar",
+ "https://repo1.maven.org/maven2/com/android/tools/analytics-library/shared/31.2.0-alpha15/shared-31.2.0-alpha15.jar"
+ ],
+ "sha256": "7bd455bda29e1528cda4153332b708ed2d0066dce68f60a51be11f529fabdd77",
+ "url": "https://maven.google.com/com/android/tools/analytics-library/shared/31.2.0-alpha15/shared-31.2.0-alpha15.jar"
+ },
+ {
+ "coord": "com.android.tools.analytics-library:tracker:31.2.0-alpha15",
+ "dependencies": [
+ "com.android.tools:common:31.2.0-alpha15",
+ "org.jetbrains.kotlin:kotlin-stdlib:1.9.0-Beta",
+ "org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.9.0-Beta",
+ "com.google.guava:guava:32.1.2-jre",
+ "org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.9.0-Beta",
+ "net.java.dev.jna:jna:5.6.0",
+ "com.android.tools.analytics-library:shared:31.2.0-alpha15",
+ "org.jetbrains.kotlin:kotlin-stdlib-common:1.9.0-Beta",
+ "com.android.tools.analytics-library:protos:31.2.0-alpha15",
+ "com.google.protobuf:protobuf-java:3.21.8",
+ "com.google.code.gson:gson:2.10",
+ "net.java.dev.jna:jna-platform:5.6.0",
+ "org.jetbrains:annotations:13.0",
+ "com.android.tools:annotations:31.2.0-alpha15"
+ ],
+ "directDependencies": [
+ "com.android.tools:common:31.2.0-alpha15",
+ "com.google.guava:guava:32.1.2-jre",
+ "org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.9.0-Beta",
+ "com.android.tools.analytics-library:shared:31.2.0-alpha15",
+ "com.android.tools.analytics-library:protos:31.2.0-alpha15",
+ "com.google.protobuf:protobuf-java:3.21.8",
+ "com.android.tools:annotations:31.2.0-alpha15"
+ ],
+ "file": "v1/https/maven.google.com/com/android/tools/analytics-library/tracker/31.2.0-alpha15/tracker-31.2.0-alpha15.jar",
+ "mirror_urls": [
+ "https://maven.google.com/com/android/tools/analytics-library/tracker/31.2.0-alpha15/tracker-31.2.0-alpha15.jar",
+ "https://repo1.maven.org/maven2/com/android/tools/analytics-library/tracker/31.2.0-alpha15/tracker-31.2.0-alpha15.jar"
+ ],
+ "sha256": "d49b8cd42f041f9a68863110a3e92d1fd892273f458a72474f5d3bbe16646910",
+ "url": "https://maven.google.com/com/android/tools/analytics-library/tracker/31.2.0-alpha15/tracker-31.2.0-alpha15.jar"
+ },
+ {
+ "coord": "com.android.tools.build.jetifier:jetifier-core:1.0.0-beta10",
+ "dependencies": [
+ "com.google.code.gson:gson:2.10",
+ "org.jetbrains.kotlin:kotlin-stdlib:1.9.0-Beta"
+ ],
+ "directDependencies": [
+ "com.google.code.gson:gson:2.10",
+ "org.jetbrains.kotlin:kotlin-stdlib:1.9.0-Beta"
+ ],
+ "file": "v1/https/maven.google.com/com/android/tools/build/jetifier/jetifier-core/1.0.0-beta10/jetifier-core-1.0.0-beta10.jar",
+ "mirror_urls": [
+ "https://maven.google.com/com/android/tools/build/jetifier/jetifier-core/1.0.0-beta10/jetifier-core-1.0.0-beta10.jar",
+ "https://repo1.maven.org/maven2/com/android/tools/build/jetifier/jetifier-core/1.0.0-beta10/jetifier-core-1.0.0-beta10.jar"
+ ],
+ "sha256": "26abb4a13927d9062169c504c9e94fe80e9ae3a4f7b5ab8875ab007536a91f5e",
+ "url": "https://maven.google.com/com/android/tools/build/jetifier/jetifier-core/1.0.0-beta10/jetifier-core-1.0.0-beta10.jar"
+ },
+ {
+ "coord": "com.android.tools.build.jetifier:jetifier-processor:1.0.0-beta10",
+ "dependencies": [
+ "org.jetbrains.kotlin:kotlin-stdlib:1.9.0-Beta",
+ "org.jdom:jdom2:2.0.6",
+ "org.ow2.asm:asm-util:9.5",
+ "org.ow2.asm:asm-commons:9.5",
+ "org.ow2.asm:asm:9.5",
+ "com.google.code.gson:gson:2.10",
+ "com.android.tools.build.jetifier:jetifier-core:1.0.0-beta10"
+ ],
+ "directDependencies": [
+ "org.jetbrains.kotlin:kotlin-stdlib:1.9.0-Beta",
+ "org.jdom:jdom2:2.0.6",
+ "org.ow2.asm:asm-util:9.5",
+ "org.ow2.asm:asm-commons:9.5",
+ "org.ow2.asm:asm:9.5",
+ "com.android.tools.build.jetifier:jetifier-core:1.0.0-beta10"
+ ],
+ "file": "v1/https/maven.google.com/com/android/tools/build/jetifier/jetifier-processor/1.0.0-beta10/jetifier-processor-1.0.0-beta10.jar",
+ "mirror_urls": [
+ "https://maven.google.com/com/android/tools/build/jetifier/jetifier-processor/1.0.0-beta10/jetifier-processor-1.0.0-beta10.jar",
+ "https://repo1.maven.org/maven2/com/android/tools/build/jetifier/jetifier-processor/1.0.0-beta10/jetifier-processor-1.0.0-beta10.jar"
+ ],
+ "sha256": "c5067a7b928237a1271a5e9cb5710e9f80b4973293945bc51e3a4c864ea4bfed",
+ "url": "https://maven.google.com/com/android/tools/build/jetifier/jetifier-processor/1.0.0-beta10/jetifier-processor-1.0.0-beta10.jar"
+ },
+ {
+ "coord": "com.android.tools.build:aapt2-proto:8.2.0-alpha15-10154469",
+ "dependencies": [
+ "com.google.protobuf:protobuf-java:3.21.8"
+ ],
+ "directDependencies": [
+ "com.google.protobuf:protobuf-java:3.21.8"
+ ],
+ "file": "v1/https/maven.google.com/com/android/tools/build/aapt2-proto/8.2.0-alpha15-10154469/aapt2-proto-8.2.0-alpha15-10154469.jar",
+ "mirror_urls": [
+ "https://maven.google.com/com/android/tools/build/aapt2-proto/8.2.0-alpha15-10154469/aapt2-proto-8.2.0-alpha15-10154469.jar",
+ "https://repo1.maven.org/maven2/com/android/tools/build/aapt2-proto/8.2.0-alpha15-10154469/aapt2-proto-8.2.0-alpha15-10154469.jar"
+ ],
+ "sha256": "fd5dbba33bf0ea245dd9f98499632d0cde74d0f61952f213eba94a41a9d1759a",
+ "url": "https://maven.google.com/com/android/tools/build/aapt2-proto/8.2.0-alpha15-10154469/aapt2-proto-8.2.0-alpha15-10154469.jar"
+ },
+ {
+ "coord": "com.android.tools.build:aaptcompiler:8.2.0-alpha15",
+ "dependencies": [
+ "com.android.tools:common:31.2.0-alpha15",
+ "org.jetbrains.kotlin:kotlin-stdlib:1.9.0-Beta",
+ "org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.9.0-Beta",
+ "com.google.guava:guava:32.1.2-jre",
+ "org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.9.0-Beta",
+ "net.java.dev.jna:jna:5.6.0",
+ "com.android.tools.build:aapt2-proto:8.2.0-alpha15-10154469",
+ "org.jetbrains.kotlin:kotlin-stdlib-common:1.9.0-Beta",
+ "com.android.tools.layoutlib:layoutlib-api:31.2.0-alpha15",
+ "com.google.protobuf:protobuf-java:3.21.8",
+ "net.sf.kxml:kxml2:2.3.0",
+ "net.java.dev.jna:jna-platform:5.6.0",
+ "org.jetbrains:annotations:13.0",
+ "com.android.tools:annotations:31.2.0-alpha15"
+ ],
+ "directDependencies": [
+ "com.android.tools:common:31.2.0-alpha15",
+ "com.google.guava:guava:32.1.2-jre",
+ "org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.9.0-Beta",
+ "com.android.tools.build:aapt2-proto:8.2.0-alpha15-10154469",
+ "com.android.tools.layoutlib:layoutlib-api:31.2.0-alpha15",
+ "com.google.protobuf:protobuf-java:3.21.8"
+ ],
+ "file": "v1/https/maven.google.com/com/android/tools/build/aaptcompiler/8.2.0-alpha15/aaptcompiler-8.2.0-alpha15.jar",
+ "mirror_urls": [
+ "https://maven.google.com/com/android/tools/build/aaptcompiler/8.2.0-alpha15/aaptcompiler-8.2.0-alpha15.jar",
+ "https://repo1.maven.org/maven2/com/android/tools/build/aaptcompiler/8.2.0-alpha15/aaptcompiler-8.2.0-alpha15.jar"
+ ],
+ "sha256": "79d170fcded61ae5ec5543038a2a81764ba94f6d405616a386aca4c5750b9626",
+ "url": "https://maven.google.com/com/android/tools/build/aaptcompiler/8.2.0-alpha15/aaptcompiler-8.2.0-alpha15.jar"
+ },
+ {
+ "coord": "com.android.tools.build:apksig:8.2.0-alpha15",
+ "dependencies": [],
+ "directDependencies": [],
+ "file": "v1/https/maven.google.com/com/android/tools/build/apksig/8.2.0-alpha15/apksig-8.2.0-alpha15.jar",
+ "mirror_urls": [
+ "https://maven.google.com/com/android/tools/build/apksig/8.2.0-alpha15/apksig-8.2.0-alpha15.jar",
+ "https://repo1.maven.org/maven2/com/android/tools/build/apksig/8.2.0-alpha15/apksig-8.2.0-alpha15.jar"
+ ],
+ "sha256": "468ee1852fa12461c6629608fe47be70e50f60be7c4744bb7f62ca48e85c0a6c",
+ "url": "https://maven.google.com/com/android/tools/build/apksig/8.2.0-alpha15/apksig-8.2.0-alpha15.jar"
+ },
+ {
+ "coord": "com.android.tools.build:apkzlib:8.2.0-alpha15",
+ "dependencies": [
+ "org.bouncycastle:bcprov-jdk15on:jar:1.67",
+ "com.google.guava:guava:32.1.2-jre",
+ "com.google.code.findbugs:jsr305:3.0.2",
+ "com.android.tools.build:apksig:8.2.0-alpha15",
+ "org.bouncycastle:bcpkix-jdk15on:1.67",
+ "org.bouncycastle:bcprov-jdk15on:1.67"
+ ],
+ "directDependencies": [
+ "com.google.guava:guava:32.1.2-jre",
+ "com.google.code.findbugs:jsr305:3.0.2",
+ "com.android.tools.build:apksig:8.2.0-alpha15",
+ "org.bouncycastle:bcpkix-jdk15on:1.67",
+ "org.bouncycastle:bcprov-jdk15on:1.67"
+ ],
+ "file": "v1/https/maven.google.com/com/android/tools/build/apkzlib/8.2.0-alpha15/apkzlib-8.2.0-alpha15.jar",
+ "mirror_urls": [
+ "https://maven.google.com/com/android/tools/build/apkzlib/8.2.0-alpha15/apkzlib-8.2.0-alpha15.jar",
+ "https://repo1.maven.org/maven2/com/android/tools/build/apkzlib/8.2.0-alpha15/apkzlib-8.2.0-alpha15.jar"
+ ],
+ "sha256": "1c1a67d6f4f186427ac166ebaa0dd867f595d5144fc925252b05ffb9d1a156b7",
+ "url": "https://maven.google.com/com/android/tools/build/apkzlib/8.2.0-alpha15/apkzlib-8.2.0-alpha15.jar"
+ },
+ {
+ "coord": "com.android.tools.build:builder-model:8.2.0-alpha15",
+ "dependencies": [
+ "org.jetbrains.kotlin:kotlin-stdlib:1.9.0-Beta",
+ "org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.9.0-Beta",
+ "org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.9.0-Beta",
+ "org.jetbrains.kotlin:kotlin-stdlib-common:1.9.0-Beta",
+ "org.jetbrains:annotations:13.0",
+ "com.android.tools:annotations:31.2.0-alpha15"
+ ],
+ "directDependencies": [
+ "com.android.tools:annotations:31.2.0-alpha15",
+ "org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.9.0-Beta"
+ ],
+ "file": "v1/https/maven.google.com/com/android/tools/build/builder-model/8.2.0-alpha15/builder-model-8.2.0-alpha15.jar",
+ "mirror_urls": [
+ "https://maven.google.com/com/android/tools/build/builder-model/8.2.0-alpha15/builder-model-8.2.0-alpha15.jar",
+ "https://repo1.maven.org/maven2/com/android/tools/build/builder-model/8.2.0-alpha15/builder-model-8.2.0-alpha15.jar"
+ ],
+ "sha256": "e73525c88b1cd5b3f850d3c3720e189e0c05c50a9708c8f6b92b9e3851ca2c3d",
+ "url": "https://maven.google.com/com/android/tools/build/builder-model/8.2.0-alpha15/builder-model-8.2.0-alpha15.jar"
+ },
+ {
+ "coord": "com.android.tools.build:builder-test-api:8.2.0-alpha15",
+ "dependencies": [
+ "com.android.tools:common:31.2.0-alpha15",
+ "org.jetbrains.kotlin:kotlin-stdlib:1.9.0-Beta",
+ "org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.9.0-Beta",
+ "com.google.guava:guava:32.1.2-jre",
+ "org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.9.0-Beta",
+ "com.android.tools.ddms:ddmlib:31.2.0-alpha15",
+ "net.java.dev.jna:jna:5.6.0",
+ "org.jetbrains.kotlin:kotlin-stdlib-common:1.9.0-Beta",
+ "com.google.protobuf:protobuf-java:3.21.8",
+ "net.sf.kxml:kxml2:2.3.0",
+ "net.java.dev.jna:jna-platform:5.6.0",
+ "org.jetbrains:annotations:13.0",
+ "com.android.tools:annotations:31.2.0-alpha15"
+ ],
+ "directDependencies": [
+ "com.android.tools:annotations:31.2.0-alpha15",
+ "com.android.tools:common:31.2.0-alpha15",
+ "com.android.tools.ddms:ddmlib:31.2.0-alpha15",
+ "com.google.guava:guava:32.1.2-jre"
+ ],
+ "file": "v1/https/maven.google.com/com/android/tools/build/builder-test-api/8.2.0-alpha15/builder-test-api-8.2.0-alpha15.jar",
+ "mirror_urls": [
+ "https://maven.google.com/com/android/tools/build/builder-test-api/8.2.0-alpha15/builder-test-api-8.2.0-alpha15.jar",
+ "https://repo1.maven.org/maven2/com/android/tools/build/builder-test-api/8.2.0-alpha15/builder-test-api-8.2.0-alpha15.jar"
+ ],
+ "sha256": "2c61d0490356050f2789765a17f168e284ce99f878992328aad57d7b9f498317",
+ "url": "https://maven.google.com/com/android/tools/build/builder-test-api/8.2.0-alpha15/builder-test-api-8.2.0-alpha15.jar"
+ },
+ {
+ "coord": "com.android.tools.build:builder:8.2.0-alpha15",
+ "dependencies": [
+ "com.android.tools:common:31.2.0-alpha15",
+ "org.jetbrains.kotlin:kotlin-stdlib:1.9.0-Beta",
+ "jakarta.activation:jakarta.activation-api:1.2.1",
+ "com.android.tools:dvlib:31.2.0-alpha15",
+ "org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.9.0-Beta",
+ "org.apache.commons:commons-compress:1.21",
+ "org.apache.httpcomponents:httpclient:4.5.14",
+ "org.bouncycastle:bcprov-jdk15on:jar:1.67",
+ "com.google.guava:guava:32.1.2-jre",
+ "com.google.code.findbugs:jsr305:3.0.2",
+ "org.glassfish.jaxb:jaxb-runtime:2.3.2",
+ "org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.9.0-Beta",
+ "org.glassfish.jaxb:txw2:2.3.2",
+ "com.android.tools.build:builder-model:8.2.0-alpha15",
+ "com.android.tools.build:apkzlib:8.2.0-alpha15",
+ "jakarta.xml.bind:jakarta.xml.bind-api:2.3.2",
+ "org.ow2.asm:asm-commons:9.5",
+ "commons-codec:commons-codec:1.11",
+ "com.android:zipflinger:8.2.0-alpha15",
+ "com.google.jimfs:jimfs:1.1",
+ "com.android.tools.ddms:ddmlib:31.2.0-alpha15",
+ "com.sun.xml.fastinfoset:FastInfoset:1.2.16",
+ "com.android.tools.analytics-library:tracker:31.2.0-alpha15",
+ "com.android.tools.build:manifest-merger:31.2.0-alpha15",
+ "com.android.tools:sdk-common:31.2.0-alpha15",
+ "net.java.dev.jna:jna:5.6.0",
+ "com.android.tools.build:aapt2-proto:8.2.0-alpha15-10154469",
+ "org.apache.httpcomponents:httpmime:4.5.6",
+ "org.jvnet.staxex:stax-ex:1.8.1",
+ "xerces:xercesImpl:2.12.0",
+ "com.android.tools.analytics-library:shared:31.2.0-alpha15",
+ "com.android.tools.build:apksig:8.2.0-alpha15",
+ "org.jetbrains.kotlin:kotlin-stdlib-common:1.9.0-Beta",
+ "com.android.tools.build:builder-test-api:8.2.0-alpha15",
+ "com.android.tools.layoutlib:layoutlib-api:31.2.0-alpha15",
+ "com.android.tools.analytics-library:protos:31.2.0-alpha15",
+ "com.sun.istack:istack-commons-runtime:3.0.8",
+ "org.jetbrains.kotlin:kotlin-reflect:1.9.0-Beta",
+ "com.squareup:javawriter:2.5.0",
+ "com.google.protobuf:protobuf-java:3.21.8",
+ "com.android.tools:sdklib:31.2.0-alpha15",
+ "com.google.code.gson:gson:2.10",
+ "org.bouncycastle:bcpkix-jdk15on:1.67",
+ "javax.inject:javax.inject:1",
+ "org.jetbrains.intellij.deps:trove4j:1.0.20200330",
+ "com.sun.activation:javax.activation:1.2.0",
+ "net.sf.kxml:kxml2:2.3.0",
+ "com.android:signflinger:8.2.0-alpha15",
+ "net.java.dev.jna:jna-platform:5.6.0",
+ "org.apache.httpcomponents:httpcore:4.4.16",
+ "org.jetbrains:annotations:13.0",
+ "com.android.tools:annotations:31.2.0-alpha15",
+ "org.bouncycastle:bcprov-jdk15on:1.67",
+ "xml-apis:xml-apis:1.4.01",
+ "com.android.tools:repository:31.2.0-alpha15"
+ ],
+ "directDependencies": [
+ "com.android.tools:common:31.2.0-alpha15",
+ "org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.9.0-Beta",
+ "com.android.tools.build:builder-model:8.2.0-alpha15",
+ "com.android.tools.build:apkzlib:8.2.0-alpha15",
+ "org.ow2.asm:asm-commons:9.5",
+ "commons-codec:commons-codec:1.11",
+ "com.android:zipflinger:8.2.0-alpha15",
+ "com.android.tools.ddms:ddmlib:31.2.0-alpha15",
+ "com.android.tools.analytics-library:tracker:31.2.0-alpha15",
+ "com.android.tools.build:manifest-merger:31.2.0-alpha15",
+ "com.android.tools:sdk-common:31.2.0-alpha15",
+ "com.android.tools.build:apksig:8.2.0-alpha15",
+ "com.android.tools.build:builder-test-api:8.2.0-alpha15",
+ "com.android.tools.layoutlib:layoutlib-api:31.2.0-alpha15",
+ "com.android.tools.analytics-library:protos:31.2.0-alpha15",
+ "com.squareup:javawriter:2.5.0",
+ "com.android.tools:sdklib:31.2.0-alpha15",
+ "org.bouncycastle:bcpkix-jdk15on:1.67",
+ "javax.inject:javax.inject:1",
+ "com.android:signflinger:8.2.0-alpha15",
+ "org.bouncycastle:bcprov-jdk15on:1.67"
+ ],
+ "file": "v1/https/maven.google.com/com/android/tools/build/builder/8.2.0-alpha15/builder-8.2.0-alpha15.jar",
+ "mirror_urls": [
+ "https://maven.google.com/com/android/tools/build/builder/8.2.0-alpha15/builder-8.2.0-alpha15.jar",
+ "https://repo1.maven.org/maven2/com/android/tools/build/builder/8.2.0-alpha15/builder-8.2.0-alpha15.jar"
+ ],
+ "sha256": "d3c737fe6c23182b5ce95e9c90ec1b14d8374642dd3c0cce8b9d7986d1dc8506",
+ "url": "https://maven.google.com/com/android/tools/build/builder/8.2.0-alpha15/builder-8.2.0-alpha15.jar"
+ },
+ {
+ "coord": "com.android.tools.build:bundletool:1.15.2",
+ "dependencies": [
+ "com.google.errorprone:error_prone_annotations:2.19.1",
+ "com.google.guava:guava:32.1.2-jre",
+ "com.google.dagger:dagger:2.28.3",
+ "org.slf4j:slf4j-api:1.7.30",
+ "com.android.tools.build:aapt2-proto:8.2.0-alpha15-10154469",
+ "com.google.protobuf:protobuf-java-util:3.19.3",
+ "com.google.protobuf:protobuf-java:3.21.8",
+ "com.google.auto.value:auto-value-annotations:1.10.1",
+ "javax.inject:javax.inject:1",
+ "org.bitbucket.b_c:jose4j:0.7.0"
+ ],
+ "directDependencies": [
+ "com.google.errorprone:error_prone_annotations:2.19.1",
+ "com.google.guava:guava:32.1.2-jre",
+ "com.google.dagger:dagger:2.28.3",
+ "org.slf4j:slf4j-api:1.7.30",
+ "com.android.tools.build:aapt2-proto:8.2.0-alpha15-10154469",
+ "com.google.protobuf:protobuf-java-util:3.19.3",
+ "com.google.protobuf:protobuf-java:3.21.8",
+ "com.google.auto.value:auto-value-annotations:1.10.1",
+ "javax.inject:javax.inject:1",
+ "org.bitbucket.b_c:jose4j:0.7.0"
+ ],
+ "file": "v1/https/maven.google.com/com/android/tools/build/bundletool/1.15.2/bundletool-1.15.2.jar",
+ "mirror_urls": [
+ "https://maven.google.com/com/android/tools/build/bundletool/1.15.2/bundletool-1.15.2.jar",
+ "https://repo1.maven.org/maven2/com/android/tools/build/bundletool/1.15.2/bundletool-1.15.2.jar"
+ ],
+ "sha256": "2034ae754f0ad6f544ab1f203b5df71e5d27f6113e5509a3185f7c2241005b2b",
+ "url": "https://maven.google.com/com/android/tools/build/bundletool/1.15.2/bundletool-1.15.2.jar"
+ },
+ {
+ "coord": "com.android.tools.build:gradle-api:8.2.0-alpha15",
+ "dependencies": [
+ "com.android.tools:common:31.2.0-alpha15",
+ "org.jetbrains.kotlin:kotlin-stdlib:1.9.0-Beta",
+ "org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.9.0-Beta",
+ "com.google.guava:guava:32.1.2-jre",
+ "org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.9.0-Beta",
+ "com.android.tools.ddms:ddmlib:31.2.0-alpha15",
+ "net.java.dev.jna:jna:5.6.0",
+ "org.ow2.asm:asm:9.5",
+ "org.jetbrains.kotlin:kotlin-stdlib-common:1.9.0-Beta",
+ "com.android.tools.build:builder-test-api:8.2.0-alpha15",
+ "com.google.protobuf:protobuf-java:3.21.8",
+ "net.sf.kxml:kxml2:2.3.0",
+ "net.java.dev.jna:jna-platform:5.6.0",
+ "org.jetbrains:annotations:13.0",
+ "com.android.tools:annotations:31.2.0-alpha15"
+ ],
+ "directDependencies": [
+ "com.android.tools.build:builder-test-api:8.2.0-alpha15",
+ "com.google.guava:guava:32.1.2-jre",
+ "org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.9.0-Beta",
+ "org.ow2.asm:asm:9.5"
+ ],
+ "file": "v1/https/maven.google.com/com/android/tools/build/gradle-api/8.2.0-alpha15/gradle-api-8.2.0-alpha15.jar",
+ "mirror_urls": [
+ "https://maven.google.com/com/android/tools/build/gradle-api/8.2.0-alpha15/gradle-api-8.2.0-alpha15.jar",
+ "https://repo1.maven.org/maven2/com/android/tools/build/gradle-api/8.2.0-alpha15/gradle-api-8.2.0-alpha15.jar"
+ ],
+ "sha256": "75aff4be8085f49f7be4f6a393a2c308b3b91074b04fe128edc478ee34c6a7b4",
+ "url": "https://maven.google.com/com/android/tools/build/gradle-api/8.2.0-alpha15/gradle-api-8.2.0-alpha15.jar"
+ },
+ {
+ "coord": "com.android.tools.build:gradle-settings-api:8.2.0-alpha15",
+ "dependencies": [
+ "org.jetbrains.kotlin:kotlin-stdlib:1.9.0-Beta",
+ "org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.9.0-Beta",
+ "org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.9.0-Beta",
+ "org.jetbrains.kotlin:kotlin-stdlib-common:1.9.0-Beta",
+ "org.jetbrains:annotations:13.0"
+ ],
+ "directDependencies": [
+ "org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.9.0-Beta"
+ ],
+ "file": "v1/https/maven.google.com/com/android/tools/build/gradle-settings-api/8.2.0-alpha15/gradle-settings-api-8.2.0-alpha15.jar",
+ "mirror_urls": [
+ "https://maven.google.com/com/android/tools/build/gradle-settings-api/8.2.0-alpha15/gradle-settings-api-8.2.0-alpha15.jar",
+ "https://repo1.maven.org/maven2/com/android/tools/build/gradle-settings-api/8.2.0-alpha15/gradle-settings-api-8.2.0-alpha15.jar"
+ ],
+ "sha256": "13dbd5a223fd2c7646f815fc30a45bc2ee119602a151fa31e5d3036ec0a0fab3",
+ "url": "https://maven.google.com/com/android/tools/build/gradle-settings-api/8.2.0-alpha15/gradle-settings-api-8.2.0-alpha15.jar"
+ },
+ {
+ "coord": "com.android.tools.build:gradle:8.2.0-alpha15",
+ "dependencies": [
+ "com.android.tools:common:31.2.0-alpha15",
+ "org.jetbrains.kotlin:kotlin-stdlib:1.9.0-Beta",
+ "com.google.errorprone:error_prone_annotations:2.19.1",
+ "io.grpc:grpc-protobuf-lite:1.45.1",
+ "androidx.databinding:databinding-compiler-common:8.2.0-alpha15",
+ "com.android.tools.utp:android-test-plugin-host-apk-installer-proto:31.2.0-alpha15",
+ "jakarta.activation:jakarta.activation-api:1.2.1",
+ "io.grpc:grpc-stub:1.45.1",
+ "com.android.tools.utp:android-test-plugin-result-listener-gradle-proto:31.2.0-alpha15",
+ "org.jdom:jdom2:2.0.6",
+ "com.android.tools:dvlib:31.2.0-alpha15",
+ "org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.9.0-Beta",
+ "com.google.j2objc:j2objc-annotations:2.8",
+ "com.android.tools.utp:android-test-plugin-host-coverage-proto:31.2.0-alpha15",
+ "org.apache.commons:commons-compress:1.21",
+ "org.apache.httpcomponents:httpclient:4.5.14",
+ "com.android.tools.utp:android-device-provider-gradle-proto:31.2.0-alpha15",
+ "io.grpc:grpc-core:1.45.1",
+ "org.bouncycastle:bcprov-jdk15on:jar:1.67",
+ "commons-logging:commons-logging:1.2",
+ "com.android.databinding:baseLibrary:8.2.0-alpha15",
+ "org.tensorflow:tensorflow-lite-metadata:0.1.0-rc2",
+ "com.google.guava:guava:32.1.2-jre",
+ "com.android.tools.utp:android-test-plugin-host-retention-proto:31.2.0-alpha15",
+ "io.netty:netty-transport:4.1.72.Final",
+ "com.google.testing.platform:core-proto:0.0.8-alpha08",
+ "com.google.code.findbugs:jsr305:3.0.2",
+ "com.google.dagger:dagger:2.28.3",
+ "com.android.tools.utp:android-test-plugin-host-additional-test-output-proto:31.2.0-alpha15",
+ "org.glassfish.jaxb:jaxb-runtime:2.3.2",
+ "com.android.tools.utp:android-device-provider-ddmlib-proto:31.2.0-alpha15",
+ "org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.9.0-Beta",
+ "org.glassfish.jaxb:txw2:2.3.2",
+ "com.android.tools.build:builder-model:8.2.0-alpha15",
+ "org.slf4j:slf4j-api:1.7.30",
+ "io.grpc:grpc-context:1.45.1",
+ "commons-io:commons-io:2.4",
+ "com.google.android:annotations:4.1.1.4",
+ "com.android.tools.build:apkzlib:8.2.0-alpha15",
+ "androidx.databinding:databinding-common:8.2.0-alpha15",
+ "com.android.tools.analytics-library:crash:31.2.0-alpha15",
+ "jakarta.xml.bind:jakarta.xml.bind-api:2.3.2",
+ "org.codehaus.mojo:animal-sniffer-annotations:1.19",
+ "com.google.flatbuffers:flatbuffers-java:1.12.0",
+ "io.perfmark:perfmark-api:0.23.0",
+ "com.googlecode.juniversalchardet:juniversalchardet:1.0.3",
+ "org.ow2.asm:asm-util:9.5",
+ "org.ow2.asm:asm-commons:9.5",
+ "commons-codec:commons-codec:1.11",
+ "com.android:zipflinger:8.2.0-alpha15",
+ "com.google.jimfs:jimfs:1.1",
+ "io.netty:netty-tcnative-classes:2.0.46.Final",
+ "com.android.tools.ddms:ddmlib:31.2.0-alpha15",
+ "com.sun.xml.fastinfoset:FastInfoset:1.2.16",
+ "com.android.tools.analytics-library:tracker:31.2.0-alpha15",
+ "com.squareup:javapoet:1.10.0",
+ "com.android.tools.build:manifest-merger:31.2.0-alpha15",
+ "com.google.crypto.tink:tink:1.7.0",
+ "com.android.tools:sdk-common:31.2.0-alpha15",
+ "io.grpc:grpc-netty:1.45.1",
+ "net.java.dev.jna:jna:5.6.0",
+ "com.android.tools.build:aapt2-proto:8.2.0-alpha15-10154469",
+ "io.grpc:grpc-protobuf:1.45.1",
+ "org.apache.httpcomponents:httpmime:4.5.6",
+ "org.jvnet.staxex:stax-ex:1.8.1",
+ "xerces:xercesImpl:2.12.0",
+ "com.android.tools.analytics-library:shared:31.2.0-alpha15",
+ "com.google.protobuf:protobuf-java-util:3.19.3",
+ "com.android.tools.build:builder:8.2.0-alpha15",
+ "io.grpc:grpc-api:1.45.1",
+ "com.android.tools.build:gradle-api:8.2.0-alpha15",
+ "org.ow2.asm:asm:9.5",
+ "com.android.tools.build:apksig:8.2.0-alpha15",
+ "org.jetbrains.kotlin:kotlin-stdlib-common:1.9.0-Beta",
+ "com.android.tools.lint:lint-typedef-remover:31.2.0-alpha15",
+ "com.android.tools.build:transform-api:2.0.0-deprecated-use-gradle-api",
+ "io.netty:netty-common:4.1.72.Final",
+ "com.android.tools.build:builder-test-api:8.2.0-alpha15",
+ "com.android.tools.layoutlib:layoutlib-api:31.2.0-alpha15",
+ "com.android.tools.build:aaptcompiler:8.2.0-alpha15",
+ "com.android.tools.build:gradle-settings-api:8.2.0-alpha15",
+ "com.android.tools.analytics-library:protos:31.2.0-alpha15",
+ "com.sun.istack:istack-commons-runtime:3.0.8",
+ "net.sf.jopt-simple:jopt-simple:4.9",
+ "org.ow2.asm:asm-tree:9.5",
+ "io.netty:netty-handler:4.1.72.Final",
+ "javax.annotation:javax.annotation-api:1.3.2",
+ "org.jetbrains.kotlin:kotlin-reflect:1.9.0-Beta",
+ "io.netty:netty-resolver:4.1.72.Final",
+ "com.squareup:javawriter:2.5.0",
+ "com.google.protobuf:protobuf-java:3.21.8",
+ "com.android.tools.build.jetifier:jetifier-processor:1.0.0-beta10",
+ "com.android.tools:sdklib:31.2.0-alpha15",
+ "com.google.auto.value:auto-value-annotations:1.10.1",
+ "com.google.code.gson:gson:2.10",
+ "org.bouncycastle:bcpkix-jdk15on:1.67",
+ "io.netty:netty-buffer:4.1.72.Final",
+ "javax.inject:javax.inject:1",
+ "org.jetbrains.intellij.deps:trove4j:1.0.20200330",
+ "com.android.tools.utp:android-test-plugin-host-emulator-control-proto:31.2.0-alpha15",
+ "com.sun.activation:javax.activation:1.2.0",
+ "com.google.api.grpc:proto-google-common-protos:2.0.1",
+ "net.sf.kxml:kxml2:2.3.0",
+ "io.netty:netty-codec-http2:4.1.72.Final",
+ "com.android.tools.utp:android-test-plugin-host-logcat-proto:31.2.0-alpha15",
+ "com.android:signflinger:8.2.0-alpha15",
+ "com.android.tools.lint:lint-model:31.2.0-alpha15",
+ "net.java.dev.jna:jna-platform:5.6.0",
+ "io.netty:netty-codec-http:4.1.72.Final",
+ "org.apache.httpcomponents:httpcore:4.4.16",
+ "com.android.tools.build:bundletool:1.15.2",
+ "io.netty:netty-handler-proxy:4.1.72.Final",
+ "io.netty:netty-codec-socks:4.1.72.Final",
+ "org.ow2.asm:asm-analysis:9.5",
+ "org.jetbrains:annotations:13.0",
+ "com.android.tools:annotations:31.2.0-alpha15",
+ "com.android.tools.build.jetifier:jetifier-core:1.0.0-beta10",
+ "org.checkerframework:checker-qual:3.35.0",
+ "org.bitbucket.b_c:jose4j:0.7.0",
+ "org.bouncycastle:bcprov-jdk15on:1.67",
+ "xml-apis:xml-apis:1.4.01",
+ "io.netty:netty-codec:4.1.72.Final",
+ "com.android.tools:repository:31.2.0-alpha15"
+ ],
+ "directDependencies": [
+ "androidx.databinding:databinding-compiler-common:8.2.0-alpha15",
+ "com.android.tools.utp:android-test-plugin-host-apk-installer-proto:31.2.0-alpha15",
+ "io.grpc:grpc-stub:1.45.1",
+ "com.android.tools.utp:android-test-plugin-result-listener-gradle-proto:31.2.0-alpha15",
+ "com.android.tools.utp:android-test-plugin-host-coverage-proto:31.2.0-alpha15",
+ "com.android.tools.utp:android-device-provider-gradle-proto:31.2.0-alpha15",
+ "io.grpc:grpc-core:1.45.1",
+ "com.android.databinding:baseLibrary:8.2.0-alpha15",
+ "org.tensorflow:tensorflow-lite-metadata:0.1.0-rc2",
+ "com.android.tools.utp:android-test-plugin-host-retention-proto:31.2.0-alpha15",
+ "com.google.testing.platform:core-proto:0.0.8-alpha08",
+ "com.android.tools.utp:android-test-plugin-host-additional-test-output-proto:31.2.0-alpha15",
+ "org.glassfish.jaxb:jaxb-runtime:2.3.2",
+ "com.android.tools.utp:android-device-provider-ddmlib-proto:31.2.0-alpha15",
+ "org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.9.0-Beta",
+ "com.android.tools.build:builder-model:8.2.0-alpha15",
+ "commons-io:commons-io:2.4",
+ "androidx.databinding:databinding-common:8.2.0-alpha15",
+ "com.android.tools.analytics-library:crash:31.2.0-alpha15",
+ "com.google.flatbuffers:flatbuffers-java:1.12.0",
+ "org.ow2.asm:asm-util:9.5",
+ "org.ow2.asm:asm-commons:9.5",
+ "com.android.tools.ddms:ddmlib:31.2.0-alpha15",
+ "com.squareup:javapoet:1.10.0",
+ "com.google.crypto.tink:tink:1.7.0",
+ "com.android.tools:sdk-common:31.2.0-alpha15",
+ "io.grpc:grpc-netty:1.45.1",
+ "com.android.tools.build:aapt2-proto:8.2.0-alpha15-10154469",
+ "io.grpc:grpc-protobuf:1.45.1",
+ "org.apache.httpcomponents:httpmime:4.5.6",
+ "com.android.tools.analytics-library:shared:31.2.0-alpha15",
+ "com.google.protobuf:protobuf-java-util:3.19.3",
+ "com.android.tools.build:builder:8.2.0-alpha15",
+ "com.android.tools.build:gradle-api:8.2.0-alpha15",
+ "org.ow2.asm:asm:9.5",
+ "com.android.tools.lint:lint-typedef-remover:31.2.0-alpha15",
+ "com.android.tools.build:transform-api:2.0.0-deprecated-use-gradle-api",
+ "com.android.tools.build:builder-test-api:8.2.0-alpha15",
+ "com.android.tools.layoutlib:layoutlib-api:31.2.0-alpha15",
+ "com.android.tools.build:aaptcompiler:8.2.0-alpha15",
+ "com.android.tools.build:gradle-settings-api:8.2.0-alpha15",
+ "net.sf.jopt-simple:jopt-simple:4.9",
+ "com.google.protobuf:protobuf-java:3.21.8",
+ "com.android.tools.build.jetifier:jetifier-processor:1.0.0-beta10",
+ "com.android.tools:sdklib:31.2.0-alpha15",
+ "com.google.code.gson:gson:2.10",
+ "org.bouncycastle:bcpkix-jdk15on:1.67",
+ "com.android.tools.utp:android-test-plugin-host-emulator-control-proto:31.2.0-alpha15",
+ "com.android.tools.utp:android-test-plugin-host-logcat-proto:31.2.0-alpha15",
+ "com.android.tools.lint:lint-model:31.2.0-alpha15",
+ "com.android.tools.build:bundletool:1.15.2",
+ "org.ow2.asm:asm-analysis:9.5",
+ "com.android.tools.build.jetifier:jetifier-core:1.0.0-beta10",
+ "com.android.tools:repository:31.2.0-alpha15"
+ ],
+ "file": "v1/https/maven.google.com/com/android/tools/build/gradle/8.2.0-alpha15/gradle-8.2.0-alpha15.jar",
+ "mirror_urls": [
+ "https://maven.google.com/com/android/tools/build/gradle/8.2.0-alpha15/gradle-8.2.0-alpha15.jar",
+ "https://repo1.maven.org/maven2/com/android/tools/build/gradle/8.2.0-alpha15/gradle-8.2.0-alpha15.jar"
+ ],
+ "sha256": "2ac41b12abd4fd0811323e95b26304a192f4a4d41298d433e40a53f6ca5c4de0",
+ "url": "https://maven.google.com/com/android/tools/build/gradle/8.2.0-alpha15/gradle-8.2.0-alpha15.jar"
+ },
+ {
+ "coord": "com.android.tools.build:manifest-merger:31.2.0-alpha15",
+ "dependencies": [
+ "com.android.tools:common:31.2.0-alpha15",
+ "org.jetbrains.kotlin:kotlin-stdlib:1.9.0-Beta",
+ "jakarta.activation:jakarta.activation-api:1.2.1",
+ "com.android.tools:dvlib:31.2.0-alpha15",
+ "org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.9.0-Beta",
+ "org.apache.commons:commons-compress:1.21",
+ "org.apache.httpcomponents:httpclient:4.5.14",
+ "org.bouncycastle:bcprov-jdk15on:jar:1.67",
+ "com.google.guava:guava:32.1.2-jre",
+ "org.glassfish.jaxb:jaxb-runtime:2.3.2",
+ "org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.9.0-Beta",
+ "org.glassfish.jaxb:txw2:2.3.2",
+ "jakarta.xml.bind:jakarta.xml.bind-api:2.3.2",
+ "com.google.jimfs:jimfs:1.1",
+ "com.android.tools.ddms:ddmlib:31.2.0-alpha15",
+ "com.sun.xml.fastinfoset:FastInfoset:1.2.16",
+ "com.android.tools:sdk-common:31.2.0-alpha15",
+ "net.java.dev.jna:jna:5.6.0",
+ "com.android.tools.build:aapt2-proto:8.2.0-alpha15-10154469",
+ "org.apache.httpcomponents:httpmime:4.5.6",
+ "org.jvnet.staxex:stax-ex:1.8.1",
+ "xerces:xercesImpl:2.12.0",
+ "com.android.tools.analytics-library:shared:31.2.0-alpha15",
+ "org.jetbrains.kotlin:kotlin-stdlib-common:1.9.0-Beta",
+ "com.android.tools.layoutlib:layoutlib-api:31.2.0-alpha15",
+ "com.android.tools.analytics-library:protos:31.2.0-alpha15",
+ "com.sun.istack:istack-commons-runtime:3.0.8",
+ "org.jetbrains.kotlin:kotlin-reflect:1.9.0-Beta",
+ "com.google.protobuf:protobuf-java:3.21.8",
+ "com.android.tools:sdklib:31.2.0-alpha15",
+ "com.google.code.gson:gson:2.10",
+ "org.bouncycastle:bcpkix-jdk15on:1.67",
+ "javax.inject:javax.inject:1",
+ "org.jetbrains.intellij.deps:trove4j:1.0.20200330",
+ "com.sun.activation:javax.activation:1.2.0",
+ "net.sf.kxml:kxml2:2.3.0",
+ "net.java.dev.jna:jna-platform:5.6.0",
+ "org.apache.httpcomponents:httpcore:4.4.16",
+ "org.jetbrains:annotations:13.0",
+ "com.android.tools:annotations:31.2.0-alpha15",
+ "org.bouncycastle:bcprov-jdk15on:1.67",
+ "xml-apis:xml-apis:1.4.01",
+ "com.android.tools:repository:31.2.0-alpha15"
+ ],
+ "directDependencies": [
+ "com.android.tools:common:31.2.0-alpha15",
+ "org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.9.0-Beta",
+ "com.android.tools:sdk-common:31.2.0-alpha15",
+ "com.android.tools:sdklib:31.2.0-alpha15",
+ "com.google.code.gson:gson:2.10",
+ "net.sf.kxml:kxml2:2.3.0"
+ ],
+ "file": "v1/https/maven.google.com/com/android/tools/build/manifest-merger/31.2.0-alpha15/manifest-merger-31.2.0-alpha15.jar",
+ "mirror_urls": [
+ "https://maven.google.com/com/android/tools/build/manifest-merger/31.2.0-alpha15/manifest-merger-31.2.0-alpha15.jar",
+ "https://repo1.maven.org/maven2/com/android/tools/build/manifest-merger/31.2.0-alpha15/manifest-merger-31.2.0-alpha15.jar"
+ ],
+ "sha256": "153011ecc7c9c3d9fe03b24ea9198722aba844c87bc39b2611f4de2a76539302",
+ "url": "https://maven.google.com/com/android/tools/build/manifest-merger/31.2.0-alpha15/manifest-merger-31.2.0-alpha15.jar"
+ },
+ {
+ "coord": "com.android.tools.build:transform-api:2.0.0-deprecated-use-gradle-api",
+ "dependencies": [],
+ "directDependencies": [],
+ "file": "v1/https/maven.google.com/com/android/tools/build/transform-api/2.0.0-deprecated-use-gradle-api/transform-api-2.0.0-deprecated-use-gradle-api.jar",
+ "mirror_urls": [
+ "https://maven.google.com/com/android/tools/build/transform-api/2.0.0-deprecated-use-gradle-api/transform-api-2.0.0-deprecated-use-gradle-api.jar",
+ "https://repo1.maven.org/maven2/com/android/tools/build/transform-api/2.0.0-deprecated-use-gradle-api/transform-api-2.0.0-deprecated-use-gradle-api.jar"
+ ],
+ "sha256": "4de4a3d05e1c534c2db9e4588bf34082bb2bd232d8abb9727c430290ce225740",
+ "url": "https://maven.google.com/com/android/tools/build/transform-api/2.0.0-deprecated-use-gradle-api/transform-api-2.0.0-deprecated-use-gradle-api.jar"
+ },
+ {
+ "coord": "com.android.tools.ddms:ddmlib:31.2.0-alpha15",
+ "dependencies": [
+ "com.android.tools:common:31.2.0-alpha15",
+ "org.jetbrains.kotlin:kotlin-stdlib:1.9.0-Beta",
+ "org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.9.0-Beta",
+ "com.google.guava:guava:32.1.2-jre",
+ "org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.9.0-Beta",
+ "net.java.dev.jna:jna:5.6.0",
+ "org.jetbrains.kotlin:kotlin-stdlib-common:1.9.0-Beta",
+ "com.google.protobuf:protobuf-java:3.21.8",
+ "net.sf.kxml:kxml2:2.3.0",
+ "net.java.dev.jna:jna-platform:5.6.0",
+ "org.jetbrains:annotations:13.0",
+ "com.android.tools:annotations:31.2.0-alpha15"
+ ],
+ "directDependencies": [
+ "com.android.tools:common:31.2.0-alpha15",
+ "com.google.protobuf:protobuf-java:3.21.8",
+ "net.sf.kxml:kxml2:2.3.0",
+ "org.jetbrains:annotations:13.0"
+ ],
+ "file": "v1/https/maven.google.com/com/android/tools/ddms/ddmlib/31.2.0-alpha15/ddmlib-31.2.0-alpha15.jar",
+ "mirror_urls": [
+ "https://maven.google.com/com/android/tools/ddms/ddmlib/31.2.0-alpha15/ddmlib-31.2.0-alpha15.jar",
+ "https://repo1.maven.org/maven2/com/android/tools/ddms/ddmlib/31.2.0-alpha15/ddmlib-31.2.0-alpha15.jar"
+ ],
+ "sha256": "9abe5c8da13e6433570ce531991b621c6a2544289a5a71a4f951fedc6be0eae2",
+ "url": "https://maven.google.com/com/android/tools/ddms/ddmlib/31.2.0-alpha15/ddmlib-31.2.0-alpha15.jar"
+ },
+ {
+ "coord": "com.android.tools.layoutlib:layoutlib-api:31.2.0-alpha15",
+ "dependencies": [
+ "com.android.tools:common:31.2.0-alpha15",
+ "org.jetbrains.kotlin:kotlin-stdlib:1.9.0-Beta",
+ "org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.9.0-Beta",
+ "com.google.guava:guava:32.1.2-jre",
+ "org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.9.0-Beta",
+ "net.java.dev.jna:jna:5.6.0",
+ "org.jetbrains.kotlin:kotlin-stdlib-common:1.9.0-Beta",
+ "net.sf.kxml:kxml2:2.3.0",
+ "net.java.dev.jna:jna-platform:5.6.0",
+ "org.jetbrains:annotations:13.0",
+ "com.android.tools:annotations:31.2.0-alpha15"
+ ],
+ "directDependencies": [
+ "com.android.tools:annotations:31.2.0-alpha15",
+ "com.android.tools:common:31.2.0-alpha15",
+ "net.sf.kxml:kxml2:2.3.0",
+ "org.jetbrains:annotations:13.0"
+ ],
+ "file": "v1/https/maven.google.com/com/android/tools/layoutlib/layoutlib-api/31.2.0-alpha15/layoutlib-api-31.2.0-alpha15.jar",
+ "mirror_urls": [
+ "https://maven.google.com/com/android/tools/layoutlib/layoutlib-api/31.2.0-alpha15/layoutlib-api-31.2.0-alpha15.jar",
+ "https://repo1.maven.org/maven2/com/android/tools/layoutlib/layoutlib-api/31.2.0-alpha15/layoutlib-api-31.2.0-alpha15.jar"
+ ],
+ "sha256": "2b136521ad932f1a9c700a251a9ff5b6ebd4640423da68ce43ba4c7f7602c225",
+ "url": "https://maven.google.com/com/android/tools/layoutlib/layoutlib-api/31.2.0-alpha15/layoutlib-api-31.2.0-alpha15.jar"
+ },
+ {
+ "coord": "com.android.tools.lint:lint-model:31.2.0-alpha15",
+ "dependencies": [
+ "com.android.tools:common:31.2.0-alpha15",
+ "org.jetbrains.kotlin:kotlin-stdlib:1.9.0-Beta",
+ "jakarta.activation:jakarta.activation-api:1.2.1",
+ "com.android.tools:dvlib:31.2.0-alpha15",
+ "org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.9.0-Beta",
+ "org.apache.commons:commons-compress:1.21",
+ "org.apache.httpcomponents:httpclient:4.5.14",
+ "org.bouncycastle:bcprov-jdk15on:jar:1.67",
+ "com.google.guava:guava:32.1.2-jre",
+ "org.glassfish.jaxb:jaxb-runtime:2.3.2",
+ "org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.9.0-Beta",
+ "org.glassfish.jaxb:txw2:2.3.2",
+ "com.android.tools.build:builder-model:8.2.0-alpha15",
+ "jakarta.xml.bind:jakarta.xml.bind-api:2.3.2",
+ "com.google.jimfs:jimfs:1.1",
+ "com.android.tools.ddms:ddmlib:31.2.0-alpha15",
+ "com.sun.xml.fastinfoset:FastInfoset:1.2.16",
+ "com.android.tools:sdk-common:31.2.0-alpha15",
+ "net.java.dev.jna:jna:5.6.0",
+ "com.android.tools.build:aapt2-proto:8.2.0-alpha15-10154469",
+ "org.apache.httpcomponents:httpmime:4.5.6",
+ "org.jvnet.staxex:stax-ex:1.8.1",
+ "xerces:xercesImpl:2.12.0",
+ "com.android.tools.analytics-library:shared:31.2.0-alpha15",
+ "org.jetbrains.kotlin:kotlin-stdlib-common:1.9.0-Beta",
+ "com.android.tools.layoutlib:layoutlib-api:31.2.0-alpha15",
+ "com.android.tools.analytics-library:protos:31.2.0-alpha15",
+ "com.sun.istack:istack-commons-runtime:3.0.8",
+ "org.jetbrains.kotlin:kotlin-reflect:1.9.0-Beta",
+ "com.google.protobuf:protobuf-java:3.21.8",
+ "com.android.tools:sdklib:31.2.0-alpha15",
+ "com.google.code.gson:gson:2.10",
+ "org.bouncycastle:bcpkix-jdk15on:1.67",
+ "javax.inject:javax.inject:1",
+ "org.jetbrains.intellij.deps:trove4j:1.0.20200330",
+ "com.sun.activation:javax.activation:1.2.0",
+ "net.sf.kxml:kxml2:2.3.0",
+ "net.java.dev.jna:jna-platform:5.6.0",
+ "org.apache.httpcomponents:httpcore:4.4.16",
+ "org.jetbrains:annotations:13.0",
+ "com.android.tools:annotations:31.2.0-alpha15",
+ "org.bouncycastle:bcprov-jdk15on:1.67",
+ "xml-apis:xml-apis:1.4.01",
+ "com.android.tools:repository:31.2.0-alpha15"
+ ],
+ "directDependencies": [
+ "com.android.tools:common:31.2.0-alpha15",
+ "org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.9.0-Beta",
+ "com.android.tools.build:builder-model:8.2.0-alpha15",
+ "com.android.tools:sdk-common:31.2.0-alpha15",
+ "net.sf.kxml:kxml2:2.3.0"
+ ],
+ "file": "v1/https/maven.google.com/com/android/tools/lint/lint-model/31.2.0-alpha15/lint-model-31.2.0-alpha15.jar",
+ "mirror_urls": [
+ "https://maven.google.com/com/android/tools/lint/lint-model/31.2.0-alpha15/lint-model-31.2.0-alpha15.jar",
+ "https://repo1.maven.org/maven2/com/android/tools/lint/lint-model/31.2.0-alpha15/lint-model-31.2.0-alpha15.jar"
+ ],
+ "sha256": "3c96acb35de3194359f8fd4d8b5ed129da3588f32a1f010d54496f8db93253c1",
+ "url": "https://maven.google.com/com/android/tools/lint/lint-model/31.2.0-alpha15/lint-model-31.2.0-alpha15.jar"
+ },
+ {
+ "coord": "com.android.tools.lint:lint-typedef-remover:31.2.0-alpha15",
+ "dependencies": [
+ "org.ow2.asm:asm:9.5",
+ "com.google.guava:guava:32.1.2-jre",
+ "com.android.tools:annotations:31.2.0-alpha15"
+ ],
+ "directDependencies": [
+ "com.android.tools:annotations:31.2.0-alpha15",
+ "com.google.guava:guava:32.1.2-jre",
+ "org.ow2.asm:asm:9.5"
+ ],
+ "file": "v1/https/maven.google.com/com/android/tools/lint/lint-typedef-remover/31.2.0-alpha15/lint-typedef-remover-31.2.0-alpha15.jar",
+ "mirror_urls": [
+ "https://maven.google.com/com/android/tools/lint/lint-typedef-remover/31.2.0-alpha15/lint-typedef-remover-31.2.0-alpha15.jar",
+ "https://repo1.maven.org/maven2/com/android/tools/lint/lint-typedef-remover/31.2.0-alpha15/lint-typedef-remover-31.2.0-alpha15.jar"
+ ],
+ "sha256": "5b4f485215ca4d86ef2319fc398b5f2251e62f5446bc5fd0e00653648ddde318",
+ "url": "https://maven.google.com/com/android/tools/lint/lint-typedef-remover/31.2.0-alpha15/lint-typedef-remover-31.2.0-alpha15.jar"
+ },
+ {
+ "coord": "com.android.tools.utp:android-device-provider-ddmlib-proto:31.2.0-alpha15",
+ "dependencies": [
+ "com.google.protobuf:protobuf-java:3.21.8"
+ ],
+ "directDependencies": [
+ "com.google.protobuf:protobuf-java:3.21.8"
+ ],
+ "file": "v1/https/maven.google.com/com/android/tools/utp/android-device-provider-ddmlib-proto/31.2.0-alpha15/android-device-provider-ddmlib-proto-31.2.0-alpha15.jar",
+ "mirror_urls": [
+ "https://maven.google.com/com/android/tools/utp/android-device-provider-ddmlib-proto/31.2.0-alpha15/android-device-provider-ddmlib-proto-31.2.0-alpha15.jar",
+ "https://repo1.maven.org/maven2/com/android/tools/utp/android-device-provider-ddmlib-proto/31.2.0-alpha15/android-device-provider-ddmlib-proto-31.2.0-alpha15.jar"
+ ],
+ "sha256": "1a288dfd22f5baa036bffdfdd3ac7504664b94c86dbf6be36630e5587c22e8fe",
+ "url": "https://maven.google.com/com/android/tools/utp/android-device-provider-ddmlib-proto/31.2.0-alpha15/android-device-provider-ddmlib-proto-31.2.0-alpha15.jar"
+ },
+ {
+ "coord": "com.android.tools.utp:android-device-provider-gradle-proto:31.2.0-alpha15",
+ "dependencies": [
+ "com.google.protobuf:protobuf-java:3.21.8"
+ ],
+ "directDependencies": [
+ "com.google.protobuf:protobuf-java:3.21.8"
+ ],
+ "file": "v1/https/maven.google.com/com/android/tools/utp/android-device-provider-gradle-proto/31.2.0-alpha15/android-device-provider-gradle-proto-31.2.0-alpha15.jar",
+ "mirror_urls": [
+ "https://maven.google.com/com/android/tools/utp/android-device-provider-gradle-proto/31.2.0-alpha15/android-device-provider-gradle-proto-31.2.0-alpha15.jar",
+ "https://repo1.maven.org/maven2/com/android/tools/utp/android-device-provider-gradle-proto/31.2.0-alpha15/android-device-provider-gradle-proto-31.2.0-alpha15.jar"
+ ],
+ "sha256": "10f9b620a8403fd6a9c9e9c635c63a7975337b1deb5c375b79a6960eb5af88d4",
+ "url": "https://maven.google.com/com/android/tools/utp/android-device-provider-gradle-proto/31.2.0-alpha15/android-device-provider-gradle-proto-31.2.0-alpha15.jar"
+ },
+ {
+ "coord": "com.android.tools.utp:android-test-plugin-host-additional-test-output-proto:31.2.0-alpha15",
+ "dependencies": [
+ "com.google.protobuf:protobuf-java:3.21.8"
+ ],
+ "directDependencies": [
+ "com.google.protobuf:protobuf-java:3.21.8"
+ ],
+ "file": "v1/https/maven.google.com/com/android/tools/utp/android-test-plugin-host-additional-test-output-proto/31.2.0-alpha15/android-test-plugin-host-additional-test-output-proto-31.2.0-alpha15.jar",
+ "mirror_urls": [
+ "https://maven.google.com/com/android/tools/utp/android-test-plugin-host-additional-test-output-proto/31.2.0-alpha15/android-test-plugin-host-additional-test-output-proto-31.2.0-alpha15.jar",
+ "https://repo1.maven.org/maven2/com/android/tools/utp/android-test-plugin-host-additional-test-output-proto/31.2.0-alpha15/android-test-plugin-host-additional-test-output-proto-31.2.0-alpha15.jar"
+ ],
+ "sha256": "08d12e55fa91ab83dd1b757cdbca3d746809b0a50268f75cf52194f46a2c6673",
+ "url": "https://maven.google.com/com/android/tools/utp/android-test-plugin-host-additional-test-output-proto/31.2.0-alpha15/android-test-plugin-host-additional-test-output-proto-31.2.0-alpha15.jar"
+ },
+ {
+ "coord": "com.android.tools.utp:android-test-plugin-host-apk-installer-proto:31.2.0-alpha15",
+ "dependencies": [
+ "com.google.protobuf:protobuf-java:3.21.8"
+ ],
+ "directDependencies": [
+ "com.google.protobuf:protobuf-java:3.21.8"
+ ],
+ "file": "v1/https/maven.google.com/com/android/tools/utp/android-test-plugin-host-apk-installer-proto/31.2.0-alpha15/android-test-plugin-host-apk-installer-proto-31.2.0-alpha15.jar",
+ "mirror_urls": [
+ "https://maven.google.com/com/android/tools/utp/android-test-plugin-host-apk-installer-proto/31.2.0-alpha15/android-test-plugin-host-apk-installer-proto-31.2.0-alpha15.jar",
+ "https://repo1.maven.org/maven2/com/android/tools/utp/android-test-plugin-host-apk-installer-proto/31.2.0-alpha15/android-test-plugin-host-apk-installer-proto-31.2.0-alpha15.jar"
+ ],
+ "sha256": "abd2aac816a81e2af7705f3edff3de22bcd806212a1d158f432a39b06ae544e4",
+ "url": "https://maven.google.com/com/android/tools/utp/android-test-plugin-host-apk-installer-proto/31.2.0-alpha15/android-test-plugin-host-apk-installer-proto-31.2.0-alpha15.jar"
+ },
+ {
+ "coord": "com.android.tools.utp:android-test-plugin-host-coverage-proto:31.2.0-alpha15",
+ "dependencies": [
+ "com.google.protobuf:protobuf-java:3.21.8"
+ ],
+ "directDependencies": [
+ "com.google.protobuf:protobuf-java:3.21.8"
+ ],
+ "file": "v1/https/maven.google.com/com/android/tools/utp/android-test-plugin-host-coverage-proto/31.2.0-alpha15/android-test-plugin-host-coverage-proto-31.2.0-alpha15.jar",
+ "mirror_urls": [
+ "https://maven.google.com/com/android/tools/utp/android-test-plugin-host-coverage-proto/31.2.0-alpha15/android-test-plugin-host-coverage-proto-31.2.0-alpha15.jar",
+ "https://repo1.maven.org/maven2/com/android/tools/utp/android-test-plugin-host-coverage-proto/31.2.0-alpha15/android-test-plugin-host-coverage-proto-31.2.0-alpha15.jar"
+ ],
+ "sha256": "9ebc9c6279a32a453c90cf6b732b3a3f88a80498e746400850f2c66ea7933580",
+ "url": "https://maven.google.com/com/android/tools/utp/android-test-plugin-host-coverage-proto/31.2.0-alpha15/android-test-plugin-host-coverage-proto-31.2.0-alpha15.jar"
+ },
+ {
+ "coord": "com.android.tools.utp:android-test-plugin-host-emulator-control-proto:31.2.0-alpha15",
+ "dependencies": [
+ "org.jetbrains.kotlin:kotlin-stdlib:1.9.0-Beta",
+ "org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.9.0-Beta",
+ "org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.9.0-Beta",
+ "org.jetbrains.kotlin:kotlin-stdlib-common:1.9.0-Beta",
+ "com.google.protobuf:protobuf-java:3.21.8",
+ "org.jetbrains:annotations:13.0"
+ ],
+ "directDependencies": [
+ "com.google.protobuf:protobuf-java:3.21.8",
+ "org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.9.0-Beta"
+ ],
+ "file": "v1/https/maven.google.com/com/android/tools/utp/android-test-plugin-host-emulator-control-proto/31.2.0-alpha15/android-test-plugin-host-emulator-control-proto-31.2.0-alpha15.jar",
+ "mirror_urls": [
+ "https://maven.google.com/com/android/tools/utp/android-test-plugin-host-emulator-control-proto/31.2.0-alpha15/android-test-plugin-host-emulator-control-proto-31.2.0-alpha15.jar",
+ "https://repo1.maven.org/maven2/com/android/tools/utp/android-test-plugin-host-emulator-control-proto/31.2.0-alpha15/android-test-plugin-host-emulator-control-proto-31.2.0-alpha15.jar"
+ ],
+ "sha256": "435438bc84016ec5d28c34c9d017b01365f37949168cffc81126d43757c53ca4",
+ "url": "https://maven.google.com/com/android/tools/utp/android-test-plugin-host-emulator-control-proto/31.2.0-alpha15/android-test-plugin-host-emulator-control-proto-31.2.0-alpha15.jar"
+ },
+ {
+ "coord": "com.android.tools.utp:android-test-plugin-host-logcat-proto:31.2.0-alpha15",
+ "dependencies": [
+ "com.google.protobuf:protobuf-java:3.21.8"
+ ],
+ "directDependencies": [
+ "com.google.protobuf:protobuf-java:3.21.8"
+ ],
+ "file": "v1/https/maven.google.com/com/android/tools/utp/android-test-plugin-host-logcat-proto/31.2.0-alpha15/android-test-plugin-host-logcat-proto-31.2.0-alpha15.jar",
+ "mirror_urls": [
+ "https://maven.google.com/com/android/tools/utp/android-test-plugin-host-logcat-proto/31.2.0-alpha15/android-test-plugin-host-logcat-proto-31.2.0-alpha15.jar",
+ "https://repo1.maven.org/maven2/com/android/tools/utp/android-test-plugin-host-logcat-proto/31.2.0-alpha15/android-test-plugin-host-logcat-proto-31.2.0-alpha15.jar"
+ ],
+ "sha256": "d31ca97afbfcd71a54749d265da11a424b122cf1cfbedbff2cb3d7362c579d3b",
+ "url": "https://maven.google.com/com/android/tools/utp/android-test-plugin-host-logcat-proto/31.2.0-alpha15/android-test-plugin-host-logcat-proto-31.2.0-alpha15.jar"
+ },
+ {
+ "coord": "com.android.tools.utp:android-test-plugin-host-retention-proto:31.2.0-alpha15",
+ "dependencies": [
+ "org.jetbrains.kotlin:kotlin-stdlib:1.9.0-Beta",
+ "org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.9.0-Beta",
+ "org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.9.0-Beta",
+ "org.jetbrains.kotlin:kotlin-stdlib-common:1.9.0-Beta",
+ "com.google.protobuf:protobuf-java:3.21.8",
+ "org.jetbrains:annotations:13.0"
+ ],
+ "directDependencies": [
+ "com.google.protobuf:protobuf-java:3.21.8",
+ "org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.9.0-Beta"
+ ],
+ "file": "v1/https/maven.google.com/com/android/tools/utp/android-test-plugin-host-retention-proto/31.2.0-alpha15/android-test-plugin-host-retention-proto-31.2.0-alpha15.jar",
+ "mirror_urls": [
+ "https://maven.google.com/com/android/tools/utp/android-test-plugin-host-retention-proto/31.2.0-alpha15/android-test-plugin-host-retention-proto-31.2.0-alpha15.jar",
+ "https://repo1.maven.org/maven2/com/android/tools/utp/android-test-plugin-host-retention-proto/31.2.0-alpha15/android-test-plugin-host-retention-proto-31.2.0-alpha15.jar"
+ ],
+ "sha256": "4d1c3faaff5a38b29426f082e8e8c3f8b85a902086b90d18f706754ad93de04d",
+ "url": "https://maven.google.com/com/android/tools/utp/android-test-plugin-host-retention-proto/31.2.0-alpha15/android-test-plugin-host-retention-proto-31.2.0-alpha15.jar"
+ },
+ {
+ "coord": "com.android.tools.utp:android-test-plugin-result-listener-gradle-proto:31.2.0-alpha15",
+ "dependencies": [
+ "com.google.errorprone:error_prone_annotations:2.19.1",
+ "io.grpc:grpc-protobuf-lite:1.45.1",
+ "io.grpc:grpc-stub:1.45.1",
+ "io.grpc:grpc-core:1.45.1",
+ "com.google.guava:guava:32.1.2-jre",
+ "io.netty:netty-transport:4.1.72.Final",
+ "com.google.code.findbugs:jsr305:3.0.2",
+ "io.grpc:grpc-context:1.45.1",
+ "com.google.android:annotations:4.1.1.4",
+ "org.codehaus.mojo:animal-sniffer-annotations:1.19",
+ "io.perfmark:perfmark-api:0.23.0",
+ "io.netty:netty-tcnative-classes:2.0.46.Final",
+ "io.grpc:grpc-netty:1.45.1",
+ "io.grpc:grpc-protobuf:1.45.1",
+ "io.grpc:grpc-api:1.45.1",
+ "io.netty:netty-common:4.1.72.Final",
+ "io.netty:netty-handler:4.1.72.Final",
+ "javax.annotation:javax.annotation-api:1.3.2",
+ "io.netty:netty-resolver:4.1.72.Final",
+ "com.google.protobuf:protobuf-java:3.21.8",
+ "com.google.code.gson:gson:2.10",
+ "io.netty:netty-buffer:4.1.72.Final",
+ "com.google.api.grpc:proto-google-common-protos:2.0.1",
+ "io.netty:netty-codec-http2:4.1.72.Final",
+ "io.netty:netty-codec-http:4.1.72.Final",
+ "io.netty:netty-handler-proxy:4.1.72.Final",
+ "io.netty:netty-codec-socks:4.1.72.Final",
+ "io.netty:netty-codec:4.1.72.Final"
+ ],
+ "directDependencies": [
+ "io.grpc:grpc-stub:1.45.1",
+ "io.grpc:grpc-core:1.45.1",
+ "com.google.guava:guava:32.1.2-jre",
+ "io.grpc:grpc-netty:1.45.1",
+ "io.grpc:grpc-protobuf:1.45.1",
+ "javax.annotation:javax.annotation-api:1.3.2",
+ "com.google.protobuf:protobuf-java:3.21.8",
+ "com.google.code.gson:gson:2.10"
+ ],
+ "file": "v1/https/maven.google.com/com/android/tools/utp/android-test-plugin-result-listener-gradle-proto/31.2.0-alpha15/android-test-plugin-result-listener-gradle-proto-31.2.0-alpha15.jar",
+ "mirror_urls": [
+ "https://maven.google.com/com/android/tools/utp/android-test-plugin-result-listener-gradle-proto/31.2.0-alpha15/android-test-plugin-result-listener-gradle-proto-31.2.0-alpha15.jar",
+ "https://repo1.maven.org/maven2/com/android/tools/utp/android-test-plugin-result-listener-gradle-proto/31.2.0-alpha15/android-test-plugin-result-listener-gradle-proto-31.2.0-alpha15.jar"
+ ],
+ "sha256": "b1e49ff23fa357f8702aef1632b04405224a3846f4fe76654c76ef9bd7b5a601",
+ "url": "https://maven.google.com/com/android/tools/utp/android-test-plugin-result-listener-gradle-proto/31.2.0-alpha15/android-test-plugin-result-listener-gradle-proto-31.2.0-alpha15.jar"
+ },
+ {
+ "coord": "com.android.tools:annotations:31.2.0-alpha15",
+ "dependencies": [],
+ "directDependencies": [],
+ "file": "v1/https/maven.google.com/com/android/tools/annotations/31.2.0-alpha15/annotations-31.2.0-alpha15.jar",
+ "mirror_urls": [
+ "https://maven.google.com/com/android/tools/annotations/31.2.0-alpha15/annotations-31.2.0-alpha15.jar",
+ "https://repo1.maven.org/maven2/com/android/tools/annotations/31.2.0-alpha15/annotations-31.2.0-alpha15.jar"
+ ],
+ "sha256": "ee3bfd9cdb5012bdb61520f8654a785577e9bb337e5939c5c6149a446684ee16",
+ "url": "https://maven.google.com/com/android/tools/annotations/31.2.0-alpha15/annotations-31.2.0-alpha15.jar"
+ },
+ {
+ "coord": "com.android.tools:common:31.2.0-alpha15",
+ "dependencies": [
+ "org.jetbrains.kotlin:kotlin-stdlib:1.9.0-Beta",
+ "org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.9.0-Beta",
+ "com.google.guava:guava:32.1.2-jre",
+ "org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.9.0-Beta",
+ "net.java.dev.jna:jna:5.6.0",
+ "org.jetbrains.kotlin:kotlin-stdlib-common:1.9.0-Beta",
+ "net.java.dev.jna:jna-platform:5.6.0",
+ "org.jetbrains:annotations:13.0",
+ "com.android.tools:annotations:31.2.0-alpha15"
+ ],
+ "directDependencies": [
+ "com.android.tools:annotations:31.2.0-alpha15",
+ "com.google.guava:guava:32.1.2-jre",
+ "net.java.dev.jna:jna-platform:5.6.0",
+ "org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.9.0-Beta"
+ ],
+ "file": "v1/https/maven.google.com/com/android/tools/common/31.2.0-alpha15/common-31.2.0-alpha15.jar",
+ "mirror_urls": [
+ "https://maven.google.com/com/android/tools/common/31.2.0-alpha15/common-31.2.0-alpha15.jar",
+ "https://repo1.maven.org/maven2/com/android/tools/common/31.2.0-alpha15/common-31.2.0-alpha15.jar"
+ ],
+ "sha256": "07908408e25f78dd13bfd59f01c3222713f73017ca81dacb662923f03e703f29",
+ "url": "https://maven.google.com/com/android/tools/common/31.2.0-alpha15/common-31.2.0-alpha15.jar"
+ },
+ {
+ "coord": "com.android.tools:dvlib:31.2.0-alpha15",
+ "dependencies": [
+ "com.android.tools:common:31.2.0-alpha15",
+ "org.jetbrains.kotlin:kotlin-stdlib:1.9.0-Beta",
+ "org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.9.0-Beta",
+ "com.google.guava:guava:32.1.2-jre",
+ "org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.9.0-Beta",
+ "net.java.dev.jna:jna:5.6.0",
+ "org.jetbrains.kotlin:kotlin-stdlib-common:1.9.0-Beta",
+ "net.java.dev.jna:jna-platform:5.6.0",
+ "org.jetbrains:annotations:13.0",
+ "com.android.tools:annotations:31.2.0-alpha15"
+ ],
+ "directDependencies": [
+ "com.android.tools:common:31.2.0-alpha15"
+ ],
+ "file": "v1/https/maven.google.com/com/android/tools/dvlib/31.2.0-alpha15/dvlib-31.2.0-alpha15.jar",
+ "mirror_urls": [
+ "https://maven.google.com/com/android/tools/dvlib/31.2.0-alpha15/dvlib-31.2.0-alpha15.jar",
+ "https://repo1.maven.org/maven2/com/android/tools/dvlib/31.2.0-alpha15/dvlib-31.2.0-alpha15.jar"
+ ],
+ "sha256": "0cb57c126ed95657ae1e0974af092b401a52b76d5683f7ccbe1f8f21af06794e",
+ "url": "https://maven.google.com/com/android/tools/dvlib/31.2.0-alpha15/dvlib-31.2.0-alpha15.jar"
+ },
+ {
+ "coord": "com.android.tools:repository:31.2.0-alpha15",
+ "dependencies": [
+ "com.android.tools:common:31.2.0-alpha15",
+ "org.jetbrains.kotlin:kotlin-stdlib:1.9.0-Beta",
+ "jakarta.activation:jakarta.activation-api:1.2.1",
+ "org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.9.0-Beta",
+ "org.apache.commons:commons-compress:1.21",
+ "com.google.guava:guava:32.1.2-jre",
+ "org.glassfish.jaxb:jaxb-runtime:2.3.2",
+ "org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.9.0-Beta",
+ "org.glassfish.jaxb:txw2:2.3.2",
+ "jakarta.xml.bind:jakarta.xml.bind-api:2.3.2",
+ "com.google.jimfs:jimfs:1.1",
+ "com.sun.xml.fastinfoset:FastInfoset:1.2.16",
+ "net.java.dev.jna:jna:5.6.0",
+ "org.jvnet.staxex:stax-ex:1.8.1",
+ "com.android.tools.analytics-library:shared:31.2.0-alpha15",
+ "org.jetbrains.kotlin:kotlin-stdlib-common:1.9.0-Beta",
+ "com.android.tools.analytics-library:protos:31.2.0-alpha15",
+ "com.sun.istack:istack-commons-runtime:3.0.8",
+ "com.google.protobuf:protobuf-java:3.21.8",
+ "com.google.code.gson:gson:2.10",
+ "com.sun.activation:javax.activation:1.2.0",
+ "net.java.dev.jna:jna-platform:5.6.0",
+ "org.jetbrains:annotations:13.0",
+ "com.android.tools:annotations:31.2.0-alpha15"
+ ],
+ "directDependencies": [
+ "com.android.tools:common:31.2.0-alpha15",
+ "org.apache.commons:commons-compress:1.21",
+ "org.glassfish.jaxb:jaxb-runtime:2.3.2",
+ "org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.9.0-Beta",
+ "com.google.jimfs:jimfs:1.1",
+ "com.android.tools.analytics-library:shared:31.2.0-alpha15",
+ "com.sun.activation:javax.activation:1.2.0"
+ ],
+ "file": "v1/https/maven.google.com/com/android/tools/repository/31.2.0-alpha15/repository-31.2.0-alpha15.jar",
+ "mirror_urls": [
+ "https://maven.google.com/com/android/tools/repository/31.2.0-alpha15/repository-31.2.0-alpha15.jar",
+ "https://repo1.maven.org/maven2/com/android/tools/repository/31.2.0-alpha15/repository-31.2.0-alpha15.jar"
+ ],
+ "sha256": "0f1778a98a79fb6f3a8fa5116b7f16092960bf49509802656c1117c75cc7875c",
+ "url": "https://maven.google.com/com/android/tools/repository/31.2.0-alpha15/repository-31.2.0-alpha15.jar"
+ },
+ {
+ "coord": "com.android.tools:sdk-common:31.2.0-alpha15",
+ "dependencies": [
+ "com.android.tools:common:31.2.0-alpha15",
+ "org.jetbrains.kotlin:kotlin-stdlib:1.9.0-Beta",
+ "jakarta.activation:jakarta.activation-api:1.2.1",
+ "com.android.tools:dvlib:31.2.0-alpha15",
+ "org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.9.0-Beta",
+ "org.apache.commons:commons-compress:1.21",
+ "org.apache.httpcomponents:httpclient:4.5.14",
+ "org.bouncycastle:bcprov-jdk15on:jar:1.67",
+ "com.google.guava:guava:32.1.2-jre",
+ "org.glassfish.jaxb:jaxb-runtime:2.3.2",
+ "org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.9.0-Beta",
+ "org.glassfish.jaxb:txw2:2.3.2",
+ "jakarta.xml.bind:jakarta.xml.bind-api:2.3.2",
+ "com.google.jimfs:jimfs:1.1",
+ "com.android.tools.ddms:ddmlib:31.2.0-alpha15",
+ "com.sun.xml.fastinfoset:FastInfoset:1.2.16",
+ "net.java.dev.jna:jna:5.6.0",
+ "com.android.tools.build:aapt2-proto:8.2.0-alpha15-10154469",
+ "org.apache.httpcomponents:httpmime:4.5.6",
+ "org.jvnet.staxex:stax-ex:1.8.1",
+ "xerces:xercesImpl:2.12.0",
+ "com.android.tools.analytics-library:shared:31.2.0-alpha15",
+ "org.jetbrains.kotlin:kotlin-stdlib-common:1.9.0-Beta",
+ "com.android.tools.layoutlib:layoutlib-api:31.2.0-alpha15",
+ "com.android.tools.analytics-library:protos:31.2.0-alpha15",
+ "com.sun.istack:istack-commons-runtime:3.0.8",
+ "org.jetbrains.kotlin:kotlin-reflect:1.9.0-Beta",
+ "com.google.protobuf:protobuf-java:3.21.8",
+ "com.android.tools:sdklib:31.2.0-alpha15",
+ "com.google.code.gson:gson:2.10",
+ "org.bouncycastle:bcpkix-jdk15on:1.67",
+ "javax.inject:javax.inject:1",
+ "org.jetbrains.intellij.deps:trove4j:1.0.20200330",
+ "com.sun.activation:javax.activation:1.2.0",
+ "net.sf.kxml:kxml2:2.3.0",
+ "net.java.dev.jna:jna-platform:5.6.0",
+ "org.apache.httpcomponents:httpcore:4.4.16",
+ "org.jetbrains:annotations:13.0",
+ "com.android.tools:annotations:31.2.0-alpha15",
+ "org.bouncycastle:bcprov-jdk15on:1.67",
+ "xml-apis:xml-apis:1.4.01",
+ "com.android.tools:repository:31.2.0-alpha15"
+ ],
+ "directDependencies": [
+ "com.android.tools:common:31.2.0-alpha15",
+ "com.google.guava:guava:32.1.2-jre",
+ "org.glassfish.jaxb:jaxb-runtime:2.3.2",
+ "org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.9.0-Beta",
+ "com.android.tools.ddms:ddmlib:31.2.0-alpha15",
+ "com.android.tools.build:aapt2-proto:8.2.0-alpha15-10154469",
+ "xerces:xercesImpl:2.12.0",
+ "com.android.tools.analytics-library:shared:31.2.0-alpha15",
+ "com.android.tools.layoutlib:layoutlib-api:31.2.0-alpha15",
+ "org.jetbrains.kotlin:kotlin-reflect:1.9.0-Beta",
+ "com.google.protobuf:protobuf-java:3.21.8",
+ "com.android.tools:sdklib:31.2.0-alpha15",
+ "com.google.code.gson:gson:2.10",
+ "org.bouncycastle:bcpkix-jdk15on:1.67",
+ "javax.inject:javax.inject:1",
+ "org.jetbrains.intellij.deps:trove4j:1.0.20200330",
+ "net.sf.kxml:kxml2:2.3.0",
+ "org.bouncycastle:bcprov-jdk15on:1.67"
+ ],
+ "file": "v1/https/maven.google.com/com/android/tools/sdk-common/31.2.0-alpha15/sdk-common-31.2.0-alpha15.jar",
+ "mirror_urls": [
+ "https://maven.google.com/com/android/tools/sdk-common/31.2.0-alpha15/sdk-common-31.2.0-alpha15.jar",
+ "https://repo1.maven.org/maven2/com/android/tools/sdk-common/31.2.0-alpha15/sdk-common-31.2.0-alpha15.jar"
+ ],
+ "sha256": "a03d64f134f4597fda31f53c2a45a4f9dee6fd667e47b64a46153cec3b2bffc1",
+ "url": "https://maven.google.com/com/android/tools/sdk-common/31.2.0-alpha15/sdk-common-31.2.0-alpha15.jar"
+ },
+ {
+ "coord": "com.android.tools:sdklib:31.2.0-alpha15",
+ "dependencies": [
+ "com.android.tools:common:31.2.0-alpha15",
+ "org.jetbrains.kotlin:kotlin-stdlib:1.9.0-Beta",
+ "jakarta.activation:jakarta.activation-api:1.2.1",
+ "com.android.tools:dvlib:31.2.0-alpha15",
+ "org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.9.0-Beta",
+ "org.apache.commons:commons-compress:1.21",
+ "org.apache.httpcomponents:httpclient:4.5.14",
+ "com.google.guava:guava:32.1.2-jre",
+ "org.glassfish.jaxb:jaxb-runtime:2.3.2",
+ "org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.9.0-Beta",
+ "org.glassfish.jaxb:txw2:2.3.2",
+ "jakarta.xml.bind:jakarta.xml.bind-api:2.3.2",
+ "com.google.jimfs:jimfs:1.1",
+ "com.sun.xml.fastinfoset:FastInfoset:1.2.16",
+ "net.java.dev.jna:jna:5.6.0",
+ "org.apache.httpcomponents:httpmime:4.5.6",
+ "org.jvnet.staxex:stax-ex:1.8.1",
+ "com.android.tools.analytics-library:shared:31.2.0-alpha15",
+ "org.jetbrains.kotlin:kotlin-stdlib-common:1.9.0-Beta",
+ "com.android.tools.layoutlib:layoutlib-api:31.2.0-alpha15",
+ "com.android.tools.analytics-library:protos:31.2.0-alpha15",
+ "com.sun.istack:istack-commons-runtime:3.0.8",
+ "com.google.protobuf:protobuf-java:3.21.8",
+ "com.google.code.gson:gson:2.10",
+ "com.sun.activation:javax.activation:1.2.0",
+ "net.sf.kxml:kxml2:2.3.0",
+ "net.java.dev.jna:jna-platform:5.6.0",
+ "org.apache.httpcomponents:httpcore:4.4.16",
+ "org.jetbrains:annotations:13.0",
+ "com.android.tools:annotations:31.2.0-alpha15",
+ "com.android.tools:repository:31.2.0-alpha15"
+ ],
+ "directDependencies": [
+ "com.android.tools:common:31.2.0-alpha15",
+ "com.android.tools:dvlib:31.2.0-alpha15",
+ "org.apache.commons:commons-compress:1.21",
+ "org.glassfish.jaxb:jaxb-runtime:2.3.2",
+ "org.apache.httpcomponents:httpmime:4.5.6",
+ "com.android.tools.layoutlib:layoutlib-api:31.2.0-alpha15",
+ "com.google.code.gson:gson:2.10",
+ "org.apache.httpcomponents:httpcore:4.4.16",
+ "com.android.tools:repository:31.2.0-alpha15"
+ ],
+ "file": "v1/https/maven.google.com/com/android/tools/sdklib/31.2.0-alpha15/sdklib-31.2.0-alpha15.jar",
+ "mirror_urls": [
+ "https://maven.google.com/com/android/tools/sdklib/31.2.0-alpha15/sdklib-31.2.0-alpha15.jar",
+ "https://repo1.maven.org/maven2/com/android/tools/sdklib/31.2.0-alpha15/sdklib-31.2.0-alpha15.jar"
+ ],
+ "sha256": "b457724135aed8a9676e72d3b2dd66432ae63acc8b35460113d37578190b992c",
+ "url": "https://maven.google.com/com/android/tools/sdklib/31.2.0-alpha15/sdklib-31.2.0-alpha15.jar"
+ },
+ {
+ "coord": "com.android:signflinger:8.2.0-alpha15",
+ "dependencies": [
+ "com.android.tools:annotations:31.2.0-alpha15",
+ "com.android:zipflinger:8.2.0-alpha15",
+ "com.android.tools.build:apksig:8.2.0-alpha15"
+ ],
+ "directDependencies": [
+ "com.android:zipflinger:8.2.0-alpha15",
+ "com.android.tools:annotations:31.2.0-alpha15",
+ "com.android.tools.build:apksig:8.2.0-alpha15"
+ ],
+ "file": "v1/https/maven.google.com/com/android/signflinger/8.2.0-alpha15/signflinger-8.2.0-alpha15.jar",
+ "mirror_urls": [
+ "https://maven.google.com/com/android/signflinger/8.2.0-alpha15/signflinger-8.2.0-alpha15.jar",
+ "https://repo1.maven.org/maven2/com/android/signflinger/8.2.0-alpha15/signflinger-8.2.0-alpha15.jar"
+ ],
+ "sha256": "c1dca2c683634ee1a294298f9c7179578af6a86e080bdc40f961915bc5c8142f",
+ "url": "https://maven.google.com/com/android/signflinger/8.2.0-alpha15/signflinger-8.2.0-alpha15.jar"
+ },
+ {
+ "coord": "com.android:zipflinger:8.2.0-alpha15",
+ "dependencies": [
+ "com.android.tools:annotations:31.2.0-alpha15"
+ ],
+ "directDependencies": [
+ "com.android.tools:annotations:31.2.0-alpha15"
+ ],
+ "file": "v1/https/maven.google.com/com/android/zipflinger/8.2.0-alpha15/zipflinger-8.2.0-alpha15.jar",
+ "mirror_urls": [
+ "https://maven.google.com/com/android/zipflinger/8.2.0-alpha15/zipflinger-8.2.0-alpha15.jar",
+ "https://repo1.maven.org/maven2/com/android/zipflinger/8.2.0-alpha15/zipflinger-8.2.0-alpha15.jar"
+ ],
+ "sha256": "81dd485618a509a3235929b9eb13091d884452661de6ce5a45cc38b1c555421c",
+ "url": "https://maven.google.com/com/android/zipflinger/8.2.0-alpha15/zipflinger-8.2.0-alpha15.jar"
+ },
+ {
+ "coord": "com.google.android:annotations:4.1.1.4",
+ "dependencies": [],
+ "directDependencies": [],
+ "file": "v1/https/repo1.maven.org/maven2/com/google/android/annotations/4.1.1.4/annotations-4.1.1.4.jar",
+ "mirror_urls": [
+ "https://maven.google.com/com/google/android/annotations/4.1.1.4/annotations-4.1.1.4.jar",
+ "https://repo1.maven.org/maven2/com/google/android/annotations/4.1.1.4/annotations-4.1.1.4.jar"
+ ],
+ "sha256": "ba734e1e84c09d615af6a09d33034b4f0442f8772dec120efb376d86a565ae15",
+ "url": "https://repo1.maven.org/maven2/com/google/android/annotations/4.1.1.4/annotations-4.1.1.4.jar"
+ },
+ {
+ "coord": "com.google.api.grpc:proto-google-common-protos:2.0.1",
+ "dependencies": [
+ "com.google.protobuf:protobuf-java:3.21.8"
+ ],
+ "directDependencies": [
+ "com.google.protobuf:protobuf-java:3.21.8"
+ ],
+ "exclusions": [
+ "com.google.api:api-common"
+ ],
+ "file": "v1/https/repo1.maven.org/maven2/com/google/api/grpc/proto-google-common-protos/2.0.1/proto-google-common-protos-2.0.1.jar",
+ "mirror_urls": [
+ "https://maven.google.com/com/google/api/grpc/proto-google-common-protos/2.0.1/proto-google-common-protos-2.0.1.jar",
+ "https://repo1.maven.org/maven2/com/google/api/grpc/proto-google-common-protos/2.0.1/proto-google-common-protos-2.0.1.jar"
+ ],
+ "sha256": "5ce71656118618731e34a5d4c61aa3a031be23446dc7de8b5a5e77b66ebcd6ef",
+ "url": "https://repo1.maven.org/maven2/com/google/api/grpc/proto-google-common-protos/2.0.1/proto-google-common-protos-2.0.1.jar"
+ },
+ {
+ "coord": "com.google.auto.value:auto-value-annotations:1.10.1",
+ "dependencies": [],
+ "directDependencies": [],
+ "file": "v1/https/repo1.maven.org/maven2/com/google/auto/value/auto-value-annotations/1.10.1/auto-value-annotations-1.10.1.jar",
+ "mirror_urls": [
+ "https://maven.google.com/com/google/auto/value/auto-value-annotations/1.10.1/auto-value-annotations-1.10.1.jar",
+ "https://repo1.maven.org/maven2/com/google/auto/value/auto-value-annotations/1.10.1/auto-value-annotations-1.10.1.jar"
+ ],
+ "sha256": "a4fe0a211925e938a8510d741763ee1171a11bf931f5891ef4d4ee84fca72be2",
+ "url": "https://repo1.maven.org/maven2/com/google/auto/value/auto-value-annotations/1.10.1/auto-value-annotations-1.10.1.jar"
+ },
+ {
+ "coord": "com.google.code.findbugs:jsr305:3.0.2",
+ "dependencies": [],
+ "directDependencies": [],
+ "file": "v1/https/repo1.maven.org/maven2/com/google/code/findbugs/jsr305/3.0.2/jsr305-3.0.2.jar",
+ "mirror_urls": [
+ "https://maven.google.com/com/google/code/findbugs/jsr305/3.0.2/jsr305-3.0.2.jar",
+ "https://repo1.maven.org/maven2/com/google/code/findbugs/jsr305/3.0.2/jsr305-3.0.2.jar"
+ ],
+ "sha256": "766ad2a0783f2687962c8ad74ceecc38a28b9f72a2d085ee438b7813e928d0c7",
+ "url": "https://repo1.maven.org/maven2/com/google/code/findbugs/jsr305/3.0.2/jsr305-3.0.2.jar"
+ },
+ {
+ "coord": "com.google.code.gson:gson:2.10",
+ "dependencies": [],
+ "directDependencies": [],
+ "file": "v1/https/repo1.maven.org/maven2/com/google/code/gson/gson/2.10/gson-2.10.jar",
+ "mirror_urls": [
+ "https://maven.google.com/com/google/code/gson/gson/2.10/gson-2.10.jar",
+ "https://repo1.maven.org/maven2/com/google/code/gson/gson/2.10/gson-2.10.jar"
+ ],
+ "sha256": "0cdd163ce3598a20fc04eee71b140b24f6f2a3b35f0a499dbbdd9852e83fbfaf",
+ "url": "https://repo1.maven.org/maven2/com/google/code/gson/gson/2.10/gson-2.10.jar"
+ },
+ {
+ "coord": "com.google.crypto.tink:tink:1.7.0",
+ "dependencies": [
+ "com.google.code.gson:gson:2.10",
+ "com.google.protobuf:protobuf-java:3.21.8"
+ ],
+ "directDependencies": [
+ "com.google.code.gson:gson:2.10",
+ "com.google.protobuf:protobuf-java:3.21.8"
+ ],
+ "file": "v1/https/repo1.maven.org/maven2/com/google/crypto/tink/tink/1.7.0/tink-1.7.0.jar",
+ "mirror_urls": [
+ "https://maven.google.com/com/google/crypto/tink/tink/1.7.0/tink-1.7.0.jar",
+ "https://repo1.maven.org/maven2/com/google/crypto/tink/tink/1.7.0/tink-1.7.0.jar"
+ ],
+ "sha256": "88970a456a08ba4c66b01b23e5846ca1095cc14e54cb48363e5d2e15a1307308",
+ "url": "https://repo1.maven.org/maven2/com/google/crypto/tink/tink/1.7.0/tink-1.7.0.jar"
+ },
+ {
+ "coord": "com.google.dagger:dagger:2.28.3",
+ "dependencies": [
+ "javax.inject:javax.inject:1"
+ ],
+ "directDependencies": [
+ "javax.inject:javax.inject:1"
+ ],
+ "file": "v1/https/repo1.maven.org/maven2/com/google/dagger/dagger/2.28.3/dagger-2.28.3.jar",
+ "mirror_urls": [
+ "https://maven.google.com/com/google/dagger/dagger/2.28.3/dagger-2.28.3.jar",
+ "https://repo1.maven.org/maven2/com/google/dagger/dagger/2.28.3/dagger-2.28.3.jar"
+ ],
+ "sha256": "f1dd23f8ae34a8e91366723991ead0d6499d1a3e9163ce550c200b02d76a872b",
+ "url": "https://repo1.maven.org/maven2/com/google/dagger/dagger/2.28.3/dagger-2.28.3.jar"
+ },
+ {
+ "coord": "com.google.errorprone:error_prone_annotations:2.19.1",
+ "dependencies": [],
+ "directDependencies": [],
+ "file": "v1/https/repo1.maven.org/maven2/com/google/errorprone/error_prone_annotations/2.19.1/error_prone_annotations-2.19.1.jar",
+ "mirror_urls": [
+ "https://maven.google.com/com/google/errorprone/error_prone_annotations/2.19.1/error_prone_annotations-2.19.1.jar",
+ "https://repo1.maven.org/maven2/com/google/errorprone/error_prone_annotations/2.19.1/error_prone_annotations-2.19.1.jar"
+ ],
+ "sha256": "add3990298501fdcb6ec58fff26608c1d298fb5dfe2f80d74867bf0f5c539668",
+ "url": "https://repo1.maven.org/maven2/com/google/errorprone/error_prone_annotations/2.19.1/error_prone_annotations-2.19.1.jar"
+ },
+ {
+ "coord": "com.google.flatbuffers:flatbuffers-java:1.12.0",
+ "dependencies": [],
+ "directDependencies": [],
+ "file": "v1/https/repo1.maven.org/maven2/com/google/flatbuffers/flatbuffers-java/1.12.0/flatbuffers-java-1.12.0.jar",
+ "mirror_urls": [
+ "https://maven.google.com/com/google/flatbuffers/flatbuffers-java/1.12.0/flatbuffers-java-1.12.0.jar",
+ "https://repo1.maven.org/maven2/com/google/flatbuffers/flatbuffers-java/1.12.0/flatbuffers-java-1.12.0.jar"
+ ],
+ "sha256": "3f8c088b4dd04a9858721f2e162508c94db0dd86f961e306ee63ef2eda871bf7",
+ "url": "https://repo1.maven.org/maven2/com/google/flatbuffers/flatbuffers-java/1.12.0/flatbuffers-java-1.12.0.jar"
+ },
+ {
+ "coord": "com.google.guava:failureaccess:1.0.1",
+ "dependencies": [],
+ "directDependencies": [],
+ "file": "v1/https/repo1.maven.org/maven2/com/google/guava/failureaccess/1.0.1/failureaccess-1.0.1.jar",
+ "mirror_urls": [
+ "https://maven.google.com/com/google/guava/failureaccess/1.0.1/failureaccess-1.0.1.jar",
+ "https://repo1.maven.org/maven2/com/google/guava/failureaccess/1.0.1/failureaccess-1.0.1.jar"
+ ],
+ "sha256": "a171ee4c734dd2da837e4b16be9df4661afab72a41adaf31eb84dfdaf936ca26",
+ "url": "https://repo1.maven.org/maven2/com/google/guava/failureaccess/1.0.1/failureaccess-1.0.1.jar"
+ },
+ {
+ "coord": "com.google.guava:guava:32.1.2-jre",
+ "dependencies": [
+ "com.google.guava:listenablefuture:9999.0-empty-to-avoid-conflict-with-guava",
+ "com.google.errorprone:error_prone_annotations:2.19.1",
+ "com.google.j2objc:j2objc-annotations:2.8",
+ "com.google.code.findbugs:jsr305:3.0.2",
+ "com.google.guava:failureaccess:1.0.1",
+ "org.checkerframework:checker-qual:3.35.0"
+ ],
+ "directDependencies": [
+ "com.google.guava:listenablefuture:9999.0-empty-to-avoid-conflict-with-guava",
+ "com.google.errorprone:error_prone_annotations:2.19.1",
+ "com.google.j2objc:j2objc-annotations:2.8",
+ "com.google.code.findbugs:jsr305:3.0.2",
+ "com.google.guava:failureaccess:1.0.1",
+ "org.checkerframework:checker-qual:3.35.0"
+ ],
+ "file": "v1/https/repo1.maven.org/maven2/com/google/guava/guava/32.1.2-jre/guava-32.1.2-jre.jar",
+ "mirror_urls": [
+ "https://maven.google.com/com/google/guava/guava/32.1.2-jre/guava-32.1.2-jre.jar",
+ "https://repo1.maven.org/maven2/com/google/guava/guava/32.1.2-jre/guava-32.1.2-jre.jar"
+ ],
+ "sha256": "bc65dea7cfd9e4dacf8419d8af0e741655857d27885bb35d943d7187fc3a8fce",
+ "url": "https://repo1.maven.org/maven2/com/google/guava/guava/32.1.2-jre/guava-32.1.2-jre.jar"
+ },
+ {
+ "coord": "com.google.guava:listenablefuture:9999.0-empty-to-avoid-conflict-with-guava",
+ "dependencies": [],
+ "directDependencies": [],
+ "file": "v1/https/repo1.maven.org/maven2/com/google/guava/listenablefuture/9999.0-empty-to-avoid-conflict-with-guava/listenablefuture-9999.0-empty-to-avoid-conflict-with-guava.jar",
+ "mirror_urls": [
+ "https://maven.google.com/com/google/guava/listenablefuture/9999.0-empty-to-avoid-conflict-with-guava/listenablefuture-9999.0-empty-to-avoid-conflict-with-guava.jar",
+ "https://repo1.maven.org/maven2/com/google/guava/listenablefuture/9999.0-empty-to-avoid-conflict-with-guava/listenablefuture-9999.0-empty-to-avoid-conflict-with-guava.jar"
+ ],
+ "sha256": "b372a037d4230aa57fbeffdef30fd6123f9c0c2db85d0aced00c91b974f33f99",
+ "url": "https://repo1.maven.org/maven2/com/google/guava/listenablefuture/9999.0-empty-to-avoid-conflict-with-guava/listenablefuture-9999.0-empty-to-avoid-conflict-with-guava.jar"
+ },
+ {
+ "coord": "com.google.j2objc:j2objc-annotations:2.8",
+ "dependencies": [],
+ "directDependencies": [],
+ "file": "v1/https/repo1.maven.org/maven2/com/google/j2objc/j2objc-annotations/2.8/j2objc-annotations-2.8.jar",
+ "mirror_urls": [
+ "https://maven.google.com/com/google/j2objc/j2objc-annotations/2.8/j2objc-annotations-2.8.jar",
+ "https://repo1.maven.org/maven2/com/google/j2objc/j2objc-annotations/2.8/j2objc-annotations-2.8.jar"
+ ],
+ "sha256": "f02a95fa1a5e95edb3ed859fd0fb7df709d121a35290eff8b74dce2ab7f4d6ed",
+ "url": "https://repo1.maven.org/maven2/com/google/j2objc/j2objc-annotations/2.8/j2objc-annotations-2.8.jar"
+ },
+ {
+ "coord": "com.google.jimfs:jimfs:1.1",
+ "dependencies": [
+ "com.google.guava:guava:32.1.2-jre"
+ ],
+ "directDependencies": [
+ "com.google.guava:guava:32.1.2-jre"
+ ],
+ "file": "v1/https/repo1.maven.org/maven2/com/google/jimfs/jimfs/1.1/jimfs-1.1.jar",
+ "mirror_urls": [
+ "https://maven.google.com/com/google/jimfs/jimfs/1.1/jimfs-1.1.jar",
+ "https://repo1.maven.org/maven2/com/google/jimfs/jimfs/1.1/jimfs-1.1.jar"
+ ],
+ "sha256": "c4828e28d7c0a930af9387510b3bada7daa5c04d7c25a75c7b8b081f1c257ddd",
+ "url": "https://repo1.maven.org/maven2/com/google/jimfs/jimfs/1.1/jimfs-1.1.jar"
+ },
+ {
+ "coord": "com.google.protobuf:protobuf-java-util:3.19.3",
+ "dependencies": [
+ "com.google.errorprone:error_prone_annotations:2.19.1",
+ "com.google.j2objc:j2objc-annotations:2.8",
+ "com.google.guava:guava:32.1.2-jre",
+ "com.google.code.findbugs:jsr305:3.0.2",
+ "com.google.protobuf:protobuf-java:3.21.8",
+ "com.google.code.gson:gson:2.10"
+ ],
+ "directDependencies": [
+ "com.google.errorprone:error_prone_annotations:2.19.1",
+ "com.google.j2objc:j2objc-annotations:2.8",
+ "com.google.guava:guava:32.1.2-jre",
+ "com.google.code.findbugs:jsr305:3.0.2",
+ "com.google.protobuf:protobuf-java:3.21.8",
+ "com.google.code.gson:gson:2.10"
+ ],
+ "file": "v1/https/repo1.maven.org/maven2/com/google/protobuf/protobuf-java-util/3.19.3/protobuf-java-util-3.19.3.jar",
+ "mirror_urls": [
+ "https://maven.google.com/com/google/protobuf/protobuf-java-util/3.19.3/protobuf-java-util-3.19.3.jar",
+ "https://repo1.maven.org/maven2/com/google/protobuf/protobuf-java-util/3.19.3/protobuf-java-util-3.19.3.jar"
+ ],
+ "sha256": "1ec0733f32d49f8194fb5452613039370623715739568a6d3c987d9a7809c16c",
+ "url": "https://repo1.maven.org/maven2/com/google/protobuf/protobuf-java-util/3.19.3/protobuf-java-util-3.19.3.jar"
+ },
+ {
+ "coord": "com.google.protobuf:protobuf-java:3.21.8",
+ "dependencies": [],
+ "directDependencies": [],
+ "file": "v1/https/repo1.maven.org/maven2/com/google/protobuf/protobuf-java/3.21.8/protobuf-java-3.21.8.jar",
+ "mirror_urls": [
+ "https://maven.google.com/com/google/protobuf/protobuf-java/3.21.8/protobuf-java-3.21.8.jar",
+ "https://repo1.maven.org/maven2/com/google/protobuf/protobuf-java/3.21.8/protobuf-java-3.21.8.jar"
+ ],
+ "sha256": "0b8581ad810d2dfaefd0dcfbf1569b1450448650238d7e2fd6b176c932d08c95",
+ "url": "https://repo1.maven.org/maven2/com/google/protobuf/protobuf-java/3.21.8/protobuf-java-3.21.8.jar"
+ },
+ {
+ "coord": "com.google.testing.platform:core-proto:0.0.8-alpha08",
+ "dependencies": [],
+ "directDependencies": [],
+ "file": "v1/https/maven.google.com/com/google/testing/platform/core-proto/0.0.8-alpha08/core-proto-0.0.8-alpha08.jar",
+ "mirror_urls": [
+ "https://maven.google.com/com/google/testing/platform/core-proto/0.0.8-alpha08/core-proto-0.0.8-alpha08.jar",
+ "https://repo1.maven.org/maven2/com/google/testing/platform/core-proto/0.0.8-alpha08/core-proto-0.0.8-alpha08.jar"
+ ],
+ "sha256": "3920575a74f1437975cdf45276f9b75e7ae41bafb8deb1d60e7d639f21d1b06c",
+ "url": "https://maven.google.com/com/google/testing/platform/core-proto/0.0.8-alpha08/core-proto-0.0.8-alpha08.jar"
+ },
+ {
+ "coord": "com.google.truth:truth:1.1.5",
+ "dependencies": [
+ "com.google.errorprone:error_prone_annotations:2.19.1",
+ "com.google.guava:guava:32.1.2-jre",
+ "org.hamcrest:hamcrest-core:1.3",
+ "org.ow2.asm:asm:9.5",
+ "com.google.auto.value:auto-value-annotations:1.10.1",
+ "junit:junit:4.13.2",
+ "org.checkerframework:checker-qual:3.35.0"
+ ],
+ "directDependencies": [
+ "com.google.errorprone:error_prone_annotations:2.19.1",
+ "com.google.guava:guava:32.1.2-jre",
+ "org.ow2.asm:asm:9.5",
+ "com.google.auto.value:auto-value-annotations:1.10.1",
+ "junit:junit:4.13.2",
+ "org.checkerframework:checker-qual:3.35.0"
+ ],
+ "file": "v1/https/repo1.maven.org/maven2/com/google/truth/truth/1.1.5/truth-1.1.5.jar",
+ "mirror_urls": [
+ "https://maven.google.com/com/google/truth/truth/1.1.5/truth-1.1.5.jar",
+ "https://repo1.maven.org/maven2/com/google/truth/truth/1.1.5/truth-1.1.5.jar"
+ ],
+ "sha256": "7f6d50d6f43a102942ef2c5a05f37a84f77788bb448cf33cceebf86d34e575c0",
+ "url": "https://repo1.maven.org/maven2/com/google/truth/truth/1.1.5/truth-1.1.5.jar"
+ },
+ {
+ "coord": "com.googlecode.juniversalchardet:juniversalchardet:1.0.3",
+ "dependencies": [],
+ "directDependencies": [],
+ "file": "v1/https/repo1.maven.org/maven2/com/googlecode/juniversalchardet/juniversalchardet/1.0.3/juniversalchardet-1.0.3.jar",
+ "mirror_urls": [
+ "https://maven.google.com/com/googlecode/juniversalchardet/juniversalchardet/1.0.3/juniversalchardet-1.0.3.jar",
+ "https://repo1.maven.org/maven2/com/googlecode/juniversalchardet/juniversalchardet/1.0.3/juniversalchardet-1.0.3.jar"
+ ],
+ "sha256": "757bfe906193b8b651e79dc26cd67d6b55d0770a2cdfb0381591504f779d4a76",
+ "url": "https://repo1.maven.org/maven2/com/googlecode/juniversalchardet/juniversalchardet/1.0.3/juniversalchardet-1.0.3.jar"
+ },
+ {
+ "coord": "com.ibm.icu:icu4j:72.1",
+ "dependencies": [],
+ "directDependencies": [],
+ "file": "v1/https/repo1.maven.org/maven2/com/ibm/icu/icu4j/72.1/icu4j-72.1.jar",
+ "mirror_urls": [
+ "https://maven.google.com/com/ibm/icu/icu4j/72.1/icu4j-72.1.jar",
+ "https://repo1.maven.org/maven2/com/ibm/icu/icu4j/72.1/icu4j-72.1.jar"
+ ],
+ "sha256": "3df572b240a68d13b5cd778ad2393e885d26411434cd8f098ac5987ea2e64ce3",
+ "url": "https://repo1.maven.org/maven2/com/ibm/icu/icu4j/72.1/icu4j-72.1.jar"
+ },
+ {
+ "coord": "com.squareup:javapoet:1.10.0",
+ "dependencies": [],
+ "directDependencies": [],
+ "file": "v1/https/repo1.maven.org/maven2/com/squareup/javapoet/1.10.0/javapoet-1.10.0.jar",
+ "mirror_urls": [
+ "https://maven.google.com/com/squareup/javapoet/1.10.0/javapoet-1.10.0.jar",
+ "https://repo1.maven.org/maven2/com/squareup/javapoet/1.10.0/javapoet-1.10.0.jar"
+ ],
+ "sha256": "20ef4b82e43ff7c652281a21313cf3b941092467add3fa73509c26f6969efdab",
+ "url": "https://repo1.maven.org/maven2/com/squareup/javapoet/1.10.0/javapoet-1.10.0.jar"
+ },
+ {
+ "coord": "com.squareup:javawriter:2.5.0",
+ "dependencies": [],
+ "directDependencies": [],
+ "file": "v1/https/repo1.maven.org/maven2/com/squareup/javawriter/2.5.0/javawriter-2.5.0.jar",
+ "mirror_urls": [
+ "https://maven.google.com/com/squareup/javawriter/2.5.0/javawriter-2.5.0.jar",
+ "https://repo1.maven.org/maven2/com/squareup/javawriter/2.5.0/javawriter-2.5.0.jar"
+ ],
+ "sha256": "fcfb09fb0ea0aa97d3cfe7ea792398081348e468f126b3603cb3803f240197f0",
+ "url": "https://repo1.maven.org/maven2/com/squareup/javawriter/2.5.0/javawriter-2.5.0.jar"
+ },
+ {
+ "coord": "com.squareup:kotlinpoet:1.14.2",
+ "dependencies": [
+ "org.jetbrains.kotlin:kotlin-reflect:1.9.0-Beta",
+ "org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.9.0-Beta"
+ ],
+ "directDependencies": [
+ "org.jetbrains.kotlin:kotlin-reflect:1.9.0-Beta",
+ "org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.9.0-Beta"
+ ],
+ "file": "v1/https/repo1.maven.org/maven2/com/squareup/kotlinpoet/1.14.2/kotlinpoet-1.14.2.jar",
+ "mirror_urls": [
+ "https://maven.google.com/com/squareup/kotlinpoet/1.14.2/kotlinpoet-1.14.2.jar",
+ "https://repo1.maven.org/maven2/com/squareup/kotlinpoet/1.14.2/kotlinpoet-1.14.2.jar"
+ ],
+ "sha256": "102d5d8a289d961cd7f39204c264d272e4aad775e388d909f6050e14558aae9b",
+ "url": "https://repo1.maven.org/maven2/com/squareup/kotlinpoet/1.14.2/kotlinpoet-1.14.2.jar"
+ },
+ {
+ "coord": "com.sun.activation:javax.activation:1.2.0",
+ "dependencies": [],
+ "directDependencies": [],
+ "file": "v1/https/repo1.maven.org/maven2/com/sun/activation/javax.activation/1.2.0/javax.activation-1.2.0.jar",
+ "mirror_urls": [
+ "https://maven.google.com/com/sun/activation/javax.activation/1.2.0/javax.activation-1.2.0.jar",
+ "https://repo1.maven.org/maven2/com/sun/activation/javax.activation/1.2.0/javax.activation-1.2.0.jar"
+ ],
+ "sha256": "993302b16cd7056f21e779cc577d175a810bb4900ef73cd8fbf2b50f928ba9ce",
+ "url": "https://repo1.maven.org/maven2/com/sun/activation/javax.activation/1.2.0/javax.activation-1.2.0.jar"
+ },
+ {
+ "coord": "com.sun.istack:istack-commons-runtime:3.0.8",
+ "dependencies": [
+ "jakarta.activation:jakarta.activation-api:1.2.1"
+ ],
+ "directDependencies": [
+ "jakarta.activation:jakarta.activation-api:1.2.1"
+ ],
+ "file": "v1/https/repo1.maven.org/maven2/com/sun/istack/istack-commons-runtime/3.0.8/istack-commons-runtime-3.0.8.jar",
+ "mirror_urls": [
+ "https://maven.google.com/com/sun/istack/istack-commons-runtime/3.0.8/istack-commons-runtime-3.0.8.jar",
+ "https://repo1.maven.org/maven2/com/sun/istack/istack-commons-runtime/3.0.8/istack-commons-runtime-3.0.8.jar"
+ ],
+ "sha256": "4ffabb06be454a05e4398e20c77fa2b6308d4b88dfbef7ca30a76b5b7d5505ef",
+ "url": "https://repo1.maven.org/maven2/com/sun/istack/istack-commons-runtime/3.0.8/istack-commons-runtime-3.0.8.jar"
+ },
+ {
+ "coord": "com.sun.xml.fastinfoset:FastInfoset:1.2.16",
+ "dependencies": [],
+ "directDependencies": [],
+ "file": "v1/https/repo1.maven.org/maven2/com/sun/xml/fastinfoset/FastInfoset/1.2.16/FastInfoset-1.2.16.jar",
+ "mirror_urls": [
+ "https://maven.google.com/com/sun/xml/fastinfoset/FastInfoset/1.2.16/FastInfoset-1.2.16.jar",
+ "https://repo1.maven.org/maven2/com/sun/xml/fastinfoset/FastInfoset/1.2.16/FastInfoset-1.2.16.jar"
+ ],
+ "sha256": "056f3a1e144409f21ed16afc26805f58e9a21f3fce1543c42d400719d250c511",
+ "url": "https://repo1.maven.org/maven2/com/sun/xml/fastinfoset/FastInfoset/1.2.16/FastInfoset-1.2.16.jar"
+ },
+ {
+ "coord": "commons-codec:commons-codec:1.11",
+ "dependencies": [],
+ "directDependencies": [],
+ "file": "v1/https/repo1.maven.org/maven2/commons-codec/commons-codec/1.11/commons-codec-1.11.jar",
+ "mirror_urls": [
+ "https://maven.google.com/commons-codec/commons-codec/1.11/commons-codec-1.11.jar",
+ "https://repo1.maven.org/maven2/commons-codec/commons-codec/1.11/commons-codec-1.11.jar"
+ ],
+ "sha256": "e599d5318e97aa48f42136a2927e6dfa4e8881dff0e6c8e3109ddbbff51d7b7d",
+ "url": "https://repo1.maven.org/maven2/commons-codec/commons-codec/1.11/commons-codec-1.11.jar"
+ },
+ {
+ "coord": "commons-io:commons-io:2.4",
+ "dependencies": [],
+ "directDependencies": [],
+ "file": "v1/https/repo1.maven.org/maven2/commons-io/commons-io/2.4/commons-io-2.4.jar",
+ "mirror_urls": [
+ "https://maven.google.com/commons-io/commons-io/2.4/commons-io-2.4.jar",
+ "https://repo1.maven.org/maven2/commons-io/commons-io/2.4/commons-io-2.4.jar"
+ ],
+ "sha256": "cc6a41dc3eaacc9e440a6bd0d2890b20d36b4ee408fe2d67122f328bb6e01581",
+ "url": "https://repo1.maven.org/maven2/commons-io/commons-io/2.4/commons-io-2.4.jar"
+ },
+ {
+ "coord": "commons-logging:commons-logging:1.2",
+ "dependencies": [],
+ "directDependencies": [],
+ "file": "v1/https/repo1.maven.org/maven2/commons-logging/commons-logging/1.2/commons-logging-1.2.jar",
+ "mirror_urls": [
+ "https://maven.google.com/commons-logging/commons-logging/1.2/commons-logging-1.2.jar",
+ "https://repo1.maven.org/maven2/commons-logging/commons-logging/1.2/commons-logging-1.2.jar"
+ ],
+ "sha256": "daddea1ea0be0f56978ab3006b8ac92834afeefbd9b7e4e6316fca57df0fa636",
+ "url": "https://repo1.maven.org/maven2/commons-logging/commons-logging/1.2/commons-logging-1.2.jar"
+ },
+ {
+ "coord": "info.picocli:picocli:4.7.4",
+ "dependencies": [],
+ "directDependencies": [],
+ "file": "v1/https/repo1.maven.org/maven2/info/picocli/picocli/4.7.4/picocli-4.7.4.jar",
+ "mirror_urls": [
+ "https://maven.google.com/info/picocli/picocli/4.7.4/picocli-4.7.4.jar",
+ "https://repo1.maven.org/maven2/info/picocli/picocli/4.7.4/picocli-4.7.4.jar"
+ ],
+ "sha256": "1964e89575b43aa177aa4e534946b25bde9f3a48a9675d61d9ef7c4ca83d94b4",
+ "url": "https://repo1.maven.org/maven2/info/picocli/picocli/4.7.4/picocli-4.7.4.jar"
+ },
+ {
+ "coord": "io.grpc:grpc-api:1.45.1",
+ "dependencies": [
+ "com.google.errorprone:error_prone_annotations:2.19.1",
+ "com.google.guava:guava:32.1.2-jre",
+ "io.grpc:grpc-context:1.45.1",
+ "com.google.code.findbugs:jsr305:3.0.2"
+ ],
+ "directDependencies": [
+ "com.google.code.findbugs:jsr305:3.0.2",
+ "com.google.errorprone:error_prone_annotations:2.19.1",
+ "com.google.guava:guava:32.1.2-jre",
+ "io.grpc:grpc-context:1.45.1"
+ ],
+ "file": "v1/https/repo1.maven.org/maven2/io/grpc/grpc-api/1.45.1/grpc-api-1.45.1.jar",
+ "mirror_urls": [
+ "https://maven.google.com/io/grpc/grpc-api/1.45.1/grpc-api-1.45.1.jar",
+ "https://repo1.maven.org/maven2/io/grpc/grpc-api/1.45.1/grpc-api-1.45.1.jar"
+ ],
+ "sha256": "dc381fe018fb10bba8cc66f98db1050a70cee49a8270017c22ec6f77b10f13e5",
+ "url": "https://repo1.maven.org/maven2/io/grpc/grpc-api/1.45.1/grpc-api-1.45.1.jar"
+ },
+ {
+ "coord": "io.grpc:grpc-context:1.45.1",
+ "dependencies": [],
+ "directDependencies": [],
+ "file": "v1/https/repo1.maven.org/maven2/io/grpc/grpc-context/1.45.1/grpc-context-1.45.1.jar",
+ "mirror_urls": [
+ "https://maven.google.com/io/grpc/grpc-context/1.45.1/grpc-context-1.45.1.jar",
+ "https://repo1.maven.org/maven2/io/grpc/grpc-context/1.45.1/grpc-context-1.45.1.jar"
+ ],
+ "sha256": "262b8d0d23551ccb0c814f89794c73e9b5333ce71eab28eec6a9fc530613e15e",
+ "url": "https://repo1.maven.org/maven2/io/grpc/grpc-context/1.45.1/grpc-context-1.45.1.jar"
+ },
+ {
+ "coord": "io.grpc:grpc-core:1.45.1",
+ "dependencies": [
+ "com.google.errorprone:error_prone_annotations:2.19.1",
+ "com.google.guava:guava:32.1.2-jre",
+ "com.google.android:annotations:4.1.1.4",
+ "org.codehaus.mojo:animal-sniffer-annotations:1.19",
+ "io.perfmark:perfmark-api:0.23.0",
+ "io.grpc:grpc-api:1.45.1",
+ "com.google.code.gson:gson:2.10"
+ ],
+ "directDependencies": [
+ "com.google.errorprone:error_prone_annotations:2.19.1",
+ "com.google.guava:guava:32.1.2-jre",
+ "com.google.android:annotations:4.1.1.4",
+ "org.codehaus.mojo:animal-sniffer-annotations:1.19",
+ "io.perfmark:perfmark-api:0.23.0",
+ "io.grpc:grpc-api:1.45.1",
+ "com.google.code.gson:gson:2.10"
+ ],
+ "file": "v1/https/repo1.maven.org/maven2/io/grpc/grpc-core/1.45.1/grpc-core-1.45.1.jar",
+ "mirror_urls": [
+ "https://maven.google.com/io/grpc/grpc-core/1.45.1/grpc-core-1.45.1.jar",
+ "https://repo1.maven.org/maven2/io/grpc/grpc-core/1.45.1/grpc-core-1.45.1.jar"
+ ],
+ "sha256": "8dd8353e2a55678581ec92415c2b92cc8dafb437647dee57a49e36d1e8345b9e",
+ "url": "https://repo1.maven.org/maven2/io/grpc/grpc-core/1.45.1/grpc-core-1.45.1.jar"
+ },
+ {
+ "coord": "io.grpc:grpc-netty:1.45.1",
+ "dependencies": [
+ "com.google.errorprone:error_prone_annotations:2.19.1",
+ "io.grpc:grpc-core:1.45.1",
+ "com.google.guava:guava:32.1.2-jre",
+ "io.netty:netty-transport:4.1.72.Final",
+ "io.perfmark:perfmark-api:0.23.0",
+ "io.netty:netty-tcnative-classes:2.0.46.Final",
+ "io.netty:netty-common:4.1.72.Final",
+ "io.netty:netty-handler:4.1.72.Final",
+ "io.netty:netty-resolver:4.1.72.Final",
+ "io.netty:netty-buffer:4.1.72.Final",
+ "io.netty:netty-codec-http2:4.1.72.Final",
+ "io.netty:netty-codec-http:4.1.72.Final",
+ "io.netty:netty-handler-proxy:4.1.72.Final",
+ "io.netty:netty-codec-socks:4.1.72.Final",
+ "io.netty:netty-codec:4.1.72.Final"
+ ],
+ "directDependencies": [
+ "com.google.errorprone:error_prone_annotations:2.19.1",
+ "io.grpc:grpc-core:1.45.1",
+ "com.google.guava:guava:32.1.2-jre",
+ "io.perfmark:perfmark-api:0.23.0",
+ "io.netty:netty-codec-http2:4.1.72.Final",
+ "io.netty:netty-handler-proxy:4.1.72.Final"
+ ],
+ "file": "v1/https/repo1.maven.org/maven2/io/grpc/grpc-netty/1.45.1/grpc-netty-1.45.1.jar",
+ "mirror_urls": [
+ "https://maven.google.com/io/grpc/grpc-netty/1.45.1/grpc-netty-1.45.1.jar",
+ "https://repo1.maven.org/maven2/io/grpc/grpc-netty/1.45.1/grpc-netty-1.45.1.jar"
+ ],
+ "sha256": "0fef3ca6747242624cad219fdd13b5dbca121de04ea122f5cb1cb5082d998313",
+ "url": "https://repo1.maven.org/maven2/io/grpc/grpc-netty/1.45.1/grpc-netty-1.45.1.jar"
+ },
+ {
+ "coord": "io.grpc:grpc-protobuf-lite:1.45.1",
+ "dependencies": [
+ "com.google.errorprone:error_prone_annotations:2.19.1",
+ "com.google.guava:guava:32.1.2-jre",
+ "com.google.code.findbugs:jsr305:3.0.2",
+ "io.grpc:grpc-context:1.45.1",
+ "io.grpc:grpc-api:1.45.1"
+ ],
+ "directDependencies": [
+ "com.google.code.findbugs:jsr305:3.0.2",
+ "com.google.guava:guava:32.1.2-jre",
+ "io.grpc:grpc-api:1.45.1"
+ ],
+ "exclusions": [
+ "com.google.protobuf:protobuf-javalite"
+ ],
+ "file": "v1/https/repo1.maven.org/maven2/io/grpc/grpc-protobuf-lite/1.45.1/grpc-protobuf-lite-1.45.1.jar",
+ "mirror_urls": [
+ "https://maven.google.com/io/grpc/grpc-protobuf-lite/1.45.1/grpc-protobuf-lite-1.45.1.jar",
+ "https://repo1.maven.org/maven2/io/grpc/grpc-protobuf-lite/1.45.1/grpc-protobuf-lite-1.45.1.jar"
+ ],
+ "sha256": "874afc4cac1161fdd38121ffd56e58e8c85f5149c13954ab672d6b4ae24c8b9f",
+ "url": "https://repo1.maven.org/maven2/io/grpc/grpc-protobuf-lite/1.45.1/grpc-protobuf-lite-1.45.1.jar"
+ },
+ {
+ "coord": "io.grpc:grpc-protobuf:1.45.1",
+ "dependencies": [
+ "com.google.errorprone:error_prone_annotations:2.19.1",
+ "io.grpc:grpc-protobuf-lite:1.45.1",
+ "com.google.guava:guava:32.1.2-jre",
+ "com.google.code.findbugs:jsr305:3.0.2",
+ "io.grpc:grpc-context:1.45.1",
+ "io.grpc:grpc-api:1.45.1",
+ "com.google.protobuf:protobuf-java:3.21.8",
+ "com.google.api.grpc:proto-google-common-protos:2.0.1"
+ ],
+ "directDependencies": [
+ "io.grpc:grpc-protobuf-lite:1.45.1",
+ "com.google.guava:guava:32.1.2-jre",
+ "com.google.code.findbugs:jsr305:3.0.2",
+ "io.grpc:grpc-api:1.45.1",
+ "com.google.protobuf:protobuf-java:3.21.8",
+ "com.google.api.grpc:proto-google-common-protos:2.0.1"
+ ],
+ "file": "v1/https/repo1.maven.org/maven2/io/grpc/grpc-protobuf/1.45.1/grpc-protobuf-1.45.1.jar",
+ "mirror_urls": [
+ "https://maven.google.com/io/grpc/grpc-protobuf/1.45.1/grpc-protobuf-1.45.1.jar",
+ "https://repo1.maven.org/maven2/io/grpc/grpc-protobuf/1.45.1/grpc-protobuf-1.45.1.jar"
+ ],
+ "sha256": "f59fe662030e30923a91c5d80bf3a25486be2740d08b6757575e7c4213782694",
+ "url": "https://repo1.maven.org/maven2/io/grpc/grpc-protobuf/1.45.1/grpc-protobuf-1.45.1.jar"
+ },
+ {
+ "coord": "io.grpc:grpc-stub:1.45.1",
+ "dependencies": [
+ "com.google.errorprone:error_prone_annotations:2.19.1",
+ "com.google.guava:guava:32.1.2-jre",
+ "com.google.code.findbugs:jsr305:3.0.2",
+ "io.grpc:grpc-context:1.45.1",
+ "io.grpc:grpc-api:1.45.1"
+ ],
+ "directDependencies": [
+ "com.google.errorprone:error_prone_annotations:2.19.1",
+ "com.google.guava:guava:32.1.2-jre",
+ "io.grpc:grpc-api:1.45.1"
+ ],
+ "file": "v1/https/repo1.maven.org/maven2/io/grpc/grpc-stub/1.45.1/grpc-stub-1.45.1.jar",
+ "mirror_urls": [
+ "https://maven.google.com/io/grpc/grpc-stub/1.45.1/grpc-stub-1.45.1.jar",
+ "https://repo1.maven.org/maven2/io/grpc/grpc-stub/1.45.1/grpc-stub-1.45.1.jar"
+ ],
+ "sha256": "4d9d82c59b90383c17f152ba03123c6b4b5a885f933da9a05a05f5f2c9e5b4a0",
+ "url": "https://repo1.maven.org/maven2/io/grpc/grpc-stub/1.45.1/grpc-stub-1.45.1.jar"
+ },
+ {
+ "coord": "io.netty:netty-buffer:4.1.72.Final",
+ "dependencies": [
+ "io.netty:netty-common:4.1.72.Final"
+ ],
+ "directDependencies": [
+ "io.netty:netty-common:4.1.72.Final"
+ ],
+ "file": "v1/https/repo1.maven.org/maven2/io/netty/netty-buffer/4.1.72.Final/netty-buffer-4.1.72.Final.jar",
+ "mirror_urls": [
+ "https://maven.google.com/io/netty/netty-buffer/4.1.72.Final/netty-buffer-4.1.72.Final.jar",
+ "https://repo1.maven.org/maven2/io/netty/netty-buffer/4.1.72.Final/netty-buffer-4.1.72.Final.jar"
+ ],
+ "sha256": "568ff7cd9d8e2284ec980730c88924f686642929f8f219a74518b4e64755f3a1",
+ "url": "https://repo1.maven.org/maven2/io/netty/netty-buffer/4.1.72.Final/netty-buffer-4.1.72.Final.jar"
+ },
+ {
+ "coord": "io.netty:netty-codec-http2:4.1.72.Final",
+ "dependencies": [
+ "io.netty:netty-transport:4.1.72.Final",
+ "io.netty:netty-tcnative-classes:2.0.46.Final",
+ "io.netty:netty-common:4.1.72.Final",
+ "io.netty:netty-handler:4.1.72.Final",
+ "io.netty:netty-resolver:4.1.72.Final",
+ "io.netty:netty-buffer:4.1.72.Final",
+ "io.netty:netty-codec-http:4.1.72.Final",
+ "io.netty:netty-codec:4.1.72.Final"
+ ],
+ "directDependencies": [
+ "io.netty:netty-transport:4.1.72.Final",
+ "io.netty:netty-common:4.1.72.Final",
+ "io.netty:netty-handler:4.1.72.Final",
+ "io.netty:netty-buffer:4.1.72.Final",
+ "io.netty:netty-codec-http:4.1.72.Final",
+ "io.netty:netty-codec:4.1.72.Final"
+ ],
+ "file": "v1/https/repo1.maven.org/maven2/io/netty/netty-codec-http2/4.1.72.Final/netty-codec-http2-4.1.72.Final.jar",
+ "mirror_urls": [
+ "https://maven.google.com/io/netty/netty-codec-http2/4.1.72.Final/netty-codec-http2-4.1.72.Final.jar",
+ "https://repo1.maven.org/maven2/io/netty/netty-codec-http2/4.1.72.Final/netty-codec-http2-4.1.72.Final.jar"
+ ],
+ "sha256": "c89a70500f59e8563e720aaa808263a514bd9e2bd91ba84eab8c2ccb45f234b2",
+ "url": "https://repo1.maven.org/maven2/io/netty/netty-codec-http2/4.1.72.Final/netty-codec-http2-4.1.72.Final.jar"
+ },
+ {
+ "coord": "io.netty:netty-codec-http:4.1.72.Final",
+ "dependencies": [
+ "io.netty:netty-transport:4.1.72.Final",
+ "io.netty:netty-tcnative-classes:2.0.46.Final",
+ "io.netty:netty-common:4.1.72.Final",
+ "io.netty:netty-handler:4.1.72.Final",
+ "io.netty:netty-resolver:4.1.72.Final",
+ "io.netty:netty-buffer:4.1.72.Final",
+ "io.netty:netty-codec:4.1.72.Final"
+ ],
+ "directDependencies": [
+ "io.netty:netty-transport:4.1.72.Final",
+ "io.netty:netty-common:4.1.72.Final",
+ "io.netty:netty-handler:4.1.72.Final",
+ "io.netty:netty-buffer:4.1.72.Final",
+ "io.netty:netty-codec:4.1.72.Final"
+ ],
+ "file": "v1/https/repo1.maven.org/maven2/io/netty/netty-codec-http/4.1.72.Final/netty-codec-http-4.1.72.Final.jar",
+ "mirror_urls": [
+ "https://maven.google.com/io/netty/netty-codec-http/4.1.72.Final/netty-codec-http-4.1.72.Final.jar",
+ "https://repo1.maven.org/maven2/io/netty/netty-codec-http/4.1.72.Final/netty-codec-http-4.1.72.Final.jar"
+ ],
+ "sha256": "fa6fec88010bfaf6a7415b5364671b6b18ffb6b35a986ab97b423fd8c3a0174b",
+ "url": "https://repo1.maven.org/maven2/io/netty/netty-codec-http/4.1.72.Final/netty-codec-http-4.1.72.Final.jar"
+ },
+ {
+ "coord": "io.netty:netty-codec-socks:4.1.72.Final",
+ "dependencies": [
+ "io.netty:netty-transport:4.1.72.Final",
+ "io.netty:netty-common:4.1.72.Final",
+ "io.netty:netty-resolver:4.1.72.Final",
+ "io.netty:netty-buffer:4.1.72.Final",
+ "io.netty:netty-codec:4.1.72.Final"
+ ],
+ "directDependencies": [
+ "io.netty:netty-buffer:4.1.72.Final",
+ "io.netty:netty-codec:4.1.72.Final",
+ "io.netty:netty-common:4.1.72.Final",
+ "io.netty:netty-transport:4.1.72.Final"
+ ],
+ "file": "v1/https/repo1.maven.org/maven2/io/netty/netty-codec-socks/4.1.72.Final/netty-codec-socks-4.1.72.Final.jar",
+ "mirror_urls": [
+ "https://maven.google.com/io/netty/netty-codec-socks/4.1.72.Final/netty-codec-socks-4.1.72.Final.jar",
+ "https://repo1.maven.org/maven2/io/netty/netty-codec-socks/4.1.72.Final/netty-codec-socks-4.1.72.Final.jar"
+ ],
+ "sha256": "33c4cd134858aabc5afe5dc440c8880186017dc4dc541f34c8e16bffc5546d07",
+ "url": "https://repo1.maven.org/maven2/io/netty/netty-codec-socks/4.1.72.Final/netty-codec-socks-4.1.72.Final.jar"
+ },
+ {
+ "coord": "io.netty:netty-codec:4.1.72.Final",
+ "dependencies": [
+ "io.netty:netty-buffer:4.1.72.Final",
+ "io.netty:netty-transport:4.1.72.Final",
+ "io.netty:netty-common:4.1.72.Final",
+ "io.netty:netty-resolver:4.1.72.Final"
+ ],
+ "directDependencies": [
+ "io.netty:netty-buffer:4.1.72.Final",
+ "io.netty:netty-common:4.1.72.Final",
+ "io.netty:netty-transport:4.1.72.Final"
+ ],
+ "file": "v1/https/repo1.maven.org/maven2/io/netty/netty-codec/4.1.72.Final/netty-codec-4.1.72.Final.jar",
+ "mirror_urls": [
+ "https://maven.google.com/io/netty/netty-codec/4.1.72.Final/netty-codec-4.1.72.Final.jar",
+ "https://repo1.maven.org/maven2/io/netty/netty-codec/4.1.72.Final/netty-codec-4.1.72.Final.jar"
+ ],
+ "sha256": "5d8591ca271a1e9c224e8de3873aa9936acb581ee0db514e7dc18523df36d16c",
+ "url": "https://repo1.maven.org/maven2/io/netty/netty-codec/4.1.72.Final/netty-codec-4.1.72.Final.jar"
+ },
+ {
+ "coord": "io.netty:netty-common:4.1.72.Final",
+ "dependencies": [],
+ "directDependencies": [],
+ "file": "v1/https/repo1.maven.org/maven2/io/netty/netty-common/4.1.72.Final/netty-common-4.1.72.Final.jar",
+ "mirror_urls": [
+ "https://maven.google.com/io/netty/netty-common/4.1.72.Final/netty-common-4.1.72.Final.jar",
+ "https://repo1.maven.org/maven2/io/netty/netty-common/4.1.72.Final/netty-common-4.1.72.Final.jar"
+ ],
+ "sha256": "8adb4c291260ceb2859a68c49f0adeed36bf49587608e2b81ecff6aaf06025e9",
+ "url": "https://repo1.maven.org/maven2/io/netty/netty-common/4.1.72.Final/netty-common-4.1.72.Final.jar"
+ },
+ {
+ "coord": "io.netty:netty-handler-proxy:4.1.72.Final",
+ "dependencies": [
+ "io.netty:netty-transport:4.1.72.Final",
+ "io.netty:netty-tcnative-classes:2.0.46.Final",
+ "io.netty:netty-common:4.1.72.Final",
+ "io.netty:netty-handler:4.1.72.Final",
+ "io.netty:netty-resolver:4.1.72.Final",
+ "io.netty:netty-buffer:4.1.72.Final",
+ "io.netty:netty-codec-http:4.1.72.Final",
+ "io.netty:netty-codec-socks:4.1.72.Final",
+ "io.netty:netty-codec:4.1.72.Final"
+ ],
+ "directDependencies": [
+ "io.netty:netty-transport:4.1.72.Final",
+ "io.netty:netty-common:4.1.72.Final",
+ "io.netty:netty-buffer:4.1.72.Final",
+ "io.netty:netty-codec-http:4.1.72.Final",
+ "io.netty:netty-codec-socks:4.1.72.Final",
+ "io.netty:netty-codec:4.1.72.Final"
+ ],
+ "file": "v1/https/repo1.maven.org/maven2/io/netty/netty-handler-proxy/4.1.72.Final/netty-handler-proxy-4.1.72.Final.jar",
+ "mirror_urls": [
+ "https://maven.google.com/io/netty/netty-handler-proxy/4.1.72.Final/netty-handler-proxy-4.1.72.Final.jar",
+ "https://repo1.maven.org/maven2/io/netty/netty-handler-proxy/4.1.72.Final/netty-handler-proxy-4.1.72.Final.jar"
+ ],
+ "sha256": "ce1123250450d2b17815748177fd36843690b8cd703b47e6dc12d159d86da30d",
+ "url": "https://repo1.maven.org/maven2/io/netty/netty-handler-proxy/4.1.72.Final/netty-handler-proxy-4.1.72.Final.jar"
+ },
+ {
+ "coord": "io.netty:netty-handler:4.1.72.Final",
+ "dependencies": [
+ "io.netty:netty-transport:4.1.72.Final",
+ "io.netty:netty-tcnative-classes:2.0.46.Final",
+ "io.netty:netty-common:4.1.72.Final",
+ "io.netty:netty-resolver:4.1.72.Final",
+ "io.netty:netty-buffer:4.1.72.Final",
+ "io.netty:netty-codec:4.1.72.Final"
+ ],
+ "directDependencies": [
+ "io.netty:netty-transport:4.1.72.Final",
+ "io.netty:netty-tcnative-classes:2.0.46.Final",
+ "io.netty:netty-common:4.1.72.Final",
+ "io.netty:netty-resolver:4.1.72.Final",
+ "io.netty:netty-buffer:4.1.72.Final",
+ "io.netty:netty-codec:4.1.72.Final"
+ ],
+ "file": "v1/https/repo1.maven.org/maven2/io/netty/netty-handler/4.1.72.Final/netty-handler-4.1.72.Final.jar",
+ "mirror_urls": [
+ "https://maven.google.com/io/netty/netty-handler/4.1.72.Final/netty-handler-4.1.72.Final.jar",
+ "https://repo1.maven.org/maven2/io/netty/netty-handler/4.1.72.Final/netty-handler-4.1.72.Final.jar"
+ ],
+ "sha256": "9cb6012af7e06361d738ac4e3bdc49a158f8cf87d9dee0f2744056b7d99c28d5",
+ "url": "https://repo1.maven.org/maven2/io/netty/netty-handler/4.1.72.Final/netty-handler-4.1.72.Final.jar"
+ },
+ {
+ "coord": "io.netty:netty-resolver:4.1.72.Final",
+ "dependencies": [
+ "io.netty:netty-common:4.1.72.Final"
+ ],
+ "directDependencies": [
+ "io.netty:netty-common:4.1.72.Final"
+ ],
+ "file": "v1/https/repo1.maven.org/maven2/io/netty/netty-resolver/4.1.72.Final/netty-resolver-4.1.72.Final.jar",
+ "mirror_urls": [
+ "https://maven.google.com/io/netty/netty-resolver/4.1.72.Final/netty-resolver-4.1.72.Final.jar",
+ "https://repo1.maven.org/maven2/io/netty/netty-resolver/4.1.72.Final/netty-resolver-4.1.72.Final.jar"
+ ],
+ "sha256": "6474598aab7cc9d8d6cfa06c05bd1b19adbf7f8451dbdd73070b33a6c60b1b90",
+ "url": "https://repo1.maven.org/maven2/io/netty/netty-resolver/4.1.72.Final/netty-resolver-4.1.72.Final.jar"
+ },
+ {
+ "coord": "io.netty:netty-tcnative-classes:2.0.46.Final",
+ "dependencies": [],
+ "directDependencies": [],
+ "file": "v1/https/repo1.maven.org/maven2/io/netty/netty-tcnative-classes/2.0.46.Final/netty-tcnative-classes-2.0.46.Final.jar",
+ "mirror_urls": [
+ "https://maven.google.com/io/netty/netty-tcnative-classes/2.0.46.Final/netty-tcnative-classes-2.0.46.Final.jar",
+ "https://repo1.maven.org/maven2/io/netty/netty-tcnative-classes/2.0.46.Final/netty-tcnative-classes-2.0.46.Final.jar"
+ ],
+ "sha256": "d3ec888dcc4ac7915bf88b417c5e04fd354f4311032a748a6882df09347eed9a",
+ "url": "https://repo1.maven.org/maven2/io/netty/netty-tcnative-classes/2.0.46.Final/netty-tcnative-classes-2.0.46.Final.jar"
+ },
+ {
+ "coord": "io.netty:netty-transport:4.1.72.Final",
+ "dependencies": [
+ "io.netty:netty-buffer:4.1.72.Final",
+ "io.netty:netty-common:4.1.72.Final",
+ "io.netty:netty-resolver:4.1.72.Final"
+ ],
+ "directDependencies": [
+ "io.netty:netty-buffer:4.1.72.Final",
+ "io.netty:netty-common:4.1.72.Final",
+ "io.netty:netty-resolver:4.1.72.Final"
+ ],
+ "file": "v1/https/repo1.maven.org/maven2/io/netty/netty-transport/4.1.72.Final/netty-transport-4.1.72.Final.jar",
+ "mirror_urls": [
+ "https://maven.google.com/io/netty/netty-transport/4.1.72.Final/netty-transport-4.1.72.Final.jar",
+ "https://repo1.maven.org/maven2/io/netty/netty-transport/4.1.72.Final/netty-transport-4.1.72.Final.jar"
+ ],
+ "sha256": "c5fb68e9a65b6e8a516adfcb9fa323479ee7b4d9449d8a529d2ecab3d3711d5a",
+ "url": "https://repo1.maven.org/maven2/io/netty/netty-transport/4.1.72.Final/netty-transport-4.1.72.Final.jar"
+ },
+ {
+ "coord": "io.perfmark:perfmark-api:0.23.0",
+ "dependencies": [],
+ "directDependencies": [],
+ "file": "v1/https/repo1.maven.org/maven2/io/perfmark/perfmark-api/0.23.0/perfmark-api-0.23.0.jar",
+ "mirror_urls": [
+ "https://maven.google.com/io/perfmark/perfmark-api/0.23.0/perfmark-api-0.23.0.jar",
+ "https://repo1.maven.org/maven2/io/perfmark/perfmark-api/0.23.0/perfmark-api-0.23.0.jar"
+ ],
+ "sha256": "c705b5c10c18ff3032b9e81742bc2f6b0e5607f6a6dfc0c8ad0cff75d4913042",
+ "url": "https://repo1.maven.org/maven2/io/perfmark/perfmark-api/0.23.0/perfmark-api-0.23.0.jar"
+ },
+ {
+ "coord": "jakarta.activation:jakarta.activation-api:1.2.1",
+ "dependencies": [],
+ "directDependencies": [],
+ "file": "v1/https/repo1.maven.org/maven2/jakarta/activation/jakarta.activation-api/1.2.1/jakarta.activation-api-1.2.1.jar",
+ "mirror_urls": [
+ "https://maven.google.com/jakarta/activation/jakarta.activation-api/1.2.1/jakarta.activation-api-1.2.1.jar",
+ "https://repo1.maven.org/maven2/jakarta/activation/jakarta.activation-api/1.2.1/jakarta.activation-api-1.2.1.jar"
+ ],
+ "sha256": "8b0a0f52fa8b05c5431921a063ed866efaa41dadf2e3a7ee3e1961f2b0d9645b",
+ "url": "https://repo1.maven.org/maven2/jakarta/activation/jakarta.activation-api/1.2.1/jakarta.activation-api-1.2.1.jar"
+ },
+ {
+ "coord": "jakarta.xml.bind:jakarta.xml.bind-api:2.3.2",
+ "dependencies": [
+ "jakarta.activation:jakarta.activation-api:1.2.1"
+ ],
+ "directDependencies": [
+ "jakarta.activation:jakarta.activation-api:1.2.1"
+ ],
+ "file": "v1/https/repo1.maven.org/maven2/jakarta/xml/bind/jakarta.xml.bind-api/2.3.2/jakarta.xml.bind-api-2.3.2.jar",
+ "mirror_urls": [
+ "https://maven.google.com/jakarta/xml/bind/jakarta.xml.bind-api/2.3.2/jakarta.xml.bind-api-2.3.2.jar",
+ "https://repo1.maven.org/maven2/jakarta/xml/bind/jakarta.xml.bind-api/2.3.2/jakarta.xml.bind-api-2.3.2.jar"
+ ],
+ "sha256": "69156304079bdeed9fc0ae3b39389f19b3cc4ba4443bc80508995394ead742ea",
+ "url": "https://repo1.maven.org/maven2/jakarta/xml/bind/jakarta.xml.bind-api/2.3.2/jakarta.xml.bind-api-2.3.2.jar"
+ },
+ {
+ "coord": "javax.annotation:javax.annotation-api:1.3.2",
+ "dependencies": [],
+ "directDependencies": [],
+ "file": "v1/https/repo1.maven.org/maven2/javax/annotation/javax.annotation-api/1.3.2/javax.annotation-api-1.3.2.jar",
+ "mirror_urls": [
+ "https://maven.google.com/javax/annotation/javax.annotation-api/1.3.2/javax.annotation-api-1.3.2.jar",
+ "https://repo1.maven.org/maven2/javax/annotation/javax.annotation-api/1.3.2/javax.annotation-api-1.3.2.jar"
+ ],
+ "sha256": "e04ba5195bcd555dc95650f7cc614d151e4bcd52d29a10b8aa2197f3ab89ab9b",
+ "url": "https://repo1.maven.org/maven2/javax/annotation/javax.annotation-api/1.3.2/javax.annotation-api-1.3.2.jar"
+ },
+ {
+ "coord": "javax.inject:javax.inject:1",
+ "dependencies": [],
+ "directDependencies": [],
+ "file": "v1/https/repo1.maven.org/maven2/javax/inject/javax.inject/1/javax.inject-1.jar",
+ "mirror_urls": [
+ "https://maven.google.com/javax/inject/javax.inject/1/javax.inject-1.jar",
+ "https://repo1.maven.org/maven2/javax/inject/javax.inject/1/javax.inject-1.jar"
+ ],
+ "sha256": "91c77044a50c481636c32d916fd89c9118a72195390452c81065080f957de7ff",
+ "url": "https://repo1.maven.org/maven2/javax/inject/javax.inject/1/javax.inject-1.jar"
+ },
+ {
+ "coord": "junit:junit:4.13.2",
+ "dependencies": [
+ "org.hamcrest:hamcrest-core:1.3"
+ ],
+ "directDependencies": [
+ "org.hamcrest:hamcrest-core:1.3"
+ ],
+ "file": "v1/https/repo1.maven.org/maven2/junit/junit/4.13.2/junit-4.13.2.jar",
+ "mirror_urls": [
+ "https://maven.google.com/junit/junit/4.13.2/junit-4.13.2.jar",
+ "https://repo1.maven.org/maven2/junit/junit/4.13.2/junit-4.13.2.jar"
+ ],
+ "sha256": "8e495b634469d64fb8acfa3495a065cbacc8a0fff55ce1e31007be4c16dc57d3",
+ "url": "https://repo1.maven.org/maven2/junit/junit/4.13.2/junit-4.13.2.jar"
+ },
+ {
+ "coord": "net.java.dev.jna:jna-platform:5.6.0",
+ "dependencies": [
+ "net.java.dev.jna:jna:5.6.0"
+ ],
+ "directDependencies": [
+ "net.java.dev.jna:jna:5.6.0"
+ ],
+ "file": "v1/https/repo1.maven.org/maven2/net/java/dev/jna/jna-platform/5.6.0/jna-platform-5.6.0.jar",
+ "mirror_urls": [
+ "https://maven.google.com/net/java/dev/jna/jna-platform/5.6.0/jna-platform-5.6.0.jar",
+ "https://repo1.maven.org/maven2/net/java/dev/jna/jna-platform/5.6.0/jna-platform-5.6.0.jar"
+ ],
+ "sha256": "9ecea8bf2b1b39963939d18b70464eef60c508fed8820f9dcaba0c35518eabf7",
+ "url": "https://repo1.maven.org/maven2/net/java/dev/jna/jna-platform/5.6.0/jna-platform-5.6.0.jar"
+ },
+ {
+ "coord": "net.java.dev.jna:jna:5.6.0",
+ "dependencies": [],
+ "directDependencies": [],
+ "file": "v1/https/repo1.maven.org/maven2/net/java/dev/jna/jna/5.6.0/jna-5.6.0.jar",
+ "mirror_urls": [
+ "https://maven.google.com/net/java/dev/jna/jna/5.6.0/jna-5.6.0.jar",
+ "https://repo1.maven.org/maven2/net/java/dev/jna/jna/5.6.0/jna-5.6.0.jar"
+ ],
+ "sha256": "5557e235a8aa2f9766d5dc609d67948f2a8832c2d796cea9ef1d6cbe0b3b7eaf",
+ "url": "https://repo1.maven.org/maven2/net/java/dev/jna/jna/5.6.0/jna-5.6.0.jar"
+ },
+ {
+ "coord": "net.sf.jopt-simple:jopt-simple:4.9",
+ "dependencies": [],
+ "directDependencies": [],
+ "file": "v1/https/repo1.maven.org/maven2/net/sf/jopt-simple/jopt-simple/4.9/jopt-simple-4.9.jar",
+ "mirror_urls": [
+ "https://maven.google.com/net/sf/jopt-simple/jopt-simple/4.9/jopt-simple-4.9.jar",
+ "https://repo1.maven.org/maven2/net/sf/jopt-simple/jopt-simple/4.9/jopt-simple-4.9.jar"
+ ],
+ "sha256": "26c5856e954b5f864db76f13b86919b59c6eecf9fd930b96baa8884626baf2f5",
+ "url": "https://repo1.maven.org/maven2/net/sf/jopt-simple/jopt-simple/4.9/jopt-simple-4.9.jar"
+ },
+ {
+ "coord": "net.sf.kxml:kxml2:2.3.0",
+ "dependencies": [],
+ "directDependencies": [],
+ "file": "v1/https/repo1.maven.org/maven2/net/sf/kxml/kxml2/2.3.0/kxml2-2.3.0.jar",
+ "mirror_urls": [
+ "https://maven.google.com/net/sf/kxml/kxml2/2.3.0/kxml2-2.3.0.jar",
+ "https://repo1.maven.org/maven2/net/sf/kxml/kxml2/2.3.0/kxml2-2.3.0.jar"
+ ],
+ "sha256": "f264dd9f79a1fde10ce5ecc53221eff24be4c9331c830b7d52f2f08a7b633de2",
+ "url": "https://repo1.maven.org/maven2/net/sf/kxml/kxml2/2.3.0/kxml2-2.3.0.jar"
+ },
+ {
+ "coord": "org.apache.commons:commons-compress:1.21",
+ "dependencies": [],
+ "directDependencies": [],
+ "file": "v1/https/repo1.maven.org/maven2/org/apache/commons/commons-compress/1.21/commons-compress-1.21.jar",
+ "mirror_urls": [
+ "https://maven.google.com/org/apache/commons/commons-compress/1.21/commons-compress-1.21.jar",
+ "https://repo1.maven.org/maven2/org/apache/commons/commons-compress/1.21/commons-compress-1.21.jar"
+ ],
+ "sha256": "6aecfd5459728a595601cfa07258d131972ffc39b492eb48bdd596577a2f244a",
+ "url": "https://repo1.maven.org/maven2/org/apache/commons/commons-compress/1.21/commons-compress-1.21.jar"
+ },
+ {
+ "coord": "org.apache.httpcomponents:httpclient:4.5.14",
+ "dependencies": [
+ "org.apache.httpcomponents:httpcore:4.4.16",
+ "commons-logging:commons-logging:1.2",
+ "commons-codec:commons-codec:1.11"
+ ],
+ "directDependencies": [
+ "commons-codec:commons-codec:1.11",
+ "commons-logging:commons-logging:1.2",
+ "org.apache.httpcomponents:httpcore:4.4.16"
+ ],
+ "file": "v1/https/repo1.maven.org/maven2/org/apache/httpcomponents/httpclient/4.5.14/httpclient-4.5.14.jar",
+ "mirror_urls": [
+ "https://maven.google.com/org/apache/httpcomponents/httpclient/4.5.14/httpclient-4.5.14.jar",
+ "https://repo1.maven.org/maven2/org/apache/httpcomponents/httpclient/4.5.14/httpclient-4.5.14.jar"
+ ],
+ "sha256": "c8bc7e1c51a6d4ce72f40d2ebbabf1c4b68bfe76e732104b04381b493478e9d6",
+ "url": "https://repo1.maven.org/maven2/org/apache/httpcomponents/httpclient/4.5.14/httpclient-4.5.14.jar"
+ },
+ {
+ "coord": "org.apache.httpcomponents:httpcore:4.4.16",
+ "dependencies": [],
+ "directDependencies": [],
+ "file": "v1/https/repo1.maven.org/maven2/org/apache/httpcomponents/httpcore/4.4.16/httpcore-4.4.16.jar",
+ "mirror_urls": [
+ "https://maven.google.com/org/apache/httpcomponents/httpcore/4.4.16/httpcore-4.4.16.jar",
+ "https://repo1.maven.org/maven2/org/apache/httpcomponents/httpcore/4.4.16/httpcore-4.4.16.jar"
+ ],
+ "sha256": "6c9b3dd142a09dc468e23ad39aad6f75a0f2b85125104469f026e52a474e464f",
+ "url": "https://repo1.maven.org/maven2/org/apache/httpcomponents/httpcore/4.4.16/httpcore-4.4.16.jar"
+ },
+ {
+ "coord": "org.apache.httpcomponents:httpmime:4.5.6",
+ "dependencies": [
+ "org.apache.httpcomponents:httpclient:4.5.14"
+ ],
+ "directDependencies": [
+ "org.apache.httpcomponents:httpclient:4.5.14"
+ ],
+ "file": "v1/https/repo1.maven.org/maven2/org/apache/httpcomponents/httpmime/4.5.6/httpmime-4.5.6.jar",
+ "mirror_urls": [
+ "https://maven.google.com/org/apache/httpcomponents/httpmime/4.5.6/httpmime-4.5.6.jar",
+ "https://repo1.maven.org/maven2/org/apache/httpcomponents/httpmime/4.5.6/httpmime-4.5.6.jar"
+ ],
+ "sha256": "0b2b1102c18d3c7e05a77214b9b7501a6f6056174ae5604e0e256776eda7553e",
+ "url": "https://repo1.maven.org/maven2/org/apache/httpcomponents/httpmime/4.5.6/httpmime-4.5.6.jar"
+ },
+ {
+ "coord": "org.bitbucket.b_c:jose4j:0.7.0",
+ "dependencies": [],
+ "directDependencies": [],
+ "exclusions": [
+ "org.slf4j:slf4j-api"
+ ],
+ "file": "v1/https/repo1.maven.org/maven2/org/bitbucket/b_c/jose4j/0.7.0/jose4j-0.7.0.jar",
+ "mirror_urls": [
+ "https://maven.google.com/org/bitbucket/b_c/jose4j/0.7.0/jose4j-0.7.0.jar",
+ "https://repo1.maven.org/maven2/org/bitbucket/b_c/jose4j/0.7.0/jose4j-0.7.0.jar"
+ ],
+ "sha256": "eb14f69c0395d4a106c6c46fe6dff080c4608ccabc99b1f03933d374383d9bbe",
+ "url": "https://repo1.maven.org/maven2/org/bitbucket/b_c/jose4j/0.7.0/jose4j-0.7.0.jar"
+ },
+ {
+ "coord": "org.bouncycastle:bcpkix-jdk15on:1.67",
+ "dependencies": [
+ "org.bouncycastle:bcprov-jdk15on:jar:1.67"
+ ],
+ "directDependencies": [
+ "org.bouncycastle:bcprov-jdk15on:jar:1.67"
+ ],
+ "file": "v1/https/repo1.maven.org/maven2/org/bouncycastle/bcpkix-jdk15on/1.67/bcpkix-jdk15on-1.67.jar",
+ "mirror_urls": [
+ "https://maven.google.com/org/bouncycastle/bcpkix-jdk15on/1.67/bcpkix-jdk15on-1.67.jar",
+ "https://repo1.maven.org/maven2/org/bouncycastle/bcpkix-jdk15on/1.67/bcpkix-jdk15on-1.67.jar"
+ ],
+ "sha256": "efbca754880ce3922ca47a43c1f0b72c45731450a0ef193b9db33bf4bb38ce5f",
+ "url": "https://repo1.maven.org/maven2/org/bouncycastle/bcpkix-jdk15on/1.67/bcpkix-jdk15on-1.67.jar"
+ },
+ {
+ "coord": "org.bouncycastle:bcprov-jdk15on:1.67",
+ "dependencies": [],
+ "directDependencies": [],
+ "file": "v1/https/repo1.maven.org/maven2/org/bouncycastle/bcprov-jdk15on/1.67/bcprov-jdk15on-1.67.jar",
+ "mirror_urls": [
+ "https://maven.google.com/org/bouncycastle/bcprov-jdk15on/1.67/bcprov-jdk15on-1.67.jar",
+ "https://repo1.maven.org/maven2/org/bouncycastle/bcprov-jdk15on/1.67/bcprov-jdk15on-1.67.jar"
+ ],
+ "sha256": "fa0041a36f9f20af3c6b8dbf6eb49a969e2c9cc029049d61acc526ba3247b3ef",
+ "url": "https://repo1.maven.org/maven2/org/bouncycastle/bcprov-jdk15on/1.67/bcprov-jdk15on-1.67.jar"
+ },
+ {
+ "coord": "org.bouncycastle:bcprov-jdk18on:1.72",
+ "dependencies": [],
+ "directDependencies": [],
+ "file": "v1/https/repo1.maven.org/maven2/org/bouncycastle/bcprov-jdk18on/1.72/bcprov-jdk18on-1.72.jar",
+ "mirror_urls": [
+ "https://maven.google.com/org/bouncycastle/bcprov-jdk18on/1.72/bcprov-jdk18on-1.72.jar",
+ "https://repo1.maven.org/maven2/org/bouncycastle/bcprov-jdk18on/1.72/bcprov-jdk18on-1.72.jar"
+ ],
+ "sha256": "39287f2208a753db419f5ca529d6c80f094614aa74d790331126b3c9c6b85fda",
+ "url": "https://repo1.maven.org/maven2/org/bouncycastle/bcprov-jdk18on/1.72/bcprov-jdk18on-1.72.jar"
+ },
+ {
+ "coord": "org.checkerframework:checker-qual:3.35.0",
+ "dependencies": [],
+ "directDependencies": [],
+ "file": "v1/https/repo1.maven.org/maven2/org/checkerframework/checker-qual/3.35.0/checker-qual-3.35.0.jar",
+ "mirror_urls": [
+ "https://maven.google.com/org/checkerframework/checker-qual/3.35.0/checker-qual-3.35.0.jar",
+ "https://repo1.maven.org/maven2/org/checkerframework/checker-qual/3.35.0/checker-qual-3.35.0.jar"
+ ],
+ "sha256": "21060faa086dfdec830a40f9460677a75ebbdcffe7cdc012ad1069e9cc30a959",
+ "url": "https://repo1.maven.org/maven2/org/checkerframework/checker-qual/3.35.0/checker-qual-3.35.0.jar"
+ },
+ {
+ "coord": "org.codehaus.mojo:animal-sniffer-annotations:1.19",
+ "dependencies": [],
+ "directDependencies": [],
+ "file": "v1/https/repo1.maven.org/maven2/org/codehaus/mojo/animal-sniffer-annotations/1.19/animal-sniffer-annotations-1.19.jar",
+ "mirror_urls": [
+ "https://maven.google.com/org/codehaus/mojo/animal-sniffer-annotations/1.19/animal-sniffer-annotations-1.19.jar",
+ "https://repo1.maven.org/maven2/org/codehaus/mojo/animal-sniffer-annotations/1.19/animal-sniffer-annotations-1.19.jar"
+ ],
+ "sha256": "e67ec27ceeaf13ab5d54cf5fdbcc544c41b4db8d02d9f006678cca2c7c13ee9d",
+ "url": "https://repo1.maven.org/maven2/org/codehaus/mojo/animal-sniffer-annotations/1.19/animal-sniffer-annotations-1.19.jar"
+ },
+ {
+ "coord": "org.conscrypt:conscrypt-openjdk-uber:2.5.2",
+ "dependencies": [],
+ "directDependencies": [],
+ "file": "v1/https/repo1.maven.org/maven2/org/conscrypt/conscrypt-openjdk-uber/2.5.2/conscrypt-openjdk-uber-2.5.2.jar",
+ "mirror_urls": [
+ "https://maven.google.com/org/conscrypt/conscrypt-openjdk-uber/2.5.2/conscrypt-openjdk-uber-2.5.2.jar",
+ "https://repo1.maven.org/maven2/org/conscrypt/conscrypt-openjdk-uber/2.5.2/conscrypt-openjdk-uber-2.5.2.jar"
+ ],
+ "sha256": "eaf537d98e033d0f0451cd1b8cc74e02d7b55ec882da63c88060d806ba89c348",
+ "url": "https://repo1.maven.org/maven2/org/conscrypt/conscrypt-openjdk-uber/2.5.2/conscrypt-openjdk-uber-2.5.2.jar"
+ },
+ {
+ "coord": "org.glassfish.jaxb:jaxb-runtime:2.3.2",
+ "dependencies": [
+ "jakarta.activation:jakarta.activation-api:1.2.1",
+ "org.glassfish.jaxb:txw2:2.3.2",
+ "jakarta.xml.bind:jakarta.xml.bind-api:2.3.2",
+ "com.sun.xml.fastinfoset:FastInfoset:1.2.16",
+ "org.jvnet.staxex:stax-ex:1.8.1",
+ "com.sun.istack:istack-commons-runtime:3.0.8"
+ ],
+ "directDependencies": [
+ "jakarta.activation:jakarta.activation-api:1.2.1",
+ "org.glassfish.jaxb:txw2:2.3.2",
+ "jakarta.xml.bind:jakarta.xml.bind-api:2.3.2",
+ "com.sun.xml.fastinfoset:FastInfoset:1.2.16",
+ "org.jvnet.staxex:stax-ex:1.8.1",
+ "com.sun.istack:istack-commons-runtime:3.0.8"
+ ],
+ "file": "v1/https/repo1.maven.org/maven2/org/glassfish/jaxb/jaxb-runtime/2.3.2/jaxb-runtime-2.3.2.jar",
+ "mirror_urls": [
+ "https://maven.google.com/org/glassfish/jaxb/jaxb-runtime/2.3.2/jaxb-runtime-2.3.2.jar",
+ "https://repo1.maven.org/maven2/org/glassfish/jaxb/jaxb-runtime/2.3.2/jaxb-runtime-2.3.2.jar"
+ ],
+ "sha256": "e6e0a1e89fb6ff786279e6a0082d5cef52dc2ebe67053d041800737652b4fd1b",
+ "url": "https://repo1.maven.org/maven2/org/glassfish/jaxb/jaxb-runtime/2.3.2/jaxb-runtime-2.3.2.jar"
+ },
+ {
+ "coord": "org.glassfish.jaxb:txw2:2.3.2",
+ "dependencies": [],
+ "directDependencies": [],
+ "file": "v1/https/repo1.maven.org/maven2/org/glassfish/jaxb/txw2/2.3.2/txw2-2.3.2.jar",
+ "mirror_urls": [
+ "https://maven.google.com/org/glassfish/jaxb/txw2/2.3.2/txw2-2.3.2.jar",
+ "https://repo1.maven.org/maven2/org/glassfish/jaxb/txw2/2.3.2/txw2-2.3.2.jar"
+ ],
+ "sha256": "4a6a9f483388d461b81aa9a28c685b8b74c0597993bf1884b04eddbca95f48fe",
+ "url": "https://repo1.maven.org/maven2/org/glassfish/jaxb/txw2/2.3.2/txw2-2.3.2.jar"
+ },
+ {
+ "coord": "org.hamcrest:hamcrest-core:1.3",
+ "dependencies": [],
+ "directDependencies": [],
+ "file": "v1/https/repo1.maven.org/maven2/org/hamcrest/hamcrest-core/1.3/hamcrest-core-1.3.jar",
+ "mirror_urls": [
+ "https://maven.google.com/org/hamcrest/hamcrest-core/1.3/hamcrest-core-1.3.jar",
+ "https://repo1.maven.org/maven2/org/hamcrest/hamcrest-core/1.3/hamcrest-core-1.3.jar"
+ ],
+ "sha256": "66fdef91e9739348df7a096aa384a5685f4e875584cce89386a7a47251c4d8e9",
+ "url": "https://repo1.maven.org/maven2/org/hamcrest/hamcrest-core/1.3/hamcrest-core-1.3.jar"
+ },
+ {
+ "coord": "org.jdom:jdom2:2.0.6",
+ "dependencies": [],
+ "directDependencies": [],
+ "file": "v1/https/repo1.maven.org/maven2/org/jdom/jdom2/2.0.6/jdom2-2.0.6.jar",
+ "mirror_urls": [
+ "https://maven.google.com/org/jdom/jdom2/2.0.6/jdom2-2.0.6.jar",
+ "https://repo1.maven.org/maven2/org/jdom/jdom2/2.0.6/jdom2-2.0.6.jar"
+ ],
+ "sha256": "1345f11ba606d15603d6740551a8c21947c0215640770ec67271fe78bea97cf5",
+ "url": "https://repo1.maven.org/maven2/org/jdom/jdom2/2.0.6/jdom2-2.0.6.jar"
+ },
+ {
+ "coord": "org.jetbrains.intellij.deps:trove4j:1.0.20200330",
+ "dependencies": [],
+ "directDependencies": [],
+ "file": "v1/https/repo1.maven.org/maven2/org/jetbrains/intellij/deps/trove4j/1.0.20200330/trove4j-1.0.20200330.jar",
+ "mirror_urls": [
+ "https://maven.google.com/org/jetbrains/intellij/deps/trove4j/1.0.20200330/trove4j-1.0.20200330.jar",
+ "https://repo1.maven.org/maven2/org/jetbrains/intellij/deps/trove4j/1.0.20200330/trove4j-1.0.20200330.jar"
+ ],
+ "sha256": "c5fd725bffab51846bf3c77db1383c60aaaebfe1b7fe2f00d23fe1b7df0a439d",
+ "url": "https://repo1.maven.org/maven2/org/jetbrains/intellij/deps/trove4j/1.0.20200330/trove4j-1.0.20200330.jar"
+ },
+ {
+ "coord": "org.jetbrains.kotlin:kotlin-reflect:1.9.0-Beta",
+ "dependencies": [
+ "org.jetbrains.kotlin:kotlin-stdlib-common:1.9.0-Beta",
+ "org.jetbrains:annotations:13.0",
+ "org.jetbrains.kotlin:kotlin-stdlib:1.9.0-Beta"
+ ],
+ "directDependencies": [
+ "org.jetbrains.kotlin:kotlin-stdlib:1.9.0-Beta"
+ ],
+ "file": "v1/https/repo1.maven.org/maven2/org/jetbrains/kotlin/kotlin-reflect/1.9.0-Beta/kotlin-reflect-1.9.0-Beta.jar",
+ "mirror_urls": [
+ "https://maven.google.com/org/jetbrains/kotlin/kotlin-reflect/1.9.0-Beta/kotlin-reflect-1.9.0-Beta.jar",
+ "https://repo1.maven.org/maven2/org/jetbrains/kotlin/kotlin-reflect/1.9.0-Beta/kotlin-reflect-1.9.0-Beta.jar"
+ ],
+ "sha256": "a2b16d1e93a0f635f41789b18ab3d32e6354d27925b3e1a419f9241515cbcdd6",
+ "url": "https://repo1.maven.org/maven2/org/jetbrains/kotlin/kotlin-reflect/1.9.0-Beta/kotlin-reflect-1.9.0-Beta.jar"
+ },
+ {
+ "coord": "org.jetbrains.kotlin:kotlin-stdlib-common:1.9.0-Beta",
+ "dependencies": [],
+ "directDependencies": [],
+ "file": "v1/https/repo1.maven.org/maven2/org/jetbrains/kotlin/kotlin-stdlib-common/1.9.0-Beta/kotlin-stdlib-common-1.9.0-Beta.jar",
+ "mirror_urls": [
+ "https://maven.google.com/org/jetbrains/kotlin/kotlin-stdlib-common/1.9.0-Beta/kotlin-stdlib-common-1.9.0-Beta.jar",
+ "https://repo1.maven.org/maven2/org/jetbrains/kotlin/kotlin-stdlib-common/1.9.0-Beta/kotlin-stdlib-common-1.9.0-Beta.jar"
+ ],
+ "sha256": "3d0d295899cfaa96f82fb6fb85efffa04507dcf0a0d145a496c4e220ea827b57",
+ "url": "https://repo1.maven.org/maven2/org/jetbrains/kotlin/kotlin-stdlib-common/1.9.0-Beta/kotlin-stdlib-common-1.9.0-Beta.jar"
+ },
+ {
+ "coord": "org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.9.0-Beta",
+ "dependencies": [
+ "org.jetbrains.kotlin:kotlin-stdlib-common:1.9.0-Beta",
+ "org.jetbrains:annotations:13.0",
+ "org.jetbrains.kotlin:kotlin-stdlib:1.9.0-Beta"
+ ],
+ "directDependencies": [
+ "org.jetbrains.kotlin:kotlin-stdlib:1.9.0-Beta"
+ ],
+ "file": "v1/https/repo1.maven.org/maven2/org/jetbrains/kotlin/kotlin-stdlib-jdk7/1.9.0-Beta/kotlin-stdlib-jdk7-1.9.0-Beta.jar",
+ "mirror_urls": [
+ "https://maven.google.com/org/jetbrains/kotlin/kotlin-stdlib-jdk7/1.9.0-Beta/kotlin-stdlib-jdk7-1.9.0-Beta.jar",
+ "https://repo1.maven.org/maven2/org/jetbrains/kotlin/kotlin-stdlib-jdk7/1.9.0-Beta/kotlin-stdlib-jdk7-1.9.0-Beta.jar"
+ ],
+ "sha256": "73b011d84e8c0703430f48e7c6488d240a9f4da800047d4c5c39cf7ad1ec36f2",
+ "url": "https://repo1.maven.org/maven2/org/jetbrains/kotlin/kotlin-stdlib-jdk7/1.9.0-Beta/kotlin-stdlib-jdk7-1.9.0-Beta.jar"
+ },
+ {
+ "coord": "org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.9.0-Beta",
+ "dependencies": [
+ "org.jetbrains.kotlin:kotlin-stdlib-common:1.9.0-Beta",
+ "org.jetbrains:annotations:13.0",
+ "org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.9.0-Beta",
+ "org.jetbrains.kotlin:kotlin-stdlib:1.9.0-Beta"
+ ],
+ "directDependencies": [
+ "org.jetbrains.kotlin:kotlin-stdlib:1.9.0-Beta",
+ "org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.9.0-Beta"
+ ],
+ "file": "v1/https/repo1.maven.org/maven2/org/jetbrains/kotlin/kotlin-stdlib-jdk8/1.9.0-Beta/kotlin-stdlib-jdk8-1.9.0-Beta.jar",
+ "mirror_urls": [
+ "https://maven.google.com/org/jetbrains/kotlin/kotlin-stdlib-jdk8/1.9.0-Beta/kotlin-stdlib-jdk8-1.9.0-Beta.jar",
+ "https://repo1.maven.org/maven2/org/jetbrains/kotlin/kotlin-stdlib-jdk8/1.9.0-Beta/kotlin-stdlib-jdk8-1.9.0-Beta.jar"
+ ],
+ "sha256": "4de2eacedb30a21ff9bf5094c39013ee7e8644685319c08ec86033834e576b43",
+ "url": "https://repo1.maven.org/maven2/org/jetbrains/kotlin/kotlin-stdlib-jdk8/1.9.0-Beta/kotlin-stdlib-jdk8-1.9.0-Beta.jar"
+ },
+ {
+ "coord": "org.jetbrains.kotlin:kotlin-stdlib:1.9.0-Beta",
+ "dependencies": [
+ "org.jetbrains.kotlin:kotlin-stdlib-common:1.9.0-Beta",
+ "org.jetbrains:annotations:13.0"
+ ],
+ "directDependencies": [
+ "org.jetbrains:annotations:13.0",
+ "org.jetbrains.kotlin:kotlin-stdlib-common:1.9.0-Beta"
+ ],
+ "file": "v1/https/repo1.maven.org/maven2/org/jetbrains/kotlin/kotlin-stdlib/1.9.0-Beta/kotlin-stdlib-1.9.0-Beta.jar",
+ "mirror_urls": [
+ "https://maven.google.com/org/jetbrains/kotlin/kotlin-stdlib/1.9.0-Beta/kotlin-stdlib-1.9.0-Beta.jar",
+ "https://repo1.maven.org/maven2/org/jetbrains/kotlin/kotlin-stdlib/1.9.0-Beta/kotlin-stdlib-1.9.0-Beta.jar"
+ ],
+ "sha256": "af458cc55cf69e966668e6010c7ccee4a50d553b3504a2e8311dd0c76242d881",
+ "url": "https://repo1.maven.org/maven2/org/jetbrains/kotlin/kotlin-stdlib/1.9.0-Beta/kotlin-stdlib-1.9.0-Beta.jar"
+ },
+ {
+ "coord": "org.jetbrains.kotlinx:kotlinx-metadata-jvm:0.6.2",
+ "dependencies": [
+ "org.jetbrains.kotlin:kotlin-stdlib:1.9.0-Beta"
+ ],
+ "directDependencies": [
+ "org.jetbrains.kotlin:kotlin-stdlib:1.9.0-Beta"
+ ],
+ "file": "v1/https/repo1.maven.org/maven2/org/jetbrains/kotlinx/kotlinx-metadata-jvm/0.6.2/kotlinx-metadata-jvm-0.6.2.jar",
+ "mirror_urls": [
+ "https://maven.google.com/org/jetbrains/kotlinx/kotlinx-metadata-jvm/0.6.2/kotlinx-metadata-jvm-0.6.2.jar",
+ "https://repo1.maven.org/maven2/org/jetbrains/kotlinx/kotlinx-metadata-jvm/0.6.2/kotlinx-metadata-jvm-0.6.2.jar"
+ ],
+ "sha256": "8f5759b435fcbcfdf06c80295013ba953db4ec817b04d7809c61a739a483527b",
+ "url": "https://repo1.maven.org/maven2/org/jetbrains/kotlinx/kotlinx-metadata-jvm/0.6.2/kotlinx-metadata-jvm-0.6.2.jar"
+ },
+ {
+ "coord": "org.jetbrains:annotations:13.0",
+ "dependencies": [],
+ "directDependencies": [],
+ "file": "v1/https/repo1.maven.org/maven2/org/jetbrains/annotations/13.0/annotations-13.0.jar",
+ "mirror_urls": [
+ "https://maven.google.com/org/jetbrains/annotations/13.0/annotations-13.0.jar",
+ "https://repo1.maven.org/maven2/org/jetbrains/annotations/13.0/annotations-13.0.jar"
+ ],
+ "sha256": "ace2a10dc8e2d5fd34925ecac03e4988b2c0f851650c94b8cef49ba1bd111478",
+ "url": "https://repo1.maven.org/maven2/org/jetbrains/annotations/13.0/annotations-13.0.jar"
+ },
+ {
+ "coord": "org.jvnet.staxex:stax-ex:1.8.1",
+ "dependencies": [
+ "jakarta.activation:jakarta.activation-api:1.2.1",
+ "jakarta.xml.bind:jakarta.xml.bind-api:2.3.2"
+ ],
+ "directDependencies": [
+ "jakarta.activation:jakarta.activation-api:1.2.1",
+ "jakarta.xml.bind:jakarta.xml.bind-api:2.3.2"
+ ],
+ "file": "v1/https/repo1.maven.org/maven2/org/jvnet/staxex/stax-ex/1.8.1/stax-ex-1.8.1.jar",
+ "mirror_urls": [
+ "https://maven.google.com/org/jvnet/staxex/stax-ex/1.8.1/stax-ex-1.8.1.jar",
+ "https://repo1.maven.org/maven2/org/jvnet/staxex/stax-ex/1.8.1/stax-ex-1.8.1.jar"
+ ],
+ "sha256": "20522549056e9e50aa35ef0b445a2e47a53d06be0b0a9467d704e2483ffb049a",
+ "url": "https://repo1.maven.org/maven2/org/jvnet/staxex/stax-ex/1.8.1/stax-ex-1.8.1.jar"
+ },
+ {
+ "coord": "org.ow2.asm:asm-analysis:9.5",
+ "dependencies": [
+ "org.ow2.asm:asm:9.5",
+ "org.ow2.asm:asm-tree:9.5"
+ ],
+ "directDependencies": [
+ "org.ow2.asm:asm-tree:9.5"
+ ],
+ "file": "v1/https/repo1.maven.org/maven2/org/ow2/asm/asm-analysis/9.5/asm-analysis-9.5.jar",
+ "mirror_urls": [
+ "https://maven.google.com/org/ow2/asm/asm-analysis/9.5/asm-analysis-9.5.jar",
+ "https://repo1.maven.org/maven2/org/ow2/asm/asm-analysis/9.5/asm-analysis-9.5.jar"
+ ],
+ "sha256": "39f1cf1791335701c3b02cae7b2bc21057ec9a55b2240789cb6d552b2b2c62fa",
+ "url": "https://repo1.maven.org/maven2/org/ow2/asm/asm-analysis/9.5/asm-analysis-9.5.jar"
+ },
+ {
+ "coord": "org.ow2.asm:asm-commons:9.5",
+ "dependencies": [
+ "org.ow2.asm:asm:9.5",
+ "org.ow2.asm:asm-tree:9.5"
+ ],
+ "directDependencies": [
+ "org.ow2.asm:asm:9.5",
+ "org.ow2.asm:asm-tree:9.5"
+ ],
+ "file": "v1/https/repo1.maven.org/maven2/org/ow2/asm/asm-commons/9.5/asm-commons-9.5.jar",
+ "mirror_urls": [
+ "https://maven.google.com/org/ow2/asm/asm-commons/9.5/asm-commons-9.5.jar",
+ "https://repo1.maven.org/maven2/org/ow2/asm/asm-commons/9.5/asm-commons-9.5.jar"
+ ],
+ "sha256": "72eee9fbafb9de8d9463f20dd584a48ceeb7e5152ad4c987bfbe17dd4811c9ae",
+ "url": "https://repo1.maven.org/maven2/org/ow2/asm/asm-commons/9.5/asm-commons-9.5.jar"
+ },
+ {
+ "coord": "org.ow2.asm:asm-tree:9.5",
+ "dependencies": [
+ "org.ow2.asm:asm:9.5"
+ ],
+ "directDependencies": [
+ "org.ow2.asm:asm:9.5"
+ ],
+ "file": "v1/https/repo1.maven.org/maven2/org/ow2/asm/asm-tree/9.5/asm-tree-9.5.jar",
+ "mirror_urls": [
+ "https://maven.google.com/org/ow2/asm/asm-tree/9.5/asm-tree-9.5.jar",
+ "https://repo1.maven.org/maven2/org/ow2/asm/asm-tree/9.5/asm-tree-9.5.jar"
+ ],
+ "sha256": "3c33a648191079aeaeaeb7c19a49b153952f9e40fe86fbac5205554ddd9acd94",
+ "url": "https://repo1.maven.org/maven2/org/ow2/asm/asm-tree/9.5/asm-tree-9.5.jar"
+ },
+ {
+ "coord": "org.ow2.asm:asm-util:9.5",
+ "dependencies": [
+ "org.ow2.asm:asm:9.5",
+ "org.ow2.asm:asm-tree:9.5",
+ "org.ow2.asm:asm-analysis:9.5"
+ ],
+ "directDependencies": [
+ "org.ow2.asm:asm:9.5",
+ "org.ow2.asm:asm-analysis:9.5",
+ "org.ow2.asm:asm-tree:9.5"
+ ],
+ "file": "v1/https/repo1.maven.org/maven2/org/ow2/asm/asm-util/9.5/asm-util-9.5.jar",
+ "mirror_urls": [
+ "https://maven.google.com/org/ow2/asm/asm-util/9.5/asm-util-9.5.jar",
+ "https://repo1.maven.org/maven2/org/ow2/asm/asm-util/9.5/asm-util-9.5.jar"
+ ],
+ "sha256": "c467f1bb3c08888f47243e2d475209b34a772d627e44fca06752e18bb038bd74",
+ "url": "https://repo1.maven.org/maven2/org/ow2/asm/asm-util/9.5/asm-util-9.5.jar"
+ },
+ {
+ "coord": "org.ow2.asm:asm:9.5",
+ "dependencies": [],
+ "directDependencies": [],
+ "file": "v1/https/repo1.maven.org/maven2/org/ow2/asm/asm/9.5/asm-9.5.jar",
+ "mirror_urls": [
+ "https://maven.google.com/org/ow2/asm/asm/9.5/asm-9.5.jar",
+ "https://repo1.maven.org/maven2/org/ow2/asm/asm/9.5/asm-9.5.jar"
+ ],
+ "sha256": "b62e84b5980729751b0458c534cf1366f727542bb8d158621335682a460f0353",
+ "url": "https://repo1.maven.org/maven2/org/ow2/asm/asm/9.5/asm-9.5.jar"
+ },
+ {
+ "coord": "org.robolectric:annotations:4.10.3",
+ "dependencies": [],
+ "directDependencies": [],
+ "file": "v1/https/repo1.maven.org/maven2/org/robolectric/annotations/4.10.3/annotations-4.10.3.jar",
+ "mirror_urls": [
+ "https://maven.google.com/org/robolectric/annotations/4.10.3/annotations-4.10.3.jar",
+ "https://repo1.maven.org/maven2/org/robolectric/annotations/4.10.3/annotations-4.10.3.jar"
+ ],
+ "sha256": "f3d6b921b7bf9d541577414c3b3124293eb09ced71f939e0c325c8d8abad0b6f",
+ "url": "https://repo1.maven.org/maven2/org/robolectric/annotations/4.10.3/annotations-4.10.3.jar"
+ },
+ {
+ "coord": "org.robolectric:junit:4.10.3",
+ "dependencies": [
+ "com.google.errorprone:error_prone_annotations:2.19.1",
+ "com.google.guava:guava:32.1.2-jre",
+ "org.robolectric:pluginapi:4.10.3",
+ "org.ow2.asm:asm-util:9.5",
+ "org.ow2.asm:asm-commons:9.5",
+ "org.robolectric:utils:4.10.3",
+ "org.ow2.asm:asm:9.5",
+ "org.robolectric:annotations:4.10.3",
+ "org.robolectric:utils-reflector:4.10.3",
+ "org.robolectric:shadowapi:4.10.3",
+ "org.ow2.asm:asm-tree:9.5",
+ "org.robolectric:sandbox:4.10.3",
+ "javax.annotation:javax.annotation-api:1.3.2",
+ "javax.inject:javax.inject:1",
+ "org.ow2.asm:asm-analysis:9.5"
+ ],
+ "directDependencies": [
+ "org.robolectric:pluginapi:4.10.3",
+ "org.robolectric:annotations:4.10.3",
+ "org.robolectric:utils-reflector:4.10.3",
+ "org.robolectric:shadowapi:4.10.3",
+ "org.robolectric:sandbox:4.10.3"
+ ],
+ "file": "v1/https/repo1.maven.org/maven2/org/robolectric/junit/4.10.3/junit-4.10.3.jar",
+ "mirror_urls": [
+ "https://maven.google.com/org/robolectric/junit/4.10.3/junit-4.10.3.jar",
+ "https://repo1.maven.org/maven2/org/robolectric/junit/4.10.3/junit-4.10.3.jar"
+ ],
+ "sha256": "815f0bae88eb198889e1878ef65b904c4ec59131be2458829bcc942bd7b9f6da",
+ "url": "https://repo1.maven.org/maven2/org/robolectric/junit/4.10.3/junit-4.10.3.jar"
+ },
+ {
+ "coord": "org.robolectric:nativeruntime-dist-compat:1.0.1",
+ "dependencies": [],
+ "directDependencies": [],
+ "file": "v1/https/repo1.maven.org/maven2/org/robolectric/nativeruntime-dist-compat/1.0.1/nativeruntime-dist-compat-1.0.1.jar",
+ "mirror_urls": [
+ "https://maven.google.com/org/robolectric/nativeruntime-dist-compat/1.0.1/nativeruntime-dist-compat-1.0.1.jar",
+ "https://repo1.maven.org/maven2/org/robolectric/nativeruntime-dist-compat/1.0.1/nativeruntime-dist-compat-1.0.1.jar"
+ ],
+ "sha256": "2dd7aae2332b8f57932e1ef78fb8d973aac1da631ec9fb471752280df50d140c",
+ "url": "https://repo1.maven.org/maven2/org/robolectric/nativeruntime-dist-compat/1.0.1/nativeruntime-dist-compat-1.0.1.jar"
+ },
+ {
+ "coord": "org.robolectric:nativeruntime:4.10.3",
+ "dependencies": [
+ "com.google.errorprone:error_prone_annotations:2.19.1",
+ "com.google.guava:guava:32.1.2-jre",
+ "org.robolectric:pluginapi:4.10.3",
+ "org.ow2.asm:asm-util:9.5",
+ "org.ow2.asm:asm-commons:9.5",
+ "org.robolectric:utils:4.10.3",
+ "org.robolectric:nativeruntime-dist-compat:1.0.1",
+ "org.ow2.asm:asm:9.5",
+ "org.robolectric:annotations:4.10.3",
+ "org.robolectric:utils-reflector:4.10.3",
+ "org.ow2.asm:asm-tree:9.5",
+ "javax.annotation:javax.annotation-api:1.3.2",
+ "javax.inject:javax.inject:1",
+ "org.ow2.asm:asm-analysis:9.5"
+ ],
+ "directDependencies": [
+ "com.google.guava:guava:32.1.2-jre",
+ "org.robolectric:nativeruntime-dist-compat:1.0.1",
+ "org.robolectric:utils:4.10.3",
+ "org.robolectric:utils-reflector:4.10.3"
+ ],
+ "file": "v1/https/repo1.maven.org/maven2/org/robolectric/nativeruntime/4.10.3/nativeruntime-4.10.3.jar",
+ "mirror_urls": [
+ "https://maven.google.com/org/robolectric/nativeruntime/4.10.3/nativeruntime-4.10.3.jar",
+ "https://repo1.maven.org/maven2/org/robolectric/nativeruntime/4.10.3/nativeruntime-4.10.3.jar"
+ ],
+ "sha256": "71fd2d1e8e78f2d70cc4879f5aa6910bf05a68274d3ca87179fb6f9447db5fb9",
+ "url": "https://repo1.maven.org/maven2/org/robolectric/nativeruntime/4.10.3/nativeruntime-4.10.3.jar"
+ },
+ {
+ "coord": "org.robolectric:pluginapi:4.10.3",
+ "dependencies": [
+ "com.google.guava:guava:32.1.2-jre",
+ "org.robolectric:annotations:4.10.3"
+ ],
+ "directDependencies": [
+ "com.google.guava:guava:32.1.2-jre",
+ "org.robolectric:annotations:4.10.3"
+ ],
+ "file": "v1/https/repo1.maven.org/maven2/org/robolectric/pluginapi/4.10.3/pluginapi-4.10.3.jar",
+ "mirror_urls": [
+ "https://maven.google.com/org/robolectric/pluginapi/4.10.3/pluginapi-4.10.3.jar",
+ "https://repo1.maven.org/maven2/org/robolectric/pluginapi/4.10.3/pluginapi-4.10.3.jar"
+ ],
+ "sha256": "56be2717854add52e3437bb3be1b898dfea8ce8c6fcd26c4d0de68bf605274b0",
+ "url": "https://repo1.maven.org/maven2/org/robolectric/pluginapi/4.10.3/pluginapi-4.10.3.jar"
+ },
+ {
+ "coord": "org.robolectric:plugins-maven-dependency-resolver:4.10.3",
+ "dependencies": [
+ "com.google.errorprone:error_prone_annotations:2.19.1",
+ "com.google.guava:guava:32.1.2-jre",
+ "org.robolectric:pluginapi:4.10.3",
+ "org.robolectric:utils:4.10.3",
+ "org.robolectric:annotations:4.10.3",
+ "javax.annotation:javax.annotation-api:1.3.2",
+ "com.google.auto.value:auto-value-annotations:1.10.1",
+ "javax.inject:javax.inject:1"
+ ],
+ "directDependencies": [
+ "com.google.auto.value:auto-value-annotations:1.10.1",
+ "com.google.guava:guava:32.1.2-jre",
+ "org.robolectric:pluginapi:4.10.3",
+ "org.robolectric:utils:4.10.3"
+ ],
+ "file": "v1/https/repo1.maven.org/maven2/org/robolectric/plugins-maven-dependency-resolver/4.10.3/plugins-maven-dependency-resolver-4.10.3.jar",
+ "mirror_urls": [
+ "https://maven.google.com/org/robolectric/plugins-maven-dependency-resolver/4.10.3/plugins-maven-dependency-resolver-4.10.3.jar",
+ "https://repo1.maven.org/maven2/org/robolectric/plugins-maven-dependency-resolver/4.10.3/plugins-maven-dependency-resolver-4.10.3.jar"
+ ],
+ "sha256": "54618c67214824dd5ebd72c5ed9c56fb62b776902455d0b0efc0e0940d8ebcf6",
+ "url": "https://repo1.maven.org/maven2/org/robolectric/plugins-maven-dependency-resolver/4.10.3/plugins-maven-dependency-resolver-4.10.3.jar"
+ },
+ {
+ "coord": "org.robolectric:resources:4.10.3",
+ "dependencies": [
+ "com.google.errorprone:error_prone_annotations:2.19.1",
+ "com.google.guava:guava:32.1.2-jre",
+ "org.robolectric:pluginapi:4.10.3",
+ "org.robolectric:utils:4.10.3",
+ "org.robolectric:annotations:4.10.3",
+ "javax.annotation:javax.annotation-api:1.3.2",
+ "javax.inject:javax.inject:1"
+ ],
+ "directDependencies": [
+ "com.google.guava:guava:32.1.2-jre",
+ "org.robolectric:annotations:4.10.3",
+ "org.robolectric:pluginapi:4.10.3",
+ "org.robolectric:utils:4.10.3"
+ ],
+ "file": "v1/https/repo1.maven.org/maven2/org/robolectric/resources/4.10.3/resources-4.10.3.jar",
+ "mirror_urls": [
+ "https://maven.google.com/org/robolectric/resources/4.10.3/resources-4.10.3.jar",
+ "https://repo1.maven.org/maven2/org/robolectric/resources/4.10.3/resources-4.10.3.jar"
+ ],
+ "sha256": "8decd0518e147c1038d38f6d33632e3310886194d7a8afeeb62849495f36e5f7",
+ "url": "https://repo1.maven.org/maven2/org/robolectric/resources/4.10.3/resources-4.10.3.jar"
+ },
+ {
+ "coord": "org.robolectric:robolectric:4.10.3",
+ "dependencies": [
+ "com.google.errorprone:error_prone_annotations:2.19.1",
+ "org.robolectric:nativeruntime:4.10.3",
+ "org.bouncycastle:bcprov-jdk18on:1.72",
+ "androidx.test.espresso:espresso-idling-resource:aar:3.5.1",
+ "com.google.guava:guava:32.1.2-jre",
+ "org.robolectric:junit:4.10.3",
+ "org.robolectric:pluginapi:4.10.3",
+ "org.robolectric:shadows-framework:4.10.3",
+ "org.conscrypt:conscrypt-openjdk-uber:2.5.2",
+ "org.ow2.asm:asm-util:9.5",
+ "org.ow2.asm:asm-commons:9.5",
+ "org.robolectric:utils:4.10.3",
+ "com.ibm.icu:icu4j:72.1",
+ "com.almworks.sqlite4java:sqlite4java:1.0.392",
+ "org.robolectric:plugins-maven-dependency-resolver:4.10.3",
+ "org.robolectric:nativeruntime-dist-compat:1.0.1",
+ "org.ow2.asm:asm:9.5",
+ "org.robolectric:annotations:4.10.3",
+ "org.robolectric:utils-reflector:4.10.3",
+ "androidx.annotation:annotation:1.3.0",
+ "org.robolectric:shadowapi:4.10.3",
+ "org.ow2.asm:asm-tree:9.5",
+ "org.robolectric:resources:4.10.3",
+ "org.robolectric:sandbox:4.10.3",
+ "javax.annotation:javax.annotation-api:1.3.2",
+ "com.google.auto.value:auto-value-annotations:1.10.1",
+ "javax.inject:javax.inject:1",
+ "androidx.test:monitor:aar:1.7.0-alpha01",
+ "org.ow2.asm:asm-analysis:9.5"
+ ],
+ "directDependencies": [
+ "org.bouncycastle:bcprov-jdk18on:1.72",
+ "androidx.test.espresso:espresso-idling-resource:aar:3.5.1",
+ "org.robolectric:junit:4.10.3",
+ "org.robolectric:pluginapi:4.10.3",
+ "org.robolectric:shadows-framework:4.10.3",
+ "org.conscrypt:conscrypt-openjdk-uber:2.5.2",
+ "org.robolectric:utils:4.10.3",
+ "org.robolectric:plugins-maven-dependency-resolver:4.10.3",
+ "org.robolectric:annotations:4.10.3",
+ "org.robolectric:utils-reflector:4.10.3",
+ "org.robolectric:resources:4.10.3",
+ "org.robolectric:sandbox:4.10.3",
+ "javax.annotation:javax.annotation-api:1.3.2",
+ "javax.inject:javax.inject:1",
+ "androidx.test:monitor:aar:1.7.0-alpha01"
+ ],
+ "file": "v1/https/repo1.maven.org/maven2/org/robolectric/robolectric/4.10.3/robolectric-4.10.3.jar",
+ "mirror_urls": [
+ "https://maven.google.com/org/robolectric/robolectric/4.10.3/robolectric-4.10.3.jar",
+ "https://repo1.maven.org/maven2/org/robolectric/robolectric/4.10.3/robolectric-4.10.3.jar"
+ ],
+ "sha256": "e61c4733bd64f57ba9884bf232b293fdd19b233608dd3481cd0e3c99f0f7c0fc",
+ "url": "https://repo1.maven.org/maven2/org/robolectric/robolectric/4.10.3/robolectric-4.10.3.jar"
+ },
+ {
+ "coord": "org.robolectric:sandbox:4.10.3",
+ "dependencies": [
+ "com.google.errorprone:error_prone_annotations:2.19.1",
+ "com.google.guava:guava:32.1.2-jre",
+ "org.robolectric:pluginapi:4.10.3",
+ "org.ow2.asm:asm-util:9.5",
+ "org.ow2.asm:asm-commons:9.5",
+ "org.robolectric:utils:4.10.3",
+ "org.ow2.asm:asm:9.5",
+ "org.robolectric:annotations:4.10.3",
+ "org.robolectric:utils-reflector:4.10.3",
+ "org.robolectric:shadowapi:4.10.3",
+ "org.ow2.asm:asm-tree:9.5",
+ "javax.annotation:javax.annotation-api:1.3.2",
+ "javax.inject:javax.inject:1",
+ "org.ow2.asm:asm-analysis:9.5"
+ ],
+ "directDependencies": [
+ "com.google.guava:guava:32.1.2-jre",
+ "org.ow2.asm:asm-commons:9.5",
+ "org.robolectric:utils:4.10.3",
+ "org.ow2.asm:asm:9.5",
+ "org.robolectric:annotations:4.10.3",
+ "org.robolectric:utils-reflector:4.10.3",
+ "org.robolectric:shadowapi:4.10.3",
+ "javax.annotation:javax.annotation-api:1.3.2",
+ "javax.inject:javax.inject:1"
+ ],
+ "file": "v1/https/repo1.maven.org/maven2/org/robolectric/sandbox/4.10.3/sandbox-4.10.3.jar",
+ "mirror_urls": [
+ "https://maven.google.com/org/robolectric/sandbox/4.10.3/sandbox-4.10.3.jar",
+ "https://repo1.maven.org/maven2/org/robolectric/sandbox/4.10.3/sandbox-4.10.3.jar"
+ ],
+ "sha256": "59611ce3f110f21d464003a7a812dc8155f4132173cb13cf4e246da496cf17d0",
+ "url": "https://repo1.maven.org/maven2/org/robolectric/sandbox/4.10.3/sandbox-4.10.3.jar"
+ },
+ {
+ "coord": "org.robolectric:shadowapi:4.10.3",
+ "dependencies": [
+ "com.google.errorprone:error_prone_annotations:2.19.1",
+ "com.google.guava:guava:32.1.2-jre",
+ "org.robolectric:pluginapi:4.10.3",
+ "org.robolectric:utils:4.10.3",
+ "org.robolectric:annotations:4.10.3",
+ "javax.annotation:javax.annotation-api:1.3.2",
+ "javax.inject:javax.inject:1"
+ ],
+ "directDependencies": [
+ "org.robolectric:annotations:4.10.3",
+ "org.robolectric:utils:4.10.3"
+ ],
+ "file": "v1/https/repo1.maven.org/maven2/org/robolectric/shadowapi/4.10.3/shadowapi-4.10.3.jar",
+ "mirror_urls": [
+ "https://maven.google.com/org/robolectric/shadowapi/4.10.3/shadowapi-4.10.3.jar",
+ "https://repo1.maven.org/maven2/org/robolectric/shadowapi/4.10.3/shadowapi-4.10.3.jar"
+ ],
+ "sha256": "1ba648a76968f1bb9f4fc64321af70c4eeed94b2a3fa1b2a848a7706ec25c75a",
+ "url": "https://repo1.maven.org/maven2/org/robolectric/shadowapi/4.10.3/shadowapi-4.10.3.jar"
+ },
+ {
+ "coord": "org.robolectric:shadows-framework:4.10.3",
+ "dependencies": [
+ "com.google.errorprone:error_prone_annotations:2.19.1",
+ "org.robolectric:nativeruntime:4.10.3",
+ "com.google.guava:guava:32.1.2-jre",
+ "org.robolectric:pluginapi:4.10.3",
+ "org.ow2.asm:asm-util:9.5",
+ "org.ow2.asm:asm-commons:9.5",
+ "org.robolectric:utils:4.10.3",
+ "com.ibm.icu:icu4j:72.1",
+ "com.almworks.sqlite4java:sqlite4java:1.0.392",
+ "org.robolectric:nativeruntime-dist-compat:1.0.1",
+ "org.ow2.asm:asm:9.5",
+ "org.robolectric:annotations:4.10.3",
+ "org.robolectric:utils-reflector:4.10.3",
+ "androidx.annotation:annotation:1.3.0",
+ "org.robolectric:shadowapi:4.10.3",
+ "org.ow2.asm:asm-tree:9.5",
+ "org.robolectric:resources:4.10.3",
+ "org.robolectric:sandbox:4.10.3",
+ "javax.annotation:javax.annotation-api:1.3.2",
+ "com.google.auto.value:auto-value-annotations:1.10.1",
+ "javax.inject:javax.inject:1",
+ "androidx.test:monitor:aar:1.7.0-alpha01",
+ "org.ow2.asm:asm-analysis:9.5"
+ ],
+ "directDependencies": [
+ "com.google.errorprone:error_prone_annotations:2.19.1",
+ "org.robolectric:nativeruntime:4.10.3",
+ "org.robolectric:pluginapi:4.10.3",
+ "org.robolectric:utils:4.10.3",
+ "com.ibm.icu:icu4j:72.1",
+ "com.almworks.sqlite4java:sqlite4java:1.0.392",
+ "org.robolectric:annotations:4.10.3",
+ "org.robolectric:utils-reflector:4.10.3",
+ "androidx.annotation:annotation:1.3.0",
+ "org.robolectric:shadowapi:4.10.3",
+ "org.robolectric:resources:4.10.3",
+ "org.robolectric:sandbox:4.10.3",
+ "com.google.auto.value:auto-value-annotations:1.10.1",
+ "androidx.test:monitor:aar:1.7.0-alpha01"
+ ],
+ "file": "v1/https/repo1.maven.org/maven2/org/robolectric/shadows-framework/4.10.3/shadows-framework-4.10.3.jar",
+ "mirror_urls": [
+ "https://maven.google.com/org/robolectric/shadows-framework/4.10.3/shadows-framework-4.10.3.jar",
+ "https://repo1.maven.org/maven2/org/robolectric/shadows-framework/4.10.3/shadows-framework-4.10.3.jar"
+ ],
+ "sha256": "106f6a19abc9d5786a18461a2554afbf782a30e799f867d7f1a9f26bcbb873a7",
+ "url": "https://repo1.maven.org/maven2/org/robolectric/shadows-framework/4.10.3/shadows-framework-4.10.3.jar"
+ },
+ {
+ "coord": "org.robolectric:utils-reflector:4.10.3",
+ "dependencies": [
+ "com.google.errorprone:error_prone_annotations:2.19.1",
+ "com.google.guava:guava:32.1.2-jre",
+ "org.robolectric:pluginapi:4.10.3",
+ "org.ow2.asm:asm-util:9.5",
+ "org.ow2.asm:asm-commons:9.5",
+ "org.robolectric:utils:4.10.3",
+ "org.ow2.asm:asm:9.5",
+ "org.robolectric:annotations:4.10.3",
+ "org.ow2.asm:asm-tree:9.5",
+ "javax.annotation:javax.annotation-api:1.3.2",
+ "javax.inject:javax.inject:1",
+ "org.ow2.asm:asm-analysis:9.5"
+ ],
+ "directDependencies": [
+ "org.ow2.asm:asm:9.5",
+ "org.ow2.asm:asm-commons:9.5",
+ "org.ow2.asm:asm-util:9.5",
+ "org.robolectric:utils:4.10.3"
+ ],
+ "file": "v1/https/repo1.maven.org/maven2/org/robolectric/utils-reflector/4.10.3/utils-reflector-4.10.3.jar",
+ "mirror_urls": [
+ "https://maven.google.com/org/robolectric/utils-reflector/4.10.3/utils-reflector-4.10.3.jar",
+ "https://repo1.maven.org/maven2/org/robolectric/utils-reflector/4.10.3/utils-reflector-4.10.3.jar"
+ ],
+ "sha256": "fcd2dde7623a5b47caa7efcbdf7dd2a95429e640b42490db5bc645367f0a0e1a",
+ "url": "https://repo1.maven.org/maven2/org/robolectric/utils-reflector/4.10.3/utils-reflector-4.10.3.jar"
+ },
+ {
+ "coord": "org.robolectric:utils:4.10.3",
+ "dependencies": [
+ "com.google.errorprone:error_prone_annotations:2.19.1",
+ "com.google.guava:guava:32.1.2-jre",
+ "org.robolectric:pluginapi:4.10.3",
+ "org.robolectric:annotations:4.10.3",
+ "javax.annotation:javax.annotation-api:1.3.2",
+ "javax.inject:javax.inject:1"
+ ],
+ "directDependencies": [
+ "com.google.errorprone:error_prone_annotations:2.19.1",
+ "com.google.guava:guava:32.1.2-jre",
+ "org.robolectric:pluginapi:4.10.3",
+ "org.robolectric:annotations:4.10.3",
+ "javax.annotation:javax.annotation-api:1.3.2",
+ "javax.inject:javax.inject:1"
+ ],
+ "file": "v1/https/repo1.maven.org/maven2/org/robolectric/utils/4.10.3/utils-4.10.3.jar",
+ "mirror_urls": [
+ "https://maven.google.com/org/robolectric/utils/4.10.3/utils-4.10.3.jar",
+ "https://repo1.maven.org/maven2/org/robolectric/utils/4.10.3/utils-4.10.3.jar"
+ ],
+ "sha256": "0081b1a65c2c6d7cf56a56f6b4ed85b35a91f5a9f40a4b81c6771b497265518e",
+ "url": "https://repo1.maven.org/maven2/org/robolectric/utils/4.10.3/utils-4.10.3.jar"
+ },
+ {
+ "coord": "org.slf4j:slf4j-api:1.7.30",
+ "dependencies": [],
+ "directDependencies": [],
+ "file": "v1/https/repo1.maven.org/maven2/org/slf4j/slf4j-api/1.7.30/slf4j-api-1.7.30.jar",
+ "mirror_urls": [
+ "https://maven.google.com/org/slf4j/slf4j-api/1.7.30/slf4j-api-1.7.30.jar",
+ "https://repo1.maven.org/maven2/org/slf4j/slf4j-api/1.7.30/slf4j-api-1.7.30.jar"
+ ],
+ "sha256": "cdba07964d1bb40a0761485c6b1e8c2f8fd9eb1d19c53928ac0d7f9510105c57",
+ "url": "https://repo1.maven.org/maven2/org/slf4j/slf4j-api/1.7.30/slf4j-api-1.7.30.jar"
+ },
+ {
+ "coord": "org.tensorflow:tensorflow-lite-metadata:0.1.0-rc2",
+ "dependencies": [
+ "org.checkerframework:checker-qual:3.35.0",
+ "com.google.flatbuffers:flatbuffers-java:1.12.0"
+ ],
+ "directDependencies": [
+ "com.google.flatbuffers:flatbuffers-java:1.12.0",
+ "org.checkerframework:checker-qual:3.35.0"
+ ],
+ "file": "v1/https/repo1.maven.org/maven2/org/tensorflow/tensorflow-lite-metadata/0.1.0-rc2/tensorflow-lite-metadata-0.1.0-rc2.jar",
+ "mirror_urls": [
+ "https://maven.google.com/org/tensorflow/tensorflow-lite-metadata/0.1.0-rc2/tensorflow-lite-metadata-0.1.0-rc2.jar",
+ "https://repo1.maven.org/maven2/org/tensorflow/tensorflow-lite-metadata/0.1.0-rc2/tensorflow-lite-metadata-0.1.0-rc2.jar"
+ ],
+ "sha256": "2c2a264f842498c36d34d2a7b91342490d9a962862c85baac1acd54ec2fca6d9",
+ "url": "https://repo1.maven.org/maven2/org/tensorflow/tensorflow-lite-metadata/0.1.0-rc2/tensorflow-lite-metadata-0.1.0-rc2.jar"
+ },
+ {
+ "coord": "xerces:xercesImpl:2.12.0",
+ "dependencies": [
+ "xml-apis:xml-apis:1.4.01"
+ ],
+ "directDependencies": [
+ "xml-apis:xml-apis:1.4.01"
+ ],
+ "file": "v1/https/repo1.maven.org/maven2/xerces/xercesImpl/2.12.0/xercesImpl-2.12.0.jar",
+ "mirror_urls": [
+ "https://maven.google.com/xerces/xercesImpl/2.12.0/xercesImpl-2.12.0.jar",
+ "https://repo1.maven.org/maven2/xerces/xercesImpl/2.12.0/xercesImpl-2.12.0.jar"
+ ],
+ "sha256": "b50d3a4ca502faa4d1c838acb8aa9480446953421f7327e338c5dda3da5e76d0",
+ "url": "https://repo1.maven.org/maven2/xerces/xercesImpl/2.12.0/xercesImpl-2.12.0.jar"
+ },
+ {
+ "coord": "xml-apis:xml-apis:1.4.01",
+ "dependencies": [],
+ "directDependencies": [],
+ "file": "v1/https/repo1.maven.org/maven2/xml-apis/xml-apis/1.4.01/xml-apis-1.4.01.jar",
+ "mirror_urls": [
+ "https://maven.google.com/xml-apis/xml-apis/1.4.01/xml-apis-1.4.01.jar",
+ "https://repo1.maven.org/maven2/xml-apis/xml-apis/1.4.01/xml-apis-1.4.01.jar"
+ ],
+ "sha256": "a840968176645684bb01aed376e067ab39614885f9eee44abe35a5f20ebe7fad",
+ "url": "https://repo1.maven.org/maven2/xml-apis/xml-apis/1.4.01/xml-apis-1.4.01.jar"
+ }
+ ],
+ "version": "0.1.0"
+ }
+}
diff --git a/src/tools/ak/rjar/rjar_test.go b/src/tools/ak/rjar/rjar_test.go
index 8c29650..7bce7b5 100644
--- a/src/tools/ak/rjar/rjar_test.go
+++ b/src/tools/ak/rjar/rjar_test.go
@@ -29,7 +29,7 @@ var (
const (
java = "local_jdk/bin/java"
- testDataBase = "build_bazel_rules_android/src/tools/ak/rjar/testdata"
+ testDataBase = "rules_android/src/tools/ak/rjar/testdata"
)
func TestCreateRJar(t *testing.T) {
diff --git a/src/tools/java/com/google/devtools/build/android/sandboxedsdktoolbox/BUILD b/src/tools/java/com/google/devtools/build/android/sandboxedsdktoolbox/BUILD
index 17ec508..d9a43c3 100644
--- a/src/tools/java/com/google/devtools/build/android/sandboxedsdktoolbox/BUILD
+++ b/src/tools/java/com/google/devtools/build/android/sandboxedsdktoolbox/BUILD
@@ -14,6 +14,7 @@ java_library(
srcs = glob(["*.java"]),
deps = [
"//src/tools/java/com/google/devtools/build/android/sandboxedsdktoolbox/apidescriptors",
+ "//src/tools/java/com/google/devtools/build/android/sandboxedsdktoolbox/clientsources",
"//src/tools/java/com/google/devtools/build/android/sandboxedsdktoolbox/sdkdependenciesmanifest",
"@rules_android_maven//:info_picocli_picocli",
],
diff --git a/src/tools/java/com/google/devtools/build/android/sandboxedsdktoolbox/SandboxedSdkToolbox.java b/src/tools/java/com/google/devtools/build/android/sandboxedsdktoolbox/SandboxedSdkToolbox.java
index b555a61..ee9607e 100644
--- a/src/tools/java/com/google/devtools/build/android/sandboxedsdktoolbox/SandboxedSdkToolbox.java
+++ b/src/tools/java/com/google/devtools/build/android/sandboxedsdktoolbox/SandboxedSdkToolbox.java
@@ -16,6 +16,8 @@
package com.google.devtools.build.android.sandboxedsdktoolbox;
import com.google.devtools.build.android.sandboxedsdktoolbox.apidescriptors.ExtractApiDescriptorsCommand;
+import com.google.devtools.build.android.sandboxedsdktoolbox.apidescriptors.ExtractApiDescriptorsFromAsarCommand;
+import com.google.devtools.build.android.sandboxedsdktoolbox.clientsources.GenerateClientSourcesCommand;
import com.google.devtools.build.android.sandboxedsdktoolbox.sdkdependenciesmanifest.GenerateSdkDependenciesManifestCommand;
import picocli.CommandLine;
import picocli.CommandLine.Command;
@@ -25,7 +27,9 @@ import picocli.CommandLine.Command;
name = "sandboxed-sdk-toolbox",
subcommands = {
ExtractApiDescriptorsCommand.class,
+ ExtractApiDescriptorsFromAsarCommand.class,
GenerateSdkDependenciesManifestCommand.class,
+ GenerateClientSourcesCommand.class,
})
public final class SandboxedSdkToolbox {
diff --git a/src/tools/java/com/google/devtools/build/android/sandboxedsdktoolbox/apidescriptors/ExtractApiDescriptorsFromAsarCommand.java b/src/tools/java/com/google/devtools/build/android/sandboxedsdktoolbox/apidescriptors/ExtractApiDescriptorsFromAsarCommand.java
new file mode 100644
index 0000000..62b09c7
--- /dev/null
+++ b/src/tools/java/com/google/devtools/build/android/sandboxedsdktoolbox/apidescriptors/ExtractApiDescriptorsFromAsarCommand.java
@@ -0,0 +1,59 @@
+/*
+ * Copyright 2023 The Bazel Authors. All rights reserved.
+ *
+ * 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.google.devtools.build.android.sandboxedsdktoolbox.apidescriptors;
+
+import java.io.IOException;
+import java.io.UncheckedIOException;
+import java.net.URI;
+import java.nio.file.FileSystem;
+import java.nio.file.FileSystems;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.util.HashMap;
+import picocli.CommandLine.Command;
+import picocli.CommandLine.Option;
+
+/** Command for extracting API descriptors from a sandboxed SDK Archive. */
+@Command(
+ name = "extract-api-descriptors-from-asar",
+ description = "Extract API descriptors from a sandboxed SDK Archive.")
+public final class ExtractApiDescriptorsFromAsarCommand implements Runnable {
+
+ private static final String API_DESCRIPTOR_ZIP_ENTRY_PATH = "sdk-interface-descriptors.jar";
+
+ @Option(names = "--asar", required = true)
+ Path asarPath;
+
+ @Option(names = "--output-sdk-api-descriptors", required = true)
+ Path outputSdkApiDescriptorsPath;
+
+ @Override
+ public void run() {
+ URI uri = URI.create("jar:" + asarPath.toUri());
+ try (FileSystem zipfs = FileSystems.newFileSystem(uri, new HashMap<String, String>())) {
+ Path descriptorsInZip = zipfs.getPath(API_DESCRIPTOR_ZIP_ENTRY_PATH);
+ if (!Files.exists(descriptorsInZip)) {
+ throw new IllegalStateException(
+ String.format("Could not find %s in %s", API_DESCRIPTOR_ZIP_ENTRY_PATH, asarPath));
+ }
+ Files.copy(descriptorsInZip, outputSdkApiDescriptorsPath);
+ } catch (IOException e) {
+ throw new UncheckedIOException("Failed to extract SDK API descriptors.", e);
+ }
+ }
+
+ private ExtractApiDescriptorsFromAsarCommand() {}
+}
diff --git a/src/tools/java/com/google/devtools/build/android/sandboxedsdktoolbox/clientsources/BUILD b/src/tools/java/com/google/devtools/build/android/sandboxedsdktoolbox/clientsources/BUILD
new file mode 100644
index 0000000..f0eaf11
--- /dev/null
+++ b/src/tools/java/com/google/devtools/build/android/sandboxedsdktoolbox/clientsources/BUILD
@@ -0,0 +1,17 @@
+# Command to generate sources for communicating with a sandboxed SDK.
+
+package(
+ default_applicable_licenses = ["//:license"],
+ default_visibility = ["//:__subpackages__"],
+)
+
+licenses(["notice"])
+
+java_library(
+ name = "clientsources",
+ srcs = glob(["*.java"]),
+ deps = [
+ "@rules_android_maven//:androidx_privacysandbox_tools_tools_apigenerator",
+ "@rules_android_maven//:info_picocli_picocli",
+ ],
+)
diff --git a/src/tools/java/com/google/devtools/build/android/sandboxedsdktoolbox/clientsources/GenerateClientSourcesCommand.java b/src/tools/java/com/google/devtools/build/android/sandboxedsdktoolbox/clientsources/GenerateClientSourcesCommand.java
new file mode 100644
index 0000000..cb5be04
--- /dev/null
+++ b/src/tools/java/com/google/devtools/build/android/sandboxedsdktoolbox/clientsources/GenerateClientSourcesCommand.java
@@ -0,0 +1,99 @@
+/*
+ * Copyright 2023 The Bazel Authors. All rights reserved.
+ *
+ * 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.google.devtools.build.android.sandboxedsdktoolbox.clientsources;
+
+import static java.nio.file.Files.createTempDirectory;
+import static java.util.stream.Collectors.toCollection;
+
+import androidx.privacysandbox.tools.apigenerator.PrivacySandboxApiGenerator;
+import java.io.IOException;
+import java.io.UncheckedIOException;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.stream.Stream;
+import picocli.CommandLine.Command;
+import picocli.CommandLine.Option;
+
+/**
+ * Command for generating Kotlin and Java sources for communicating with a sandboxed SDK over IPC.
+ */
+@Command(
+ name = "generate-client-sources",
+ description =
+ "Generate Kotlin and Java sources for communicating with a sandboxed SDK over IPC.")
+public final class GenerateClientSourcesCommand implements Runnable {
+
+ private final PrivacySandboxApiGenerator generator = new PrivacySandboxApiGenerator();
+
+ @Option(names = "--aidl-compiler", required = true)
+ Path aidlCompilerPath;
+
+ @Option(names = "--framework-aidl", required = true)
+ Path frameworkAidlPath;
+
+ @Option(names = "--sdk-api-descriptors", required = true)
+ Path sdkApiDescriptorsPath;
+
+ @Option(
+ names = "--output-kotlin-dir",
+ description = "Directory where Kotlin sources will be written.",
+ required = true)
+ Path outputKotlinDirPath;
+
+ @Option(
+ names = "--output-java-dir",
+ description = "Directory where Java sources will be written.",
+ required = true)
+ Path outputJavaDirPath;
+
+ @Override
+ public void run() {
+ try {
+ Path apiGeneratorOutputDir = createTempDirectory("apigenerator-raw-output");
+ generator.generate(
+ sdkApiDescriptorsPath, aidlCompilerPath, frameworkAidlPath, apiGeneratorOutputDir);
+ splitSources(apiGeneratorOutputDir, outputKotlinDirPath, outputJavaDirPath);
+ } catch (IOException e) {
+ throw new UncheckedIOException("Failed to generate sources.", e);
+ }
+ }
+
+ /** Split Java and Kotlin sources into different root directories. */
+ private static void splitSources(
+ Path sourcesDirectory, Path kotlinSourcesDirectory, Path javaSourcesDirectory)
+ throws IOException {
+ for (Path path : allFiles(sourcesDirectory)) {
+ Path targetDir = javaSourcesDirectory;
+ if (path.toString().endsWith(".kt")) {
+ targetDir = kotlinSourcesDirectory;
+ }
+ Path targetPath = targetDir.resolve(sourcesDirectory.relativize(path));
+
+ Files.createDirectories(targetPath.getParent());
+ Files.move(path, targetPath);
+ }
+ }
+
+ private static List<Path> allFiles(Path rootDirectory) throws IOException {
+ try (Stream<Path> pathStream = Files.walk(rootDirectory)) {
+ return pathStream.filter(Files::isRegularFile).collect(toCollection(ArrayList::new));
+ }
+ }
+
+ private GenerateClientSourcesCommand() {}
+}
diff --git a/src/tools/javatests/com/google/devtools/build/android/sandboxedsdktoolbox/apidescriptors/ExtractApiDescriptorsFromAsarCommandTest.java b/src/tools/javatests/com/google/devtools/build/android/sandboxedsdktoolbox/apidescriptors/ExtractApiDescriptorsFromAsarCommandTest.java
new file mode 100644
index 0000000..ce971e9
--- /dev/null
+++ b/src/tools/javatests/com/google/devtools/build/android/sandboxedsdktoolbox/apidescriptors/ExtractApiDescriptorsFromAsarCommandTest.java
@@ -0,0 +1,57 @@
+/*
+ * Copyright 2023 The Bazel Authors. All rights reserved.
+ *
+ * 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.google.devtools.build.android.sandboxedsdktoolbox.apidescriptors;
+
+import static com.google.common.truth.Truth.assertThat;
+import static com.google.devtools.build.android.sandboxedsdktoolbox.utils.Runner.runCommand;
+import static com.google.devtools.build.android.sandboxedsdktoolbox.utils.Zip.createZipWithSingleEntry;
+import static java.nio.charset.StandardCharsets.UTF_8;
+
+import com.google.devtools.build.android.sandboxedsdktoolbox.utils.CommandResult;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.rules.TemporaryFolder;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
+
+@RunWith(JUnit4.class)
+public final class ExtractApiDescriptorsFromAsarCommandTest {
+
+ @Rule public final TemporaryFolder testFolder = new TemporaryFolder();
+
+ @Test
+ public void extractApiDescriptors_fromValidAsar() throws Exception {
+ Path asar = Paths.get(testFolder.getRoot().getAbsolutePath(), "test.asar");
+ byte[] sdkApiDescriptorContents = "fake descriptor contents".getBytes(UTF_8);
+ Path outputDescriptors = Paths.get(testFolder.getRoot().getAbsolutePath(), "descriptors.jar");
+ createZipWithSingleEntry(asar, "sdk-interface-descriptors.jar", sdkApiDescriptorContents);
+
+ CommandResult result =
+ runCommand(
+ "extract-api-descriptors-from-asar",
+ "--asar",
+ asar.toString(),
+ "--output-sdk-api-descriptors",
+ outputDescriptors.toString());
+
+ assertThat(result.getStatusCode()).isEqualTo(0);
+ assertThat(result.getOutput()).isEmpty();
+ assertThat(Files.readAllBytes(outputDescriptors)).isEqualTo(sdkApiDescriptorContents);
+ }
+}
diff --git a/src/tools/javatests/com/google/devtools/build/android/sandboxedsdktoolbox/utils/TestData.java b/src/tools/javatests/com/google/devtools/build/android/sandboxedsdktoolbox/utils/TestData.java
index fdf96c5..7da5f1a 100644
--- a/src/tools/javatests/com/google/devtools/build/android/sandboxedsdktoolbox/utils/TestData.java
+++ b/src/tools/javatests/com/google/devtools/build/android/sandboxedsdktoolbox/utils/TestData.java
@@ -27,7 +27,7 @@ public final class TestData {
public static final Path JAVATESTS_DIR =
Path.of(
System.getenv("TEST_SRCDIR"),
- "/build_bazel_rules_android/src/tools/javatests/");
+ "/rules_android/src/tools/javatests/");
/** Reads the contents of a file, assuming its path is absolute. */
public static String readFromAbsolutePath(Path absolutePath) throws Exception {
diff --git a/src/tools/javatests/com/google/devtools/build/android/sandboxedsdktoolbox/utils/Zip.java b/src/tools/javatests/com/google/devtools/build/android/sandboxedsdktoolbox/utils/Zip.java
new file mode 100644
index 0000000..38d7eed
--- /dev/null
+++ b/src/tools/javatests/com/google/devtools/build/android/sandboxedsdktoolbox/utils/Zip.java
@@ -0,0 +1,48 @@
+/*
+ * Copyright 2023 The Bazel Authors. All rights reserved.
+ *
+ * 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.google.devtools.build.android.sandboxedsdktoolbox.utils;
+
+import java.io.IOException;
+import java.net.URI;
+import java.nio.file.FileSystem;
+import java.nio.file.FileSystems;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.util.HashMap;
+import java.util.Map;
+
+/** Test utilities for zip files. */
+public final class Zip {
+
+ /**
+ * Creates a zip file with a single entry inside of it.
+ *
+ * @param zipPath Path to the new zip file. If the file already exists {@link IOException} will be
+ * thrown.
+ */
+ public static void createZipWithSingleEntry(Path zipPath, String entryName, byte[] entryContents)
+ throws IOException {
+ Map<String, String> env = new HashMap<>();
+ env.put("create", "true");
+
+ URI uri = URI.create("jar:" + zipPath.toUri());
+ try (FileSystem zipfs = FileSystems.newFileSystem(uri, env)) {
+ Files.write(zipfs.getPath(entryName), entryContents);
+ }
+ }
+
+ private Zip() {}
+}
diff --git a/test/bashunit/unittest_test.py b/test/bashunit/unittest_test.py
index 2ecc17f..f5da4f7 100644
--- a/test/bashunit/unittest_test.py
+++ b/test/bashunit/unittest_test.py
@@ -42,7 +42,7 @@ fi
echo "Writing XML to ${XML_OUTPUT_FILE}"
-source "$(rlocation "build_bazel_rules_android/test/bashunit/unittest.bash")" \
+source "$(rlocation "rules_android/test/bashunit/unittest.bash")" \
|| { echo "Could not source unittest.bash" >&2; exit 1; }
"""
diff --git a/test/rules/android_sdk_repository/BUILD b/test/rules/android_sdk_repository/BUILD
new file mode 100644
index 0000000..72cabf9
--- /dev/null
+++ b/test/rules/android_sdk_repository/BUILD
@@ -0,0 +1,75 @@
+# Description:
+# Tests for android_sdk_repository.
+
+load("@bazel_binaries//:defs.bzl", "bazel_binaries")
+load(
+ "@rules_bazel_integration_test//bazel_integration_test:defs.bzl",
+ "script_test",
+)
+
+package(
+ default_applicable_licenses = ["//:license"],
+ default_visibility = [
+ "//test:__subpackages__",
+ ],
+)
+
+licenses(["notice"])
+
+sh_library(
+ name = "android_helper",
+ testonly = True,
+ srcs = ["android_helper.sh"],
+ data = [
+ "//rules/android_sdk_repository:bzl",
+ ],
+ visibility = ["//visibility:private"],
+ deps = [
+ "//test/bashunit",
+ "@bazel_tools//tools/bash/runfiles",
+ ],
+)
+
+sh_library(
+ name = "test_lib",
+ testonly = True,
+ srcs = ["test_lib.sh"],
+ visibility = ["//visibility:private"],
+ deps = [
+ ":android_helper",
+ "//test/bashunit",
+ "@bazel_tools//tools/bash/runfiles",
+ ],
+)
+
+script_test(
+ name = "android_sdk_repository_test",
+ srcs = ["android_sdk_repository_test.sh"],
+ bazel_binaries = bazel_binaries,
+ bazel_version = bazel_binaries.versions.current,
+ deps = [
+ ":test_lib",
+ "//test/bashunit",
+ "@bazel_tools//tools/bash/runfiles",
+ ],
+)
+
+script_test(
+ name = "android_sdk_repository_platforms_test",
+ srcs = ["android_sdk_repository_platforms_test.sh"],
+ bazel_binaries = bazel_binaries,
+ bazel_version = bazel_binaries.versions.current,
+ deps = [
+ ":test_lib",
+ "//test/bashunit",
+ "@bazel_tools//tools/bash/runfiles",
+ ],
+)
+
+test_suite(
+ name = "integration_tests",
+ tests = [
+ ":android_sdk_repository_platforms_test",
+ ":android_sdk_repository_test",
+ ],
+)
diff --git a/test/rules/android_sdk_repository/android_helper.sh b/test/rules/android_sdk_repository/android_helper.sh
new file mode 100644
index 0000000..fedd9fc
--- /dev/null
+++ b/test/rules/android_sdk_repository/android_helper.sh
@@ -0,0 +1,257 @@
+#!/bin/bash
+#
+# Copyright 2023 The Bazel Authors. All rights reserved.
+#
+# 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.
+
+# --- begin runfiles.bash initialization v2 ---
+# Copy-pasted from the Bazel Bash runfiles library v2.
+set -uo pipefail; f=bazel_tools/tools/bash/runfiles/runfiles.bash
+source "${RUNFILES_DIR:-/dev/null}/$f" 2>/dev/null || \
+ source "$(grep -sm1 "^$f " "${RUNFILES_MANIFEST_FILE:-/dev/null}" | cut -f2- -d' ')" 2>/dev/null || \
+ source "$0.runfiles/$f" 2>/dev/null || \
+ source "$(grep -sm1 "^$f " "$0.runfiles_manifest" | cut -f2- -d' ')" 2>/dev/null || \
+ source "$(grep -sm1 "^$f " "$0.exe.runfiles_manifest" | cut -f2- -d' ')" 2>/dev/null || \
+ { echo>&2 "ERROR: cannot find $f"; exit 1; }; f=; set -e
+# --- end runfiles.bash initialization v2 ---
+
+source "$(rlocation rules_android/test/bashunit/unittest.bash)" || \
+ (echo >&2 "Failed to locate bashunit.sh" && exit 1)
+
+function set_up() {
+ # Clean out the repository.
+ rm -rf *
+ touch WORKSPACE
+
+ # Clean out the test android SDK if any
+ rm -rf "${TEST_TMPDIR}/android_sdk"
+
+ # Make sure the rules exist and seed the WORKSPACE.
+ rm -rf "${TEST_TMPDIR}/android_sdk_repository_src"
+ set_up_rules
+}
+
+function set_up_rules() {
+ local android_revision_rule="$(rlocation rules_android/rules/android_revision.bzl)"
+
+ local repo_rule="$(rlocation rules_android/rules/android_sdk_repository/rule.bzl)"
+ local repo_rule_dir="$(dirname "${repo_rule}")"
+ local dest_dir="${TEST_TMPDIR}/android_sdk_repository_src"
+ mkdir -p "${dest_dir}/rules/android_sdk_repository"
+ cp -r "${repo_rule_dir}"/* "${dest_dir}/rules/android_sdk_repository"
+ cat > "${dest_dir}/WORKSPACE" <<EOF
+workspace(name = "android_sdk_repository_src")
+EOF
+ cat > "${dest_dir}/rules/BUILD" <<EOF
+exports_files(["*.bzl"])
+EOF
+ cp "${android_revision_rule}" "${dest_dir}/rules/"
+ cat > "${dest_dir}/rules/android_sdk_repository/BUILD" <<EOF
+exports_files(["*.bzl"])
+EOF
+
+ cat >> WORKSPACE <<EOF
+local_repository(
+ name = "android_sdk_repository_src",
+ path = "${dest_dir}",
+)
+load("@android_sdk_repository_src//rules/android_sdk_repository:rule.bzl", "android_sdk_repository")
+EOF
+}
+
+function create_android_sdk() {
+ # Create a fake Android SDK that will be available for the repository rule.
+ local location="${TEST_TMPDIR}/android_sdk"
+ mkdir -p "${location}"
+
+ mkdir "${location}/platform-tools"
+ touch "${location}/platform-tools/adb"
+
+ echo "${location}"
+}
+
+function add_platforms() {
+ local sdk_path="${1}"
+ shift
+
+ # Add all requested API levels
+ for level in "$@"; do
+ local dir="${sdk_path}/platforms/android-${level}"
+ mkdir -p "${dir}"
+ touch "${dir}/android.jar"
+ touch "${dir}/framework.aidl"
+
+ local system_image_dir="${sdk_path}/system-images/android-${level}"
+ mkdir -p "${system_image_dir}/default/arm64-v8a"
+ mkdir -p "${system_image_dir}/default/x86_64"
+ done
+}
+
+function add_build_tools() {
+ local sdk_path="${1}"
+ shift
+
+ # Add all requested tools
+ for version in "$@"; do
+ local dir="${sdk_path}/build-tools/${version}"
+ mkdir -p "${dir}/lib"
+ touch "${dir}/aapt"
+ touch "${dir}/aidl"
+ touch "${dir}/lib/apksigner.jar"
+ touch "${dir}/lib/d8.jar"
+ touch "${dir}/lib/dx.jar"
+ touch "${dir}/mainDexClasses.rules"
+ touch "${dir}/zipalign"
+ done
+}
+
+function create_android_sdk_basic() {
+ local sdk_path="$(create_android_sdk)"
+ add_platforms "${sdk_path}" 31
+ add_build_tools "${sdk_path}" 30.0.3
+ echo "${sdk_path}"
+}
+
+function create_verify() {
+ mkdir verify
+ cat > verify/BUILD <<EOF
+genrule(
+ name = "check_sdk",
+ outs = ["check_sdk.log"],
+ cmd = select({
+ "@androidsdk//:has_androidsdk": "echo sdk present > \$@",
+ "//conditions:default": "echo sdk missing > \$@",
+ }),
+)
+EOF
+
+ "${BIT_BAZEL_BINARY}" build //verify:check_sdk >& $TEST_log || fail "Expected success"
+ cat bazel-bin/verify/check_sdk.log >$TEST_log
+}
+
+function verify_no_android_sdk() {
+ create_verify
+ expect_log "sdk missing"
+}
+
+function verify_android_sdk() {
+ create_verify
+ expect_log "sdk present"
+ "${BIT_BAZEL_BINARY}" query @androidsdk//:files >& $TEST_log || fail "Expected to exist"
+}
+
+function write_platforms() {
+ mkdir -p platforms
+ cat > platforms/BUILD <<EOF
+platform(
+ name = "arm64-v8a",
+ constraint_values = [
+ "@platforms//os:android",
+ "@platforms//cpu:arm64",
+ ],
+)
+EOF
+}
+
+function write_android_sdk_provider() {
+ mkdir -p sdk_check
+ cat > sdk_check/check.bzl <<EOF
+def _find_api_level(android_jar):
+ # expected format: external/androidsdk/platforms/android-LEVEL/android.jar
+ if not android_jar.startswith("external/androidsdk/platforms/android-"):
+ return "unknown"
+ if not android_jar.endswith("/android.jar"):
+ return "unknown"
+ level = android_jar.removeprefix("external/androidsdk/platforms/android-")
+ level = level.removesuffix("/android.jar")
+ return level
+def _show_sdk_info_impl(ctx):
+ print("SDK check results:")
+ provider = ctx.attr._android_sdk[AndroidSdkInfo]
+ print("build_tools_version: %s" % provider.build_tools_version)
+ print("api_level: %s" % _find_api_level(provider.android_jar.path))
+show_sdk_info = rule(
+ implementation = _show_sdk_info_impl,
+ attrs = {
+ "_android_sdk": attr.label(default = "@androidsdk//:sdk"),
+ },
+)
+EOF
+}
+
+function write_android_sdk_provider_platforms() {
+ mkdir -p sdk_check
+ cat > sdk_check/check.bzl <<EOF
+def _find_api_level(android_jar):
+ # expected format: external/androidsdk/platforms/android-LEVEL/android.jar
+ if not android_jar.startswith("external/androidsdk/platforms/android-"):
+ return "unknown"
+ if not android_jar.endswith("/android.jar"):
+ return "unknown"
+ level = android_jar.removeprefix("external/androidsdk/platforms/android-")
+ level = level.removesuffix("/android.jar")
+ return level
+def _show_sdk_info_impl(ctx):
+ print("SDK check results:")
+ toolchain = ctx.toolchains["@bazel_tools//tools/android:sdk_toolchain_type"]
+ if not toolchain:
+ print("No SDK found via toolchain")
+ return
+ provider = toolchain.android_sdk_info
+ print("build_tools_version: %s" % provider.build_tools_version)
+ print("api_level: %s" % _find_api_level(provider.android_jar.path))
+show_sdk_info = rule(
+ implementation = _show_sdk_info_impl,
+ toolchains = [
+ config_common.toolchain_type(
+ "@bazel_tools//tools/android:sdk_toolchain_type",
+ mandatory = False,
+ ),
+ ],
+)
+EOF
+}
+
+function check_android_sdk_provider() {
+ local extra_args=(
+ # macOS bash doesn't deal well with empty arrays, so make sure this has
+ # contents.
+ "--experimental_google_legacy_api"
+ "$@"
+ )
+
+ if [[ ${ENABLE_PLATFORMS:-false} == "true" ]]; then
+ write_platforms
+ write_android_sdk_provider_platforms
+ extra_args+=(
+ "--incompatible_enable_android_toolchain_resolution"
+ "--platforms=//platforms:arm64-v8a"
+ )
+ else
+ write_android_sdk_provider
+ fi
+
+ cat > sdk_check/BUILD <<EOF
+load(":check.bzl", "show_sdk_info")
+show_sdk_info(
+ name = "check",
+)
+EOF
+
+ "${BIT_BAZEL_BINARY}" \
+ build \
+ "${extra_args[@]}" \
+ -- \
+ //sdk_check:check >& $TEST_log || fail "Expected success"
+ expect_log "SDK check results"
+}
diff --git a/test/rules/android_sdk_repository/android_sdk_repository_platforms_test.sh b/test/rules/android_sdk_repository/android_sdk_repository_platforms_test.sh
new file mode 100755
index 0000000..5040cd4
--- /dev/null
+++ b/test/rules/android_sdk_repository/android_sdk_repository_platforms_test.sh
@@ -0,0 +1,37 @@
+#!/bin/bash
+#
+# Copyright 2023 The Bazel Authors. All rights reserved.
+#
+# 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.
+
+# --- begin runfiles.bash initialization v2 ---
+# Copy-pasted from the Bazel Bash runfiles library v2.
+set -uo pipefail; f=bazel_tools/tools/bash/runfiles/runfiles.bash
+source "${RUNFILES_DIR:-/dev/null}/$f" 2>/dev/null || \
+ source "$(grep -sm1 "^$f " "${RUNFILES_MANIFEST_FILE:-/dev/null}" | cut -f2- -d' ')" 2>/dev/null || \
+ source "$0.runfiles/$f" 2>/dev/null || \
+ source "$(grep -sm1 "^$f " "$0.runfiles_manifest" | cut -f2- -d' ')" 2>/dev/null || \
+ source "$(grep -sm1 "^$f " "$0.exe.runfiles_manifest" | cut -f2- -d' ')" 2>/dev/null || \
+ { echo>&2 "ERROR: cannot find $f"; exit 1; }; f=; set -e
+# --- end runfiles.bash initialization v2 ---
+
+source "$(rlocation rules_android/test/bashunit/unittest.bash)" || \
+ (echo >&2 "Failed to locate bashunit.sh" && exit 1)
+
+ENABLE_PLATFORMS=true
+
+# Source and run the actual tests from test_lib.sh
+source "$(rlocation rules_android/test/rules/android_sdk_repository/test_lib.sh)" || \
+ (echo >&2 "Failed to locate test_lib.sh" && exit 1)
+
+run_suite "Android integration tests for SDK (with platforms)"
diff --git a/test/rules/android_sdk_repository/android_sdk_repository_test.sh b/test/rules/android_sdk_repository/android_sdk_repository_test.sh
new file mode 100755
index 0000000..5cfd330
--- /dev/null
+++ b/test/rules/android_sdk_repository/android_sdk_repository_test.sh
@@ -0,0 +1,37 @@
+#!/bin/bash
+#
+# Copyright 2023 The Bazel Authors. All rights reserved.
+#
+# 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.
+
+# --- begin runfiles.bash initialization v2 ---
+# Copy-pasted from the Bazel Bash runfiles library v2.
+set -uo pipefail; f=bazel_tools/tools/bash/runfiles/runfiles.bash
+source "${RUNFILES_DIR:-/dev/null}/$f" 2>/dev/null || \
+ source "$(grep -sm1 "^$f " "${RUNFILES_MANIFEST_FILE:-/dev/null}" | cut -f2- -d' ')" 2>/dev/null || \
+ source "$0.runfiles/$f" 2>/dev/null || \
+ source "$(grep -sm1 "^$f " "$0.runfiles_manifest" | cut -f2- -d' ')" 2>/dev/null || \
+ source "$(grep -sm1 "^$f " "$0.exe.runfiles_manifest" | cut -f2- -d' ')" 2>/dev/null || \
+ { echo>&2 "ERROR: cannot find $f"; exit 1; }; f=; set -e
+# --- end runfiles.bash initialization v2 ---
+
+source "$(rlocation rules_android/test/bashunit/unittest.bash)" || \
+ (echo >&2 "Failed to locate bashunit.sh" && exit 1)
+
+ENABLE_PLATFORMS=false
+
+# Source and run the actual tests from test_lib.sh
+source "$(rlocation rules_android/test/rules/android_sdk_repository/test_lib.sh)" || \
+ (echo >&2 "Failed to locate test_lib.sh" && exit 1)
+
+run_suite "Android integration tests for SDK"
diff --git a/test/rules/android_sdk_repository/test_lib.sh b/test/rules/android_sdk_repository/test_lib.sh
new file mode 100644
index 0000000..17d2485
--- /dev/null
+++ b/test/rules/android_sdk_repository/test_lib.sh
@@ -0,0 +1,196 @@
+#!/bin/bash
+#
+# Copyright 2023 The Bazel Authors. All rights reserved.
+#
+# 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.
+
+# --- begin runfiles.bash initialization v2 ---
+# Copy-pasted from the Bazel Bash runfiles library v2.
+set -uo pipefail; f=bazel_tools/tools/bash/runfiles/runfiles.bash
+source "${RUNFILES_DIR:-/dev/null}/$f" 2>/dev/null || \
+ source "$(grep -sm1 "^$f " "${RUNFILES_MANIFEST_FILE:-/dev/null}" | cut -f2- -d' ')" 2>/dev/null || \
+ source "$0.runfiles/$f" 2>/dev/null || \
+ source "$(grep -sm1 "^$f " "$0.runfiles_manifest" | cut -f2- -d' ')" 2>/dev/null || \
+ source "$(grep -sm1 "^$f " "$0.exe.runfiles_manifest" | cut -f2- -d' ')" 2>/dev/null || \
+ { echo>&2 "ERROR: cannot find $f"; exit 1; }; f=; set -e
+# --- end runfiles.bash initialization v2 ---
+
+source "$(rlocation rules_android/test/bashunit/unittest.bash)" || \
+ (echo >&2 "Failed to locate bashunit.sh" && exit 1)
+
+source "$(rlocation rules_android/test/rules/android_sdk_repository/android_helper.sh)" || \
+ (echo >&2 "Failed to locate android_helper.sh" && exit 1)
+
+# Actual tests for Android Sdk Repository
+
+# Check that the empty BUILD file was created.
+function test_android_sdk_repository_no_path_or_android_home() {
+ cat >> WORKSPACE <<EOF
+android_sdk_repository(
+ name = "androidsdk",
+)
+EOF
+
+ verify_no_android_sdk
+ "${BIT_BAZEL_BINARY}" build @androidsdk//:files >& $TEST_log && fail "Should have failed" || true
+ expect_log "Either the path attribute of android_sdk_repository"
+}
+
+function test_android_sdk_repository_path_from_attribute() {
+ # Create android SDK
+ local sdk_path="$(create_android_sdk_basic)"
+
+ # Add to repository.
+ cat >> WORKSPACE <<EOF
+android_sdk_repository(
+ name = "androidsdk",
+ path = "${sdk_path}",
+)
+EOF
+
+ # Verify the SDK is created correctly.
+ verify_android_sdk
+}
+
+function test_android_sdk_repository_path_from_environment() {
+ # Create android SDK
+ local sdk_path="$(create_android_sdk_basic)"
+
+ # Add to repository.
+ cat >> WORKSPACE <<EOF
+android_sdk_repository(
+ name = "androidsdk",
+)
+EOF
+
+ export ANDROID_HOME="${sdk_path}"
+ # Verify the SDK is created correctly.
+ verify_android_sdk
+}
+
+function test_android_sdk_repository_fails_invalid_path() {
+ # Create an empty SDK directory.
+ mkdir -p "$TEST_TMPDIR/android_sdk"
+
+ # Add to repository with the invalid path
+ cat >> WORKSPACE <<EOF
+android_sdk_repository(
+ name = "androidsdk",
+ path = "$TEST_TMPDIR/android_sdk",
+)
+EOF
+
+ "${BIT_BAZEL_BINARY}" query @androidsdk//:files >& $TEST_log && fail "Should have failed" || true
+ expect_log "No Android SDK apis found in the Android SDK"
+}
+
+function test_build_tools_largest() {
+ # create several build tools
+ local sdk_path="$(create_android_sdk)"
+ add_platforms "${sdk_path}" 31
+ add_build_tools "${sdk_path}" 10.1.2 20.2.3 30.3.4
+
+ # Add to repository.
+ cat >> WORKSPACE <<EOF
+android_sdk_repository(
+ name = "androidsdk",
+ path = "${sdk_path}",
+)
+EOF
+
+ check_android_sdk_provider
+ expect_log "build_tools_version: 30.3.4"
+}
+
+function test_api_level_default() {
+ if [[ "${ENABLE_PLATFORMS:-false}" == "true" ]]; then
+ # TODO(katre): Fix API selection with platforms.
+ return
+ fi
+ # create several api levels
+ local sdk_path="$(create_android_sdk)"
+ add_platforms "${sdk_path}" 31 23 45
+ add_build_tools "${sdk_path}" 30.3.4
+
+ # Add to repository.
+ cat >> WORKSPACE <<EOF
+android_sdk_repository(
+ name = "androidsdk",
+ path = "${sdk_path}",
+)
+EOF
+
+ # Should be the largest API level available
+ check_android_sdk_provider
+ expect_log "api_level: 45"
+}
+
+function test_api_level_specific() {
+ if [[ "${ENABLE_PLATFORMS:-false}" == "true" ]]; then
+ # TODO(katre): Fix API selection with platforms.
+ return
+ fi
+ # create several api levels
+ local sdk_path="$(create_android_sdk)"
+ add_platforms "${sdk_path}" 31 23 45
+ add_build_tools "${sdk_path}" 30.3.4
+
+ # Add to repository.
+ cat >> WORKSPACE <<EOF
+android_sdk_repository(
+ name = "androidsdk",
+ path = "${sdk_path}",
+ api_level = 31,
+)
+EOF
+
+ check_android_sdk_provider
+ expect_log "api_level: 31"
+}
+
+function test_api_level_specific_missing() {
+ # create several api levels
+ local sdk_path="$(create_android_sdk)"
+ add_platforms "${sdk_path}" 31 23 45
+ add_build_tools "${sdk_path}" 30.3.4
+
+ # Add to repository.
+ cat >> WORKSPACE <<EOF
+android_sdk_repository(
+ name = "androidsdk",
+ path = "${sdk_path}",
+ api_level = 30,
+)
+EOF
+
+ "${BIT_BAZEL_BINARY}" query @androidsdk//:files >& $TEST_log && fail "Should have failed" || true
+ expect_log "Android SDK api level 30 was requested but it is not installed"
+}
+
+function test_api_level_flag() {
+ # create several api levels
+ local sdk_path="$(create_android_sdk)"
+ add_platforms "${sdk_path}" 31 23 45
+ add_build_tools "${sdk_path}" 30.3.4
+
+ # Add to repository.
+ cat >> WORKSPACE <<EOF
+android_sdk_repository(
+ name = "androidsdk",
+ path = "${sdk_path}",
+)
+EOF
+
+ check_android_sdk_provider --@androidsdk//:api_level=31
+ expect_log "api_level: 31"
+}
diff --git a/test/utils/asserts.bzl b/test/utils/asserts.bzl
index 7a81b61..ae75b78 100644
--- a/test/utils/asserts.bzl
+++ b/test/utils/asserts.bzl
@@ -572,6 +572,10 @@ def _check_actions(inspect, actions):
mnemonic_matching_actions = []
mnemonic_match = False
for _, value in actions.by_file.items():
+ # TODO(b/130571505): Remove this after SpawnActionTemplate is supported in Starlark
+ if not (hasattr(value, "mnemonic") and hasattr(value, "argv")):
+ continue
+
if mnemonic != value.mnemonic:
continue
mnemonic_match = True
diff --git a/test/utils/integration_demo/BUILD b/test/utils/integration_demo/BUILD
new file mode 100644
index 0000000..ddc7012
--- /dev/null
+++ b/test/utils/integration_demo/BUILD
@@ -0,0 +1,30 @@
+load("@bazel_binaries//:defs.bzl", "bazel_binaries")
+load(
+ "@rules_bazel_integration_test//bazel_integration_test:defs.bzl",
+ "script_test",
+)
+
+package(
+ default_applicable_licenses = ["//:license"],
+ default_visibility = [
+ "//test:__subpackages__",
+ ],
+)
+
+script_test(
+ name = "demo_test",
+ srcs = ["demo_test.sh"],
+ bazel_binaries = bazel_binaries,
+ bazel_version = bazel_binaries.versions.current,
+ deps = [
+ "//test/bashunit",
+ "@bazel_tools//tools/bash/runfiles",
+ ],
+)
+
+test_suite(
+ name = "integration_tests",
+ tests = [
+ ":demo_test",
+ ],
+)
diff --git a/test/utils/integration_demo/demo_test.sh b/test/utils/integration_demo/demo_test.sh
new file mode 100755
index 0000000..e47690c
--- /dev/null
+++ b/test/utils/integration_demo/demo_test.sh
@@ -0,0 +1,40 @@
+#!/bin/bash
+# Copyright 2023 The Bazel Authors. All rights reserved.
+#
+# 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.
+
+# Short demo of the rules_bazel_integration_test to ensure it works.
+
+# --- begin runfiles.bash initialization v2 ---
+# Copy-pasted from the Bazel Bash runfiles library v2.
+set -uo pipefail; f=bazel_tools/tools/bash/runfiles/runfiles.bash
+source "${RUNFILES_DIR:-/dev/null}/$f" 2>/dev/null || \
+ source "$(grep -sm1 "^$f " "${RUNFILES_MANIFEST_FILE:-/dev/null}" | cut -f2- -d' ')" 2>/dev/null || \
+ source "$0.runfiles/$f" 2>/dev/null || \
+ source "$(grep -sm1 "^$f " "$0.runfiles_manifest" | cut -f2- -d' ')" 2>/dev/null || \
+ source "$(grep -sm1 "^$f " "$0.exe.runfiles_manifest" | cut -f2- -d' ')" 2>/dev/null || \
+ { echo>&2 "ERROR: cannot find $f"; exit 1; }; f=; set -e
+# --- end runfiles.bash initialization v2 ---
+
+source "$(rlocation rules_android/test/bashunit/unittest.bash)" || \
+ (echo >&2 "Failed to locate bashunit.sh" && exit 1)
+
+function test_bazel_exists() {
+ touch WORKSPACE
+ touch BUILD.bazel
+
+ "${BIT_BAZEL_BINARY}" info >& $TEST_log
+ expect_log "output_base: "
+}
+
+run_suite "Demo of rules_bazel_integration_test"
diff --git a/toolchains/android/toolchain.bzl b/toolchains/android/toolchain.bzl
index 452fe6f..2d067ac 100644
--- a/toolchains/android/toolchain.bzl
+++ b/toolchains/android/toolchain.bzl
@@ -137,11 +137,21 @@ _ATTRS = dict(
default = Label("@bazel_tools//tools/android:dexbuilder"),
executable = True,
),
+ dexbuilder_after_proguard = attr.label(
+ cfg = "exec",
+ default = Label("@bazel_tools//tools/android:dexbuilder_after_proguard"),
+ executable = True,
+ ),
dexmerger = attr.label(
cfg = "exec",
default = Label("@bazel_tools//tools/android:dexmerger"),
executable = True,
),
+ dexsharder = attr.label(
+ cfg = "exec",
+ default = Label("@bazel_tools//tools/android:dexsharder"),
+ executable = True,
+ ),
enforce_min_sdk_floor_tool = attr.label(
allow_files = True,
cfg = "exec",
@@ -232,8 +242,13 @@ _ATTRS = dict(
default = "//src/tools/java/com/google/devtools/build/android/sandboxedsdktoolbox:sandboxed_sdk_toolbox_deploy.jar",
executable = True,
),
+ shuffle_jars = attr.label(
+ cfg = "exec",
+ default = Label("@bazel_tools//tools/android:shuffle_jars"),
+ executable = True,
+ ),
testsupport = attr.label(
- default = "@androidsdk//:fail",
+ default = "@bazel_tools//tools/jdk:TestRunner",
),
unzip_tool = attr.label(
cfg = "exec",
@@ -277,6 +292,11 @@ _ATTRS = dict(
default = "@bazel_tools//tools/android:build_java8_legacy_dex",
executable = True,
),
+ dex_list_obfuscator = attr.label(
+ cfg = "exec",
+ default = "@bazel_tools//tools/android:dex_list_obfuscator",
+ executable = True,
+ ),
)
def _impl(ctx):
diff --git a/tools/jdk/BUILD b/tools/jdk/BUILD
index f3259df..27c0fdf 100644
--- a/tools/jdk/BUILD
+++ b/tools/jdk/BUILD
@@ -20,6 +20,18 @@ alias(
)
alias(
+ name = "current_java_toolchain",
+ actual = "@bazel_tools//tools/jdk:current_java_toolchain",
+ visibility = ["//visibility:public"],
+)
+
+alias(
+ name = "jdk",
+ actual = "@bazel_tools//tools/jdk:jdk",
+ visibility = ["//visibility:public"],
+)
+
+alias(
name = "current_host_java_runtime",
actual = "@bazel_tools//tools/jdk:current_host_java_runtime",
visibility = ["//visibility:public"],