1313# limitations under the License.
1414"""R8 processor steps for android_binary."""
1515
16+ load ("@rules_java//java/common:java_common.bzl" , "java_common" )
1617load ("//providers:providers.bzl" , "AndroidDexInfo" , "AndroidPreDexJarInfo" )
1718load ("//rules:acls.bzl" , "acls" )
1819load ("//rules:android_neverlink_aspect.bzl" , "StarlarkAndroidNeverlinkInfo" )
1920load ("//rules:common.bzl" , "common" )
21+ load ("//rules:dex.bzl" , "dex" )
2022load ("//rules:java.bzl" , "java" )
2123load ("//rules:min_sdk_version.bzl" , "min_sdk_version" )
2224load (
@@ -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