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 = {
'-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',
'pattern': '.',
......
#!/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
# found in the LICENSE file.
......@@ -15,26 +15,29 @@ from util import build_utils
_SRC_ROOT = os.path.abspath(os.path.join(os.path.dirname(__file__),
'..', '..', '..'))
_RETROLAMBDA_JAR_PATH = os.path.normpath(os.path.join(
_SRC_ROOT, 'third_party', 'retrolambda', 'retrolambda-2.5.1.jar'))
_DESUGAR_JAR_PATH = os.path.normpath(os.path.join(
_SRC_ROOT, 'third_party', 'bazel', 'desugar', 'Desugar.jar'))
def _OnStaleMd5(input_jar, output_jar, classpath, android_sdk_jar):
with build_utils.TempDir() as temp_dir:
build_utils.ExtractAll(input_jar, path=temp_dir)
def _OnStaleMd5(input_jar, output_jar, classpath, bootclasspath_entry):
cmd = [
'java',
'-Dretrolambda.inputDir=' + temp_dir,
'-Dretrolambda.classpath=' +
':'.join([temp_dir] + classpath + [android_sdk_jar]),
'-javaagent:' + _RETROLAMBDA_JAR_PATH,
'-jar',
_RETROLAMBDA_JAR_PATH,
_DESUGAR_JAR_PATH,
'--input',
input_jar,
'--bootclasspath_entry',
bootclasspath_entry,
'--output',
output_jar,
# Disable try-with-resources due to proguard duplicate zip entry error
# TODO(zpeng): Enable try-with-resources with
# desugar_try_with_resources_omit_runtime_classes
'--desugar_try_with_resources_if_needed=false',
]
for path in classpath:
cmd += ['--classpath_entry', path]
build_utils.CheckOutput(cmd, print_stdout=False)
build_utils.ZipDir(output_jar + '.tmp', temp_dir)
shutil.move(output_jar + '.tmp', output_jar)
def main():
......@@ -47,21 +50,26 @@ def main():
help='Jar output path.')
parser.add_argument('--classpath', required=True,
help='Classpath.')
parser.add_argument('--android-sdk-jar', required=True,
help='Android sdk jar path.')
parser.add_argument('--bootclasspath-entry', required=True,
help='Path to javac bootclasspath interface jar.')
options = parser.parse_args(args)
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]
depfile_deps = options.classpath + [_DESUGAR_JAR_PATH]
build_utils.CallAndWriteDepfileIfStale(
lambda: _OnStaleMd5(options.input_jar, options.output_jar,
options.classpath, options.android_sdk_jar),
options.classpath, options.bootclasspath_entry),
options,
input_paths=input_paths,
input_strings=[],
output_paths=output_paths)
output_paths=output_paths,
depfile_deps=depfile_deps)
if __name__ == '__main__':
......
......@@ -169,8 +169,8 @@ if (is_android) {
# abi in 64-bit Monochrome and WebView.
build_apk_secondary_abi = true
# Enables java8 language features (via retrolambda).
# work-in-progress (http://crbug.com/642600)
# Enables java8 language features (via Desugar).
# work-in-progress (http://crbug.com/730711)
use_java8 = false
# Build incremental targets whenever possible.
......
......@@ -1190,7 +1190,7 @@ if (enable_java_templates) {
defined(invoker.supports_android) && invoker.supports_android &&
(is_java_debug || dcheck_always_on)
_retrolambda =
_desugar =
defined(invoker.supports_android) && invoker.supports_android &&
((defined(invoker.process_java8) && invoker.process_java8) || use_java8)
......@@ -1269,14 +1269,17 @@ if (enable_java_templates) {
_previous_output_jar = _assert_output_jar
}
if (_retrolambda) {
_retrolambda_target = "${target_name}__retrolambda"
_retrolambda_input_jar = _previous_output_jar
_retrolambda_output_jar = "$target_out_dir/$target_name-retrolambda.jar"
assert(!defined(invoker.alternative_android_sdk_ijar) ||
invoker.alternative_android_sdk_ijar != "")
assert(!defined(invoker.alternative_android_sdk_ijar_dep) ||
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(_retrolambda_target) {
script = "//build/android/gyp/retrolambda.py"
action(_desugar_target) {
script = "//build/android/gyp/desugar.py"
deps = _deps
if (defined(invoker.deps)) {
deps += invoker.deps
......@@ -1286,25 +1289,33 @@ if (enable_java_templates) {
}
inputs = [
_build_config,
_retrolambda_input_jar,
_desugar_input_jar,
]
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 = [
"--input-jar",
rebase_path(_retrolambda_input_jar, root_build_dir),
rebase_path(_desugar_input_jar, root_build_dir),
"--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)",
"--android-sdk-jar",
rebase_path(android_sdk_jar, root_build_dir),
"--bootclasspath-entry",
rebase_path(_android_sdk_ijar, root_build_dir),
]
}
_deps = []
_deps = [ ":$_retrolambda_target" ]
_previous_output_jar = _retrolambda_output_jar
_deps = [ ":$_desugar_target" ]
_previous_output_jar = _desugar_output_jar
}
_output_jar_target = "${target_name}__copy"
......@@ -2053,8 +2064,8 @@ if (enable_java_templates) {
forward_variables_from(invoker,
[
"jar_excluded_patterns",
"strip_resource_classes",
"process_java8",
"strip_resource_classes",
])
visibility = [
......@@ -2346,7 +2357,12 @@ if (enable_java_templates) {
}
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
build_config = _build_config
input_jar_path = _javac_jar_path
......
......@@ -158,7 +158,6 @@
/pywebsocket/src
/re2/src
/requests/src
/retrolambda/*.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-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