blob: 1e2cffd047f356a87272f9d5d04a4e55bf0c435a [file] [log] [blame]
#!/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.
import optparse
import os
import subprocess
import sys
import utils
LINUX_DIR = os.path.join(utils.TOOLS_DIR, 'linux')
VERSIONS = [
'default',
'7.0.0',
'6.0.1',
'5.1.1',
]
DIRS = {
'default': 'art',
'7.0.0': 'art-7.0.0',
'6.0.1': 'art-6.0.1',
'5.1.1': 'art-5.1.1',
}
PRODUCTS = {
'default': 'angler',
'7.0.0': 'angler',
'6.0.1': 'angler',
'5.1.1': 'mako',
}
ARCHS = {
'default': 'arm64',
'7.0.0': 'arm64',
'6.0.1': 'arm64',
'5.1.1': 'arm',
}
def ParseOptions():
parser = optparse.OptionParser()
parser.add_option('--version',
help='Version of dex2oat. (defaults to latest, eg, tools/linux/art).',
choices=VERSIONS,
default='default')
parser.add_option('--all',
help='Run dex2oat on all possible versions',
default=False,
action='store_true')
parser.add_option('--output',
help='Where to place the output oat (defaults to no output / temp file).',
default=None)
return parser.parse_args()
def Main():
(options, args) = ParseOptions()
if len(args) != 1:
print "Can only take a single dex/zip/jar/apk file as input."
return 1
if options.all and options.output:
print "Can't write output when running all versions."
return 1
dexfile = args[0]
oatfile = options.output
versions = VERSIONS if options.all else [options.version]
for version in versions:
run(dexfile, oatfile, version)
print
return 0
def run(dexfile, oatfile=None, version='default'):
# dex2oat accepts non-existent dex files, check here instead
if not os.path.exists(dexfile):
raise Exception('DEX file not found: "{}"'.format(dexfile))
with utils.TempDir() as temp:
if not oatfile:
oatfile = os.path.join(temp, "out.oat")
base = os.path.join(LINUX_DIR, DIRS[version])
product = PRODUCTS[version]
arch = ARCHS[version]
cmd = [
os.path.join(base, 'bin', 'dex2oat'),
'--android-root=' + os.path.join(base, 'product', product, 'system'),
'--runtime-arg',
'-Xnorelocate',
'--dex-file=' + dexfile,
'--oat-file=' + oatfile,
'--instruction-set=' + arch,
]
env = {"LD_LIBRARY_PATH": os.path.join(base, 'lib')}
utils.PrintCmd(cmd)
subprocess.check_call(cmd, env = env)
if __name__ == '__main__':
sys.exit(Main())