Skip to content

Commit 8fdc00f

Browse files
ted-xiecopybara-github
authored andcommitted
Implement DesugarDexShardingAction binary in Java for increased speed
Wrapping all JVM invocations (desugar, dex) inside of a Java binary saves on JVM startups and reuses the JIT cache, thus improving overall performance, and enables persistent worker mode for Bazel. #292 PiperOrigin-RevId: 745679107 Change-Id: I099e06115e2ca0105246c04fd135cda99ca8ea92
1 parent 2302a09 commit 8fdc00f

11 files changed

Lines changed: 589 additions & 20 deletions

File tree

mobile_install/dependency_map.bzl

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,9 @@ versioned_deps = struct(
1717
android_kit = struct(
1818
head = "//src/tools/ak",
1919
),
20+
desugar_dex_sharding = struct(
21+
head = "//src/tools/java/com/google/devtools/build/android:DesugarDexShardingAction_deploy.jar",
22+
),
2023
bootstraper = struct(
2124
head = "//tools/android:gen_fail",
2225
),

mobile_install/tools_common.bzl

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,12 @@ TOOL_ATTRS = dict(
121121
cfg = "exec",
122122
executable = True,
123123
),
124+
_desugar_dex_sharding = attr.label(
125+
default = versioned_deps.desugar_dex_sharding.head,
126+
allow_files = True,
127+
cfg = "exec",
128+
executable = True,
129+
),
124130
_deploy = attr.label(
125131
default = versioned_deps.deploy.head,
126132
allow_files = True,

mobile_install/transform.bzl

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -42,8 +42,7 @@ def dex(
4242
data,
4343
deps = constants.EMPTY_LIST,
4444
num_shards = None,
45-
create_file = _declare_file,
46-
desugar = True):
45+
create_file = _declare_file):
4746
"""Dex a list of Jars.
4847
4948
Args:
@@ -65,7 +64,6 @@ def dex(
6564
6665
Returns:
6766
A File.
68-
desugar: A boolean that determines whether to apply desugaring.
6967
7068
Returns:
7169
A list of tuples where each entry contains the originating Jar path and
@@ -88,7 +86,7 @@ def dex(
8886
dirname + "/" + str(i) + ".zip",
8987
sibling = jar,
9088
))
91-
utils.dex(ctx, jar, out_dex_shards, deps, desugar)
89+
utils.dex(ctx, jar, out_dex_shards, deps)
9290
dex_files.append(out_dex_shards)
9391
return dex_files
9492

mobile_install/utils.bzl

Lines changed: 22 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -146,7 +146,7 @@ def host_jvm_path(ctx):
146146
"""
147147
return str(ctx.attr._host_java_runtime[java_common.JavaRuntimeInfo].java_executable_exec_path)
148148

149-
def dex(ctx, jar, out_dex_shards, deps = None, desugar = True):
149+
def dex(ctx, jar, out_dex_shards, deps = None):
150150
"""Desugar, dex and shard a Jar.
151151
152152
Args:
@@ -156,32 +156,41 @@ def dex(ctx, jar, out_dex_shards, deps = None, desugar = True):
156156
is given, will shard the Jar to Dex across all given files in a
157157
deterministic manner.
158158
deps: The list of dependencies for the Jar being desugared.
159-
desugar: A boolean that determines whether to apply desugaring.
160159
"""
161160
min_sdk = _min_sdk_version.get(ctx)
162161
args = ctx.actions.args()
163162
args.use_param_file(param_file_arg = "-flagfile=%s", use_always = True)
164-
if desugar:
165-
args.add("-desugar", ctx.executable._desugar_java8)
166-
args.add("-android_jar", first(ctx.files._android_sdk))
167-
if deps:
168-
args.add_joined("-classpath", deps, join_with = ",")
169-
args.add("-desugar_core_libs", "True")
163+
164+
args.add("-android_jar", first(ctx.files._android_sdk))
165+
if deps:
166+
args.add_joined("-classpath", deps, join_with = ",")
167+
args.add("-desugar_core_libs", "True")
170168

171169
# Unconditionally add -desugared_lib_config. This matches the behavior of tools/android/d8_desugar.sh.
172170
args.add("-desugared_lib_config", ctx.file._desugared_lib_config)
173171

174-
args.add("-dexbuilder", ctx.executable._dexbuilder)
175172
args.add("-min_sdk_version", min_sdk)
176173
args.add("-in", jar)
177174
args.add_joined("-out", out_dex_shards, join_with = ",")
178175

176+
java_runtime = ctx.attr._mi_host_javabase[java_common.JavaRuntimeInfo]
177+
java = java_runtime.java_executable_exec_path
178+
179+
# Performance-related JVM flags for the desugar tool.
180+
jvm_flags = [
181+
# b/71513487
182+
"-XX:+TieredCompilation",
183+
"-XX:TieredStopAtLevel=1",
184+
"-Xms8g",
185+
"-Xmx8g",
186+
]
187+
179188
ctx.actions.run(
180-
executable = ctx.executable._android_kit,
181-
arguments = ["dex", args],
182-
tools = [ctx.executable._desugar_java8, ctx.executable._dexbuilder],
189+
executable = java,
190+
tools = [ctx.executable._desugar_dex_sharding],
191+
arguments = jvm_flags + ["-jar", ctx.executable._desugar_dex_sharding.path, args],
183192
inputs = depset(
184-
ctx.files._android_sdk + [jar, ctx.file._desugared_lib_config],
193+
ctx.files._android_sdk + ctx.files._mi_host_javabase + [jar, ctx.file._desugared_lib_config],
185194
transitive = [deps] if deps else [],
186195
),
187196
outputs = out_dex_shards,

src/tools/java/com/google/devtools/build/android/BUILD

Lines changed: 56 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,8 @@ java_library(
106106
"CompatShellQuotedParamsFileProcessor.java",
107107
"AndroidDataBindingWrapper.java",
108108
"ProcessXmlOptionsWrapper.java",
109+
"DesugarDexShardingAction.java",
110+
"Fnv1a32bHash.java",
109111
],
110112
),
111113
javacopts = [
@@ -141,6 +143,29 @@ java_library(
141143
],
142144
)
143145

146+
java_library(
147+
name = "desugar_dex_sharding_lib",
148+
srcs = [
149+
"DesugarDexShardingAction.java",
150+
"Fnv1a32bHash.java",
151+
],
152+
deps = [
153+
":android_builder_lib",
154+
":zip_jar",
155+
"//src/tools/java/com/google/devtools/build/android/r8",
156+
"//src/tools/java/com/google/devtools/build/android/r8:constants",
157+
"@rules_android_maven//:com_beust_jcommander",
158+
"@rules_android_maven//:com_google_guava_guava",
159+
],
160+
)
161+
162+
java_binary(
163+
name = "DesugarDexShardingAction",
164+
main_class = "com.google.devtools.build.android.DesugarDexShardingAction",
165+
visibility = ["//visibility:public"],
166+
runtime_deps = [":desugar_dex_sharding_lib"],
167+
)
168+
144169
java_library(
145170
name = "dependency_info",
146171
srcs = ["DependencyInfo.java"],
@@ -155,8 +180,38 @@ run_singlejar(
155180
srcs = ["@android_tools//:all_android_tools_deploy.jar"],
156181
out = "android_common_exec.jar",
157182
include_prefixes = [
183+
"com/android/AndroidProjectTypes",
184+
"com/android/ProgressManagerAdapter",
185+
"com/android/SdkConstants",
186+
"com/android/Version",
187+
"com/android/annotations",
188+
"com/android/build/gradle",
189+
"com/android/builder",
190+
"com/android/ide",
191+
"com/android/io",
192+
"com/android/manifmerger",
193+
"com/android/repository",
194+
"com/android/resources",
195+
"com/android/signflinger",
196+
"com/android/tools/analytics/library/protos",
197+
"com/android/tools/analytics/library/shared",
198+
"com/android/tools/analytics/library/tracker",
199+
"com/android/tools/annotations",
200+
"com/android/tools/build/apksig",
201+
"com/android/tools/build/apkzlib",
202+
"com/android/tools/build/builder",
203+
"com/android/tools/build/builder/model",
204+
"com/android/tools/build/manifest/merger",
205+
"com/android/tools/common",
206+
"com/android/tools/ddms/ddmlib",
207+
"com/android/tools/dvlib",
208+
"com/android/tools/layoutlib/layoutlib/api",
209+
"com/android/tools/repository",
210+
"com/android/tools/sdk/common",
211+
"com/android/tools/sdklib",
212+
"com/android/utils",
213+
"com/android/zipflinger",
158214
"com/google/wireless/",
159-
"com/android/",
160215
],
161216
)
162217

0 commit comments

Comments
 (0)