| #!/usr/bin/env python3 |
| # Copyright (c) 2026, 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. |
| |
| import argparse |
| import os |
| import subprocess |
| import sys |
| |
| import gradle |
| import jdk |
| import utils |
| |
| |
| def parse_options(argv): |
| parser = argparse.ArgumentParser( |
| description='Print unique strings in APK string pools.') |
| parser.add_argument('apk', help='Path to the APK to analyze') |
| parser.add_argument('--no-build', |
| '--no_build', |
| help='Run without building first (default false)', |
| default=False, |
| action='store_true') |
| return parser.parse_args(argv) |
| |
| |
| def main(argv): |
| options = parse_options(argv) |
| |
| if not options.no_build: |
| gradle.run_gradle(['r8', ':tools:jar']) |
| |
| if not os.path.exists(utils.R8_JAR): |
| print( |
| f"Error: Could not find {utils.R8_JAR}. Build failed or --no-build was specified incorrectly." |
| ) |
| return 1 |
| if not os.path.exists(utils.TOOLS_JAR): |
| print( |
| f"Error: Could not find {utils.TOOLS_JAR}. Build failed or --no-build was specified incorrectly." |
| ) |
| return 1 |
| |
| java = jdk.GetJavaExecutable(jdk.GetDefaultJdkHome()) |
| classpath = [utils.TOOLS_JAR, utils.R8_JAR] |
| |
| cmd = [ |
| java, '-cp', |
| os.pathsep.join(classpath), |
| 'com.android.tools.r8.tools.dex.StringConstantPoolPrinter', options.apk |
| ] |
| |
| res = subprocess.run(cmd) |
| return res.returncode |
| |
| |
| if __name__ == '__main__': |
| sys.exit(main(sys.argv[1:])) |