Skip to content

Commit

Permalink
Building java8_legacy_dex works
Browse files Browse the repository at this point in the history
  • Loading branch information
ted-xie committed Mar 21, 2024
1 parent d989847 commit a524652
Show file tree
Hide file tree
Showing 8 changed files with 192 additions and 8 deletions.
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -3,3 +3,4 @@ bazel-*
.ijwb
# Android Studio Bazel Plugin
.aswb
*.swp
1 change: 1 addition & 0 deletions defs.bzl
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@ def rules_android_workspace():
"androidx.test.ext:junit:1.2.0-alpha01",
"com.android.tools.build:apksig:8.3.0-alpha18",
"com.android.tools.build:bundletool:1.15.5",
"com.android.tools:desugar_jdk_libs_nio:2.0.4",
"com.android.tools:desugar_jdk_libs_configuration_nio:2.0.4",
"com.android.tools.build:gradle:8.2.0-alpha15",
"org.bouncycastle:bcprov-jdk18on:1.77",
Expand Down
3 changes: 2 additions & 1 deletion examples/basicapp/.bazelrc
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
# Flags needed while the Android rules are being migrated to Starlark.
common --experimental_google_legacy_api
common --experimental_enable_android_migration_apis
common:core_library_desugaring --desugar_java8_libs

# Flags to enable mobile-install v3
mobile-install --mode=skylark --mobile_install_aspect=@rules_android//mobile_install:mi.bzl --mobile_install_supported_rules=android_binary
# Required to invoke the Studio deployer jar
mobile-install --tool_java_runtime_version=17
mobile-install --tool_java_runtime_version=17
5 changes: 4 additions & 1 deletion examples/basicapp/MODULE.bazel
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,9 @@ module(
bazel_dep(name = "rules_java", version = "7.4.0")
bazel_dep(name = "bazel_skylib", version = "1.3.0")

remote_android_extensions = use_extension("@bazel_tools//tools/android:android_extensions.bzl", "remote_android_tools_extensions")
use_repo(remote_android_extensions, "android_gmaven_r8", "android_tools")

bazel_dep(
name = "rules_android",
version = "0.2.0",
Expand All @@ -18,4 +21,4 @@ local_path_override(
register_toolchains(
"@rules_android//toolchains/android:android_default_toolchain",
"@rules_android//toolchains/android_sdk:android_sdk_tools",
)
)
20 changes: 18 additions & 2 deletions rules_android_maven_install.json
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
{
"dependency_tree": {
"__AUTOGENERATED_FILE_DO_NOT_MODIFY_THIS_FILE_MANUALLY": "THERE_IS_NO_DATA_ONLY_ZUUL",
"__INPUT_ARTIFACTS_HASH": 1385768966,
"__RESOLVED_ARTIFACTS_HASH": -1912752840,
"__INPUT_ARTIFACTS_HASH": -1945756206,
"__RESOLVED_ARTIFACTS_HASH": -1001689139,
"conflict_resolution": {
"com.google.protobuf:protobuf-java-util:3.9.2": "com.google.protobuf:protobuf-java-util:3.19.3"
},
Expand Down Expand Up @@ -1546,6 +1546,22 @@
"sha256": "32d68079c34ec46695eb7af4e4daf20e67f21392e4ae501d0fd3c7fe3406c893",
"url": "https://maven.google.com/com/android/tools/desugar_jdk_libs_configuration_nio/2.0.4/desugar_jdk_libs_configuration_nio-2.0.4.jar"
},
{
"coord": "com.android.tools:desugar_jdk_libs_nio:2.0.4",
"dependencies": [
"com.android.tools:desugar_jdk_libs_configuration_nio:2.0.4"
],
"directDependencies": [
"com.android.tools:desugar_jdk_libs_configuration_nio:2.0.4"
],
"file": "v1/https/maven.google.com/com/android/tools/desugar_jdk_libs_nio/2.0.4/desugar_jdk_libs_nio-2.0.4.jar",
"mirror_urls": [
"https://maven.google.com/com/android/tools/desugar_jdk_libs_nio/2.0.4/desugar_jdk_libs_nio-2.0.4.jar",
"https://repo1.maven.org/maven2/com/android/tools/desugar_jdk_libs_nio/2.0.4/desugar_jdk_libs_nio-2.0.4.jar"
],
"sha256": "3bf4004c745f4c3740eea4c5729766b27746236f095c0fc52870e861183cbb9c",
"url": "https://maven.google.com/com/android/tools/desugar_jdk_libs_nio/2.0.4/desugar_jdk_libs_nio-2.0.4.jar"
},
{
"coord": "com.android.tools:dvlib:31.2.0-alpha15",
"dependencies": [
Expand Down
4 changes: 2 additions & 2 deletions toolchains/android/toolchain.bzl
Original file line number Diff line number Diff line change
Expand Up @@ -280,11 +280,11 @@ _ATTRS = dict(
java8_legacy_dex = attr.label(
allow_single_file = True,
cfg = "exec",
default = "@bazel_tools//tools/android:java8_legacy_dex",
default = Label("//tools/android:java8_legacy_dex"),
),
build_java8_legacy_dex = attr.label(
cfg = "exec",
default = "@bazel_tools//tools/android:build_java8_legacy_dex",
default = Label("//tools/android:build_java8_legacy_dex"),
executable = True,
),
dex_list_obfuscator = attr.label(
Expand Down
49 changes: 47 additions & 2 deletions tools/android/BUILD
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,12 @@ java_plugin(
],
)

alias(
name = "zip",
actual = "//toolchains/android:zip",
visibility = ["//visibility:public"],
)

genrule(
name = "full_desugar_jdk_libs_config_json",
outs = ["full_desugar_jdk_libs_config.json"],
Expand All @@ -69,9 +75,41 @@ genrule(
cmd = "$(location //src/tools/extract_desugar_pgcfg_flags) --input_json $(location :full_desugar_jdk_libs_config_json) --output_file $@"
)

alias(
genrule(
name = "build_java8_legacy_dex_params",
outs = ["build_java8_legacy_dex_params.txt"],
cmd = "echo -n --min-api 24 > $@",
visibility = ["//visibility:private"],
)

genrule(
name = "desugared_jdk_libs_jar",
outs = ["desugared_jdk_libs.jar"],
srcs = ["@rules_android_maven//:com_android_tools_desugar_jdk_libs_nio"],
cmd = "cp $< $@",
)

sh_binary(
name = "build_java8_legacy_dex",
srcs = ["build_java8_legacy_dex.sh"],
data = [
"build_java8_legacy_dex_params",
":minify_desugar_jdk_libs.pgcfg",
":desugared_jdk_libs_jar",
":d8",
":r8",
":tracereferences",
":zip",
"@bazel_tools//tools/bash/runfiles",
],
visibility = ["//visibility:public"],
)

genrule(
name = "java8_legacy_dex",
actual = ":gen_fail",
outs = ["java8_legacy.dex.zip"],
cmd = "$(location :build_java8_legacy_dex) --output $@",
tools = [":build_java8_legacy_dex"],
visibility = ["//visibility:public"],
)

Expand Down Expand Up @@ -101,6 +139,13 @@ java_binary(
runtime_deps = ["@android_gmaven_r8//jar"],
)

java_binary(
name = "tracereferences",
main_class = "com.android.tools.r8.tracereferences.TraceReferences",
visibility = ["//visibility:public"],
runtime_deps = ["@android_gmaven_r8//jar"],
)

java_binary(
name = "resource_shrinker",
main_class = "com.android.build.shrinker.ResourceShrinkerCli",
Expand Down
117 changes: 117 additions & 0 deletions tools/android/build_java8_legacy_dex.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,117 @@
#!/bin/bash
# Copyright 2024 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.

# Dex and optionally minify supported Java 8 libs using d8/r8.

# --- begin runfiles.bash initialization v3 ---
# Copy-pasted from the Bazel Bash runfiles library v3.
set -uo pipefail; set +e; 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 v3 ---

set -eu

# Keep rules generated by tracereferences.
rules=
# android.jar library.
android_jar=
# Application as class file (not dex).
binary_jar=
# Desugared library dex output.
dest=
# Desugared library mapping file output.
map=
# The minimal API level to be supported.
min_api=

function parse_args() {
while [[ "$#" -gt 0 ]]; do
arg="$1"; shift;
case "${arg}" in
--rules) rules="$1"; shift ;;
--rules=*) rules="${arg:8}" ;;
--binary) binary_jar="$1"; shift ;;
--binary=*) binary_jar="${arg:9}" ;;
--output) dest="$1"; shift ;;
--output=*) dest="${arg:9}" ;;
--output_map) map="$1"; shift ;;
--output_map=*) map="${arg:13}" ;;
--android_jar) android_jar="$1"; shift ;;
--android_jar=*) android_jar="${arg:14}" ;;
--min-api) min_api="$1"; shift ;;
--min-api=*) min_api="${arg:10}" ;;
*) echo "Unknown flag: ${arg}"; exit 1 ;;
esac
done
}

declare -a ARGS_FROM_PARAMS_FILE
PARAMS_TXT=$(rlocation rules_android/tools/android/build_java8_legacy_dex_params.txt)
read -ra ARGS_FROM_PARAMS_FILE <<< "$(cat $PARAMS_TXT)"

parse_args "${ARGS_FROM_PARAMS_FILE[@]}" "$@"

todex="$(rlocation rules_android/tools/android/desugared_jdk_libs.jar)"
# Only pass the --pg-map-output if a mapping file output location is provided
map_output=
if [[ -n "${map}" ]]; then
map_output="--pg-map-output"
fi
if [[ -n "${binary_jar}" ]]; then
tmpdir=$(mktemp -d)

# Collect keep rules from references in binary.
if [[ -z "${rules}" ]]; then
rules="${tmpdir}/rules.pgcfg"
fi
"$(rlocation rules_android/tools/android/tracereferences)" \
--map-diagnostics:MissingDefinitionsDiagnostic error warning \
--keep-rules \
--lib "${android_jar}" \
--source "${binary_jar}" \
--target "${todex}" \
--output "${rules}"

if [[ ! -s "${rules}" ]]; then
# No keep rules, meaning nothing to keep, so emit an empty zip
"$(rlocation rules_android/tools/android/zip)" -jt -X "${dest}" "${rules}"
"$(rlocation rules_android/tools/android/zip)" -jt -X -d "${dest}" "${rules}"
if [[ -n "${map}" ]]; then
echo '# No desugared library mapping' > "${map}"
fi
else
# Shrink desugared library and convert to DEX.
"$(rlocation rules_android/tools/android/r8)" \
--min-api "${min_api}" \
--no-desugaring \
--lib "${android_jar}" \
--pg-conf "$(rlocation rules_android/tools/android/minify_desugar_jdk_libs.pgcfg)" \
--pg-conf "${rules}" \
--output "${dest}" \
"${map_output}" "${map}" \
"${todex}"
fi

rm -rf "${tmpdir}"
else
# No shrinking just convert to DEX.
set -x
"$(rlocation rules_android/tools/android/d8)" --min-api "${min_api}" --no-desugaring --lib "${android_jar}" --output "${dest}" "${todex}"
fi

0 comments on commit a524652

Please sign in to comment.