Skip to content

Commit bcad3d0

Browse files
committed
Fix R8 desugar_java8_libs support
1 parent 305cf2f commit bcad3d0

File tree

1 file changed

+38
-3
lines changed

1 file changed

+38
-3
lines changed

rules/android_binary/r8.bzl

Lines changed: 38 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,12 @@
1313
# limitations under the License.
1414
"""R8 processor steps for android_binary."""
1515

16+
load("@rules_java//java/common:java_common.bzl", "java_common")
1617
load("//providers:providers.bzl", "AndroidDexInfo", "AndroidPreDexJarInfo")
1718
load("//rules:acls.bzl", "acls")
1819
load("//rules:android_neverlink_aspect.bzl", "StarlarkAndroidNeverlinkInfo")
1920
load("//rules:common.bzl", "common")
21+
load("//rules:dex.bzl", "dex")
2022
load("//rules:java.bzl", "java")
2123
load("//rules:min_sdk_version.bzl", "min_sdk_version")
2224
load(
@@ -97,6 +99,9 @@ def process_r8(ctx, validation_ctx, jvm_ctx, packaged_resources_ctx, build_info_
9799
neverlink_infos = utils.collect_providers(StarlarkAndroidNeverlinkInfo, ctx.attr.deps)
98100
neverlink_jars = depset(transitive = [info.transitive_neverlink_libraries for info in neverlink_infos])
99101

102+
desugared_lib_config = ctx.file._desugared_lib_config
103+
desugar_java8_libs = ctx.fragments.android.desugar_java8_libs
104+
100105
args = ctx.actions.args()
101106
args.add("--release")
102107
args.add("--min-api", effective_min_sdk)
@@ -107,21 +112,51 @@ def process_r8(ctx, validation_ctx, jvm_ctx, packaged_resources_ctx, build_info_
107112
args.add(deploy_jar) # jar to optimize + desugar + dex
108113
args.add("--pg-map-output", proguard_mappings_output_file)
109114

115+
r8_inputs = [android_jar, deploy_jar] + proguard_specs
116+
if desugar_java8_libs and desugared_lib_config:
117+
args.add("--desugared-lib", desugared_lib_config)
118+
r8_inputs.append(desugared_lib_config)
119+
110120
java.run(
111121
ctx = ctx,
112122
host_javabase = common.get_host_javabase(ctx),
113123
executable = get_android_toolchain(ctx).r8.files_to_run,
114124
arguments = [args],
115-
inputs = depset([android_jar, deploy_jar] + proguard_specs, transitive = [neverlink_jars]),
125+
inputs = depset(r8_inputs, transitive = [neverlink_jars]),
116126
outputs = [dexes_zip, proguard_mappings_output_file],
117127
mnemonic = "AndroidR8",
118128
jvm_flags = ["-Xmx8G"],
119129
progress_message = "R8 Optimizing, Desugaring, and Dexing %{label}",
120130
)
121131

132+
# Build and append the core library desugaring runtime (java8 legacy dex).
133+
# This contains backported implementations of java.time, java.util.stream, etc.
134+
final_classes_dex_zip = dexes_zip
135+
if desugar_java8_libs:
136+
java8_legacy_dex, java8_legacy_dex_map = dex.get_java8_legacy_dex_and_map(
137+
ctx,
138+
bootclasspath_jar = utils.only(common.get_java_toolchain(ctx)[java_common.JavaToolchainInfo].bootclasspath.to_list()),
139+
binary_jar = deploy_jar,
140+
# Use the prebuilt legacy dex rather than building a customized one.
141+
# The deploy jar still references standard java.time.* APIs (not j$.* backports),
142+
# so tracereferences won't find references to the desugared library.
143+
# R8 handles the retargeting internally via --desugared-lib.
144+
build_customized_files = False,
145+
min_sdk_version = min_sdk_version.clamp(effective_min_sdk),
146+
)
147+
148+
final_classes_dex_zip = ctx.actions.declare_file(ctx.label.name + "_final_classes_dex.zip")
149+
dex.append_desugar_dexes(
150+
ctx,
151+
output = final_classes_dex_zip,
152+
input = dexes_zip,
153+
dexes = [java8_legacy_dex],
154+
dex_zips_merger = get_android_toolchain(ctx).dex_zips_merger.files_to_run,
155+
)
156+
122157
android_dex_info = AndroidDexInfo(
123158
deploy_jar = deploy_jar,
124-
final_classes_dex_zip = dexes_zip,
159+
final_classes_dex_zip = final_classes_dex_zip,
125160
# R8 preserves the Java resources (i.e. non-Java-class files) in its output zip, so no need
126161
# to provide a Java resources zip.
127162
java_resource_jar = None,
@@ -130,7 +165,7 @@ def process_r8(ctx, validation_ctx, jvm_ctx, packaged_resources_ctx, build_info_
130165
return ProviderInfo(
131166
name = "r8_ctx",
132167
value = struct(
133-
final_classes_dex_zip = dexes_zip,
168+
final_classes_dex_zip = final_classes_dex_zip,
134169
dex_info = android_dex_info,
135170
providers = [
136171
android_dex_info,

0 commit comments

Comments
 (0)