| #!/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:]) |