| #!/usr/bin/env python | |
| # Copyright (c) 2018, the R8 project authors. Please see the AUTHORS file | |
| # for details. All rights reserved. Use of this source code is governed by a | |
| # BSD-style license that can be found in the LICENSE file. | |
| ''' | |
| Compare the R8 API used by the API usage sample to the API kept by @Keep. | |
| ''' | |
| import argparse | |
| import jdk | |
| import os | |
| import subprocess | |
| import utils | |
| parser = argparse.ArgumentParser(description=__doc__.strip(), | |
| formatter_class=argparse.RawTextHelpFormatter) | |
| parser.add_argument('-o', '--output-dir') | |
| API_SAMPLE_JAR = 'tests/d8_api_usage_sample.jar' | |
| def main(output_dir=None): | |
| if output_dir is None: | |
| output_dir = '' | |
| javaExecutable = jdk.GetJavaExecutable() | |
| printseeds_path = os.path.join(output_dir, 'keep-seeds.txt') | |
| printseeds_args = [ | |
| javaExecutable, '-jar', utils.R8_JAR, 'printseeds', | |
| utils.RT_JAR, utils.R8_JAR, utils.R8LIB_KEEP_RULES, | |
| ] | |
| write_sorted_lines(printseeds_args, printseeds_path) | |
| printuses_path = os.path.join(output_dir, 'sample-uses.txt') | |
| printuses_args = [ | |
| javaExecutable, '-jar', utils.R8_JAR, 'printuses', | |
| utils.RT_JAR, utils.R8_JAR, API_SAMPLE_JAR, | |
| ] | |
| write_sorted_lines(printuses_args, printuses_path) | |
| print_diff(printseeds_path, printuses_path) | |
| def write_sorted_lines(cmd_args, output_path): | |
| utils.PrintCmd(cmd_args) | |
| output_lines = subprocess.check_output(cmd_args).splitlines(True) | |
| print("Write output to %s" % output_path) | |
| output_lines.sort() | |
| with open(output_path, 'w') as fp: | |
| for line in output_lines: | |
| fp.write(line) | |
| def print_diff(printseeds_path, printuses_path): | |
| with open(printseeds_path) as fp: | |
| seeds = set(fp.read().splitlines()) | |
| with open(printuses_path) as fp: | |
| uses = set(fp.read().splitlines()) | |
| only_in_seeds = seeds - uses | |
| only_in_uses = uses - seeds | |
| if only_in_seeds: | |
| print("%s lines with '-' are marked @Keep " % len(only_in_seeds) + | |
| "but not used by sample.") | |
| if only_in_uses: | |
| print("%s lines with '+' are used by sample " % len(only_in_uses) + | |
| "but are missing @Keep annotations.") | |
| for line in sorted(only_in_seeds): | |
| print('-' + line) | |
| for line in sorted(only_in_uses): | |
| print('+' + line) | |
| if not only_in_seeds and not only_in_uses: | |
| print('Sample uses the entire set of members marked @Keep. Well done!') | |
| if __name__ == '__main__': | |
| main(**vars(parser.parse_args())) |