Source code

Revision control

Copy as Markdown

Other Tools

#!/usr/bin/env python3
#
# Copyright 2020 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.
import argparse
import os
import shutil
import subprocess
import sys
import zipfile
from util import build_utils
def _ParseArgs(args):
args = build_utils.ExpandFileArgs(args)
parser = argparse.ArgumentParser()
parser.add_argument('--output', required=True, help='Dex output path.')
parser.add_argument('--r8-path', required=True, help='Path to R8 jar.')
parser.add_argument(
'--desugar-jdk-libs-json', help='Path to desugar_jdk_libs.json.')
parser.add_argument(
'--desugar-jdk-libs-jar', help='Path to desugar_jdk_libs.jar.')
parser.add_argument('--desugar-jdk-libs-configuration-jar',
help='Path to desugar_jdk_libs_configuration.jar.')
parser.add_argument('--min-api', help='minSdkVersion', required=True)
parser.add_argument('--warnings-as-errors',
action='store_true',
help='Treat all warnings as errors.')
options = parser.parse_args(args)
return options
def DexJdkLibJar(r8_path,
min_api,
desugar_jdk_libs_json,
desugar_jdk_libs_jar,
desugar_jdk_libs_configuration_jar,
output,
warnings_as_errors,
config_paths=None):
# TODO(agrieve): Spews a lot of stderr about missing classes.
with build_utils.TempDir() as tmp_dir:
cmd = build_utils.JavaCmd(warnings_as_errors) + [
'-cp',
r8_path,
'com.android.tools.r8.L8',
'--min-api',
min_api,
'--lib',
build_utils.JAVA_HOME,
'--desugared-lib',
desugar_jdk_libs_json,
]
# If no desugaring is required, no keep rules are generated, and the keep
# file will not be created.
if config_paths is not None:
for path in config_paths:
cmd += ['--pg-conf', path]
cmd += [
'--output', tmp_dir, desugar_jdk_libs_jar,
desugar_jdk_libs_configuration_jar
]
build_utils.CheckOutput(cmd,
print_stdout=True,
fail_on_output=warnings_as_errors)
if os.path.exists(os.path.join(tmp_dir, 'classes2.dex')):
raise Exception('Achievement unlocked: desugar_jdk_libs is multidex!')
# classes.dex might not exists if the "desugar_jdk_libs_jar" is not used
# at all.
if os.path.exists(os.path.join(tmp_dir, 'classes.dex')):
shutil.move(os.path.join(tmp_dir, 'classes.dex'), output)
return True
return False
def main(args):
options = _ParseArgs(args)
DexJdkLibJar(options.r8_path, options.min_api, options.desugar_jdk_libs_json,
options.desugar_jdk_libs_jar,
options.desugar_jdk_libs_configuration_jar, options.output,
options.warnings_as_errors)
if __name__ == '__main__':
main(sys.argv[1:])