def Main(): (options, args) = parse_options() if options.golem: golem.link_third_party() with utils.TempDir() as temp: dex_path = os.path.join(temp, "classes.jar") proguard_conf = os.path.join(temp, 'proguard.conf') with open(proguard_conf, 'w') as f: f.write(PROGUARD_CONF) benchmark_jar = get_jar_for_benchmark(options.benchmark) r8_args = [ '--lib', utils.get_android_jar(26), # Only works with api 26 '--output', dex_path, '--pg-conf', proguard_conf, '--min-api', str(options.api), benchmark_jar ] toolhelper.run('r8', r8_args, build=not options.golem) if options.use_device: result = run_art_device(dex_path) else: result = run_art(dex_path) print('Kotlin_{}(RunTimeRaw): {} ms'.format(options.benchmark, result))
def RebuildAppWithShrinker(app, apk, apk_dest, proguard_config_file, shrinker, min_sdk, compile_sdk, options, temp_dir): assert 'r8' in shrinker assert apk_dest.endswith('.apk') print('Rebuilding {} with {}'.format(app, shrinker)) # Compile given APK with shrinker to temporary zip file. android_jar = utils.get_android_jar(compile_sdk) r8_jar = os.path.join(temp_dir, 'r8lib.jar' if IsMinifiedR8(shrinker) else 'r8.jar') zip_dest = apk_dest[:-4] + '.zip' # TODO(christofferqa): Entry point should be CompatProguard if the shrinker # is 'r8'. entry_point = 'com.android.tools.r8.R8' cmd = [ 'java', '-ea:com.android.tools.r8...', '-cp', r8_jar, entry_point, '--release', '--min-api', str(min_sdk), '--pg-conf', proguard_config_file, '--lib', android_jar, '--output', zip_dest, apk ] for android_optional_jar in utils.get_android_optional_jars(compile_sdk): cmd.append('--lib') cmd.append(android_optional_jar) utils.RunCmd(cmd, quiet=options.quiet) # Make a copy of the given APK, move the newly generated dex files into the # copied APK, and then sign the APK. apk_masseur.masseur(apk, dex=zip_dest, out=apk_dest, quiet=options.quiet)
def Main(): args = parse_arguments() if args.golem: golem.link_third_party() utils.check_java_version() with utils.TempDir() as temp_dir: cmd_prefix = [] output_dir = args.output if args.output else temp_dir temp_dir = os.path.join(args.output, 'tmp') if args.output else temp_dir track_memory_file = None if args.print_memoryuse: track_memory_file = os.path.join(output_dir, utils.MEMORY_USE_TMP_FILE) cmd_prefix.extend(['tools/track_memory.sh', track_memory_file]) name = 'CompileHelloExample' tool = args.tool output_mode = args.output_mode lib = None if output_mode == 'dex': name += 'Dex' lib = utils.get_android_jar(28) else: lib = utils.RT_JAR extra = [] if args.large: name += 'Large' extra = EXTRA_INPUTS if args.noopt: name += 'NoOpt' cmds = Compile( tool, output_mode, lib, extra, output_dir, args.noopt, temp_dir, ) t0 = time.time() for cmd in cmds: fullcmd = cmd_prefix + cmd utils.PrintCmd(fullcmd) subprocess.check_output(fullcmd) dt = time.time() - t0 if args.print_memoryuse: print('{}(MemoryUse): {}'.format( name, utils.grep_memoryuse(track_memory_file))) print('{}(RunTimeRaw): {} ms'.format(name, 1000.0 * dt))
def run_aapt_split_pack(aapt, api, app): with utils.ChangedWorkingDirectory(get_sample_dir(app)): args = [ 'package', '-v', '-f', '-I', utils.get_android_jar(api), '-M', 'split_manifest/AndroidManifest.xml', '-S', 'res', '-F', os.path.join(get_bin_path(app), 'split_resources.ap_') ] run_aapt(aapt, args)
def extract_lib_from_args(input_args): lib = None args = [] for arg in input_args: if arg == '--lib-android': lib = utils.get_android_jar(28) elif arg == '--lib-java': lib = utils.RT_JAR else: args.append(arg) return lib, args
def run_aapt_pack(aapt, api, app): with utils.ChangedWorkingDirectory(get_sample_dir(app)): args = [ 'package', '-v', '-f', '-I', utils.get_android_jar(api), '-M', 'AndroidManifest.xml', '-A', 'assets', '-S', 'res', '-m', '-J', get_gen_path(app), '-F', os.path.join(get_bin_path(app), 'resources.ap_'), '-G', os.path.join(get_build_dir(app), 'proguard_options') ] run_aapt(aapt, args)
def test_d8sample(paths): with utils.TempDir() as path: args = ['java', '-cp', '%s:%s' % (SAMPLE_JAR, ":".join(paths)), 'com.android.tools.apiusagesample.D8ApiUsageSample', '--output', path, '--min-api', str(API_LEVEL), '--lib', utils.get_android_jar(API_LEVEL), '--classpath', utils.R8_JAR, '--main-dex-list', '/dev/null', os.path.join(utils.BUILD, 'test/examples/hello.jar')] utils.PrintCmd(args) subprocess.check_call(args)
def compile_with_javac(api, app): with utils.ChangedWorkingDirectory(get_sample_dir(app)): files = glob.glob(SRC_LOCATION.format(app=app)) classpath = '%s:%s' % (utils.get_android_jar(api), get_guava_jar()) command = [ DEFAULT_JAVAC, '-classpath', classpath, '-sourcepath', '%s:%s:%s' % (get_src_path(app), get_gen_path(app), get_guava_jar()), '-d', get_bin_path(app) ] command.extend(files) utils.PrintCmd(command) subprocess.check_call(command)
def RebuildAppWithShrinker( app, apk, apk_dest, proguard_config_file, shrinker, min_sdk, compile_sdk, options, temp_dir, main_dex_rules): assert 'r8' in shrinker assert apk_dest.endswith('.apk') print('Rebuilding {} with {}'.format(app.name, shrinker)) # Compile given APK with shrinker to temporary zip file. android_jar = utils.get_android_jar(compile_sdk) r8_jar = os.path.join( temp_dir, 'r8lib.jar' if IsMinifiedR8(shrinker) else 'r8.jar') zip_dest = apk_dest[:-4] + '.zip' # TODO(christofferqa): Entry point should be CompatProguard if the shrinker # is 'r8'. entry_point = 'com.android.tools.r8.R8' cmd = ([jdk.GetJavaExecutable()] + (['-ea:com.android.tools.r8...'] if not options.disable_assertions else []) + ['-cp', r8_jar, entry_point, '--release', '--min-api', str(min_sdk), '--pg-conf', proguard_config_file, '--lib', android_jar, '--output', zip_dest, apk] + (['--no-desugaring'] if app.legacy_desugaring or app.compatibility == '1.7' else [])) for android_optional_jar in utils.get_android_optional_jars(compile_sdk): cmd.append('--lib') cmd.append(android_optional_jar) if main_dex_rules: cmd.append('--main-dex-rules') cmd.append(main_dex_rules) utils.RunCmd( cmd, quiet=options.quiet, logging=IsLoggingEnabledFor(app, options)) # Make a copy of the given APK, move the newly generated dex files into the # copied APK, and then sign the APK. apk_masseur.masseur( apk, dex=zip_dest, resources='META-INF/services/*', out=apk_dest, quiet=options.quiet, logging=IsLoggingEnabledFor(app, options), keystore=options.keystore)
def test_r8command(paths): with utils.TempDir() as path: # SAMPLE_JAR and LIB_JAR should not have any classes in common, since e.g. # R8CommandParser should have been minified in LIB_JAR. # Just in case R8CommandParser is also present in LIB_JAR, we put # SAMPLE_JAR first on the classpath to use its version of R8CommandParser. args = ['java', '-cp', '%s:%s' % (SAMPLE_JAR, ":".join(paths)), 'com.android.tools.r8.R8CommandParser', '--output', path + "/output.zip", '--min-api', str(API_LEVEL), '--lib', utils.get_android_jar(API_LEVEL), '--main-dex-list', '/dev/null', os.path.join(utils.BUILD, 'test/examples/hello.jar')] utils.PrintCmd(args) subprocess.check_call(args)
def dex(app, api): files = [] for root, dirnames, filenames in os.walk(get_bin_path(app)): for filename in fnmatch.filter(filenames, '*.class'): files.append(os.path.join(root, filename)) command = [ DEFAULT_D8, '--output', get_bin_path(app), '--classpath', utils.get_android_jar(api), '--min-api', str(api) ] command.extend(files) command.append(get_guava_jar()) utils.PrintCmd(command) subprocess.check_call(command)
import glob import os import utils ANDROID_L_API = '21' BASE = os.path.join(utils.THIRD_PARTY, 'gmail') V170604_16_BASE = os.path.join(BASE, 'gmail_android_170604.16') V170604_16_PREFIX = os.path.join(V170604_16_BASE, 'Gmail_release_unstripped') V180826_15_BASE = os.path.join(BASE, 'gmail_android_180826.15') V180826_15_PREFIX = os.path.join(V180826_15_BASE, 'Gmail_release_unstripped') # NOTE: We always use android.jar for SDK v25 for now. ANDROID_JAR = utils.get_android_jar(25) VERSIONS = { '170604.16': { 'dex': { 'inputs': [os.path.join(V170604_16_BASE, 'Gmail_release_unsigned.apk')], 'pgmap': '%s_proguard.map' % V170604_16_PREFIX, 'libraries': [ANDROID_JAR], }, 'deploy': { 'inputs': ['%s_deploy.jar' % V170604_16_PREFIX], 'pgconf': ['%s_proguard.config' % V170604_16_PREFIX], }, 'proguarded': { 'inputs': ['%s_proguard.jar' % V170604_16_PREFIX],
'cb7e7d424e289578c115667747b262cd.jar', '0ed7d992c263060a704a951b53ac0bbb.jar', '6a495a5466b08b8e825e78918680b946.jar', '7c3656acf184f5103c65f49acad46981.jar', 'classes_0.jar', '47bbfe33b04bd140773a33c708d5df34.jar', 'grpc-core-1.21.0.jar', 'collection-1.1.0.jar', 'programclasses.jar', '592c92d42c935f46f0e50e988310a94b.jar', 'constraintlayout-solver-1.1.3.jar', 'protobuf-lite-3.0.1.jar', '309d47704a456783a746357a53f76ed9.jar', 'kotlin-stdlib-jdk7-1.3.41.jar', 'e47b3993e1f3cb81b6a13a44a60edc7d.jar', 'classes.jar', 'e9385c983e864be1243e1865c529f2ba.jar', 'okio-1.15.0.jar', '492c0eca59ede4f2e0dd149bb44e0c5a.jar', ] VERSIONS = { '2019': { 'deploy' : { 'inputs': [os.path.join(BASE, path) for path in INPUT_JARS], 'pgconf': [os.path.join(BASE, 'proguard-rules.pro')], 'libraries': [utils.get_android_jar(28)], }, }, }