Commit 1a159a00 authored by zpeng's avatar zpeng Committed by Commit Bot

Update experimental Java 8 support to use Desugar instead of Retrolambda

Our experiments show that Desugar, a Google-developed open-source tool,
outperforms Retrolambda in both APK sizes and Java method counts. This
CL replaces Retrolambda with Desugar in our experimental Java 8 support.

BUG=730711

Review-Url: https://codereview.chromium.org/2985523002
Cr-Commit-Position: refs/heads/master@{#491183}
parent baca0c48
...@@ -1056,16 +1056,6 @@ hooks_os = { ...@@ -1056,16 +1056,6 @@ hooks_os = {
'-l', 'third_party/ow2_asm' '-l', 'third_party/ow2_asm'
], ],
}, },
{
'name': 'retrolambda',
'pattern': '.',
'action': ['python',
'src/build/android/update_deps/update_third_party_deps.py',
'download',
'-b', 'chromium-android-tools/retrolambda',
'-l', 'third_party/retrolambda'
],
},
{ {
'name': 'desugar', 'name': 'desugar',
'pattern': '.', 'pattern': '.',
......
#!/usr/bin/env python #!/usr/bin/env python
# #
# Copyright 2016 The Chromium Authors. All rights reserved. # Copyright 2017 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be # Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file. # found in the LICENSE file.
...@@ -15,26 +15,29 @@ from util import build_utils ...@@ -15,26 +15,29 @@ from util import build_utils
_SRC_ROOT = os.path.abspath(os.path.join(os.path.dirname(__file__), _SRC_ROOT = os.path.abspath(os.path.join(os.path.dirname(__file__),
'..', '..', '..')) '..', '..', '..'))
_RETROLAMBDA_JAR_PATH = os.path.normpath(os.path.join( _DESUGAR_JAR_PATH = os.path.normpath(os.path.join(
_SRC_ROOT, 'third_party', 'retrolambda', 'retrolambda-2.5.1.jar')) _SRC_ROOT, 'third_party', 'bazel', 'desugar', 'Desugar.jar'))
def _OnStaleMd5(input_jar, output_jar, classpath, android_sdk_jar): def _OnStaleMd5(input_jar, output_jar, classpath, bootclasspath_entry):
with build_utils.TempDir() as temp_dir: cmd = [
build_utils.ExtractAll(input_jar, path=temp_dir) 'java',
cmd = [ '-jar',
'java', _DESUGAR_JAR_PATH,
'-Dretrolambda.inputDir=' + temp_dir, '--input',
'-Dretrolambda.classpath=' + input_jar,
':'.join([temp_dir] + classpath + [android_sdk_jar]), '--bootclasspath_entry',
'-javaagent:' + _RETROLAMBDA_JAR_PATH, bootclasspath_entry,
'-jar', '--output',
_RETROLAMBDA_JAR_PATH, output_jar,
] # Disable try-with-resources due to proguard duplicate zip entry error
# TODO(zpeng): Enable try-with-resources with
build_utils.CheckOutput(cmd, print_stdout=False) # desugar_try_with_resources_omit_runtime_classes
build_utils.ZipDir(output_jar + '.tmp', temp_dir) '--desugar_try_with_resources_if_needed=false',
shutil.move(output_jar + '.tmp', output_jar) ]
for path in classpath:
cmd += ['--classpath_entry', path]
build_utils.CheckOutput(cmd, print_stdout=False)
def main(): def main():
...@@ -47,21 +50,26 @@ def main(): ...@@ -47,21 +50,26 @@ def main():
help='Jar output path.') help='Jar output path.')
parser.add_argument('--classpath', required=True, parser.add_argument('--classpath', required=True,
help='Classpath.') help='Classpath.')
parser.add_argument('--android-sdk-jar', required=True, parser.add_argument('--bootclasspath-entry', required=True,
help='Android sdk jar path.') help='Path to javac bootclasspath interface jar.')
options = parser.parse_args(args) options = parser.parse_args(args)
options.classpath = build_utils.ParseGnList(options.classpath) options.classpath = build_utils.ParseGnList(options.classpath)
input_paths = options.classpath + [options.input_jar] input_paths = options.classpath + [
options.bootclasspath_entry,
options.input_jar,
]
output_paths = [options.output_jar] output_paths = [options.output_jar]
depfile_deps = options.classpath + [_DESUGAR_JAR_PATH]
build_utils.CallAndWriteDepfileIfStale( build_utils.CallAndWriteDepfileIfStale(
lambda: _OnStaleMd5(options.input_jar, options.output_jar, lambda: _OnStaleMd5(options.input_jar, options.output_jar,
options.classpath, options.android_sdk_jar), options.classpath, options.bootclasspath_entry),
options, options,
input_paths=input_paths, input_paths=input_paths,
input_strings=[], input_strings=[],
output_paths=output_paths) output_paths=output_paths,
depfile_deps=depfile_deps)
if __name__ == '__main__': if __name__ == '__main__':
......
...@@ -169,8 +169,8 @@ if (is_android) { ...@@ -169,8 +169,8 @@ if (is_android) {
# abi in 64-bit Monochrome and WebView. # abi in 64-bit Monochrome and WebView.
build_apk_secondary_abi = true build_apk_secondary_abi = true
# Enables java8 language features (via retrolambda). # Enables java8 language features (via Desugar).
# work-in-progress (http://crbug.com/642600) # work-in-progress (http://crbug.com/730711)
use_java8 = false use_java8 = false
# Build incremental targets whenever possible. # Build incremental targets whenever possible.
......
...@@ -1190,10 +1190,10 @@ if (enable_java_templates) { ...@@ -1190,10 +1190,10 @@ if (enable_java_templates) {
defined(invoker.supports_android) && invoker.supports_android && defined(invoker.supports_android) && invoker.supports_android &&
(is_java_debug || dcheck_always_on) (is_java_debug || dcheck_always_on)
_retrolambda = _desugar =
defined(invoker.supports_android) && invoker.supports_android && defined(invoker.supports_android) && invoker.supports_android &&
((defined(invoker.process_java8) && invoker.process_java8) || use_java8) ((defined(invoker.process_java8) && invoker.process_java8) || use_java8)
_deps = [] _deps = []
_previous_output_jar = _input_jar_path _previous_output_jar = _input_jar_path
...@@ -1269,14 +1269,17 @@ if (enable_java_templates) { ...@@ -1269,14 +1269,17 @@ if (enable_java_templates) {
_previous_output_jar = _assert_output_jar _previous_output_jar = _assert_output_jar
} }
if (_retrolambda) { assert(!defined(invoker.alternative_android_sdk_ijar) ||
_retrolambda_target = "${target_name}__retrolambda" invoker.alternative_android_sdk_ijar != "")
_retrolambda_input_jar = _previous_output_jar assert(!defined(invoker.alternative_android_sdk_ijar_dep) ||
_retrolambda_output_jar = "$target_out_dir/$target_name-retrolambda.jar" invoker.alternative_android_sdk_ijar_dep != "")
if (_desugar) {
_desugar_target = "${target_name}__desugar"
_desugar_input_jar = _previous_output_jar
_desugar_output_jar = "$target_out_dir/$target_name-desugar.jar"
android_sdk_jar = "$android_sdk/android.jar" action(_desugar_target) {
action(_retrolambda_target) { script = "//build/android/gyp/desugar.py"
script = "//build/android/gyp/retrolambda.py"
deps = _deps deps = _deps
if (defined(invoker.deps)) { if (defined(invoker.deps)) {
deps += invoker.deps deps += invoker.deps
...@@ -1286,27 +1289,35 @@ if (enable_java_templates) { ...@@ -1286,27 +1289,35 @@ if (enable_java_templates) {
} }
inputs = [ inputs = [
_build_config, _build_config,
_retrolambda_input_jar, _desugar_input_jar,
] ]
outputs = [ outputs = [
_retrolambda_output_jar, _desugar_output_jar,
] ]
if (defined(invoker.alternative_android_sdk_ijar)) {
deps += [ invoker.alternative_android_sdk_ijar_dep ]
_android_sdk_ijar = invoker.alternative_android_sdk_ijar
} else {
deps += [ "//build/android:android_ijar" ]
_android_sdk_ijar = "$root_out_dir/lib.java/android.interface.jar"
}
inputs += [ _android_sdk_ijar ]
args = [ args = [
"--input-jar", "--input-jar",
rebase_path(_retrolambda_input_jar, root_build_dir), rebase_path(_desugar_input_jar, root_build_dir),
"--output-jar", "--output-jar",
rebase_path(_retrolambda_output_jar, root_build_dir), rebase_path(_desugar_output_jar, root_build_dir),
"--classpath=@FileArg($_rebased_build_config:javac:classpath)", "--classpath=@FileArg($_rebased_build_config:javac:classpath)",
"--android-sdk-jar", "--bootclasspath-entry",
rebase_path(android_sdk_jar, root_build_dir), rebase_path(_android_sdk_ijar, root_build_dir),
] ]
} }
_deps = [] _deps = []
_deps = [ ":$_retrolambda_target" ] _deps = [ ":$_desugar_target" ]
_previous_output_jar = _retrolambda_output_jar _previous_output_jar = _desugar_output_jar
} }
_output_jar_target = "${target_name}__copy" _output_jar_target = "${target_name}__copy"
copy(_output_jar_target) { copy(_output_jar_target) {
deps = _deps deps = _deps
...@@ -2053,8 +2064,8 @@ if (enable_java_templates) { ...@@ -2053,8 +2064,8 @@ if (enable_java_templates) {
forward_variables_from(invoker, forward_variables_from(invoker,
[ [
"jar_excluded_patterns", "jar_excluded_patterns",
"strip_resource_classes",
"process_java8", "process_java8",
"strip_resource_classes",
]) ])
visibility = [ visibility = [
...@@ -2346,7 +2357,12 @@ if (enable_java_templates) { ...@@ -2346,7 +2357,12 @@ if (enable_java_templates) {
} }
process_java_prebuilt(_process_prebuilt_target_name) { process_java_prebuilt(_process_prebuilt_target_name) {
forward_variables_from(invoker, [ "jar_excluded_patterns" ]) forward_variables_from(invoker,
[
"alternative_android_sdk_ijar",
"alternative_android_sdk_ijar_dep",
"jar_excluded_patterns",
])
supports_android = _supports_android supports_android = _supports_android
build_config = _build_config build_config = _build_config
input_jar_path = _javac_jar_path input_jar_path = _javac_jar_path
......
...@@ -158,7 +158,6 @@ ...@@ -158,7 +158,6 @@
/pywebsocket/src /pywebsocket/src
/re2/src /re2/src
/requests/src /requests/src
/retrolambda/*.jar
/robolectric/lib/android-all-4.3_r2-robolectric-0.jar /robolectric/lib/android-all-4.3_r2-robolectric-0.jar
/robolectric/lib/android-all-5.0.0_r2-robolectric-1.jar /robolectric/lib/android-all-5.0.0_r2-robolectric-1.jar
/robolectric/lib/android-all-7.1.0_r7-robolectric-0.jar /robolectric/lib/android-all-7.1.0_r7-robolectric-0.jar
......
This diff is collapsed.
agrieve@chromium.org
zpeng@chromium.org
# COMPONENT: Build
Name: Retrolambda, backport of Java 8's lambda expressions to Java 7, 6, 5
Short Name: retrolambda
URL: https://github.com/orfjackal/retrolambda/
Version: 2.5.1
License: Apache 2.0
License File: NOT_SHIPPED
Security Critical: no
Description:
Retrolambda is a Java library used by the build process to transform Java 8's
bytecode to Java 7's bytecode. It is used to enable Java 8 features such as
lambda expressions for Chrome on Android without switching from javac to Jack.
Local Modifications:
None
Update instructions (requires @google.com account):
- Download jar from Maven Central
http://central.maven.org/maven2/net/orfjackal/retrolambda/retrolambda
- Modify build/android/gyp/retrolambda.py and verify the new jar works
- Remove existing SHA1 file
- If gcloud auth tokens are not set up, run
$ download_from_google_storage --config
- Upload new jar to gcloud. In third_party/retrolambda, run
$ upload_to_google_storage.py -b chromium-android-tools/retrolambda {new_jar}
03db6629d3ba0168c580af3be44fe54014dfb105
\ No newline at end of file
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment