Пример #1
0
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))
Пример #2
0
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)
Пример #3
0
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))
Пример #4
0
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)
Пример #5
0
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
Пример #6
0
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)
Пример #7
0
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)
Пример #8
0
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)
Пример #9
0
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)
Пример #10
0
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)
Пример #11
0
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)
Пример #12
0
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],
Пример #13
0
    '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)],
    },
  },
}