waflib: android: build-tools 27 support

This commit is contained in:
Alibek Omarov 2019-05-10 03:14:42 +03:00
parent c7b1f28590
commit af9a759e9a

View file

@ -16,12 +16,15 @@ def options(opt):
def add_paths_to_path(paths): def add_paths_to_path(paths):
save_path = os.environ['PATH'] save_path = os.environ['PATH']
os.environ['PATH'] = os.pathsep.join(paths) + os.pathsep + save_path os.environ['PATH'] = os.pathsep.join(paths) + os.pathsep + save_path
def get_latest_build_tools(sdk): def get_latest_build_tools_version(sdk):
build_tools_path = os.path.join(sdk, 'build-tools') build_tools_path = os.path.join(sdk, 'build-tools')
dirs = os.listdir(build_tools_path) dirs = os.listdir(build_tools_path)
dirs.sort(reverse=True) dirs.sort(reverse=True)
return os.path.join(build_tools_path, dirs[0]) return dirs[0]
def get_build_tools(sdk, ver):
return os.path.join(sdk, 'build-tools', ver)
def configure(conf): def configure(conf):
conf.load('java') conf.load('java')
@ -39,15 +42,27 @@ def configure(conf):
conf.end_msg('ok') conf.end_msg('ok')
paths = [ os.path.join(conf.env.ANDROID_SDK_HOME_ENV, 'tools'), get_latest_build_tools(sdk) ] btv = get_latest_build_tools_version(sdk)
conf.msg('Detected build-tools version', btv)
paths = [os.path.join(sdk, 'tools'), get_build_tools(sdk, btv)]
paths += os.environ['PATH'].split(os.pathsep) # just in case we have installed tools paths += os.environ['PATH'].split(os.pathsep) # just in case we have installed tools
for i in ['aapt2', 'd8', 'zipalign', 'apksigner']: conf.env.BUILD_TOOLS_VERSION = map(int, btv.split('.'))
# mandatory
for i in ['aapt2', 'zipalign', 'apksigner', 'zip']:
conf.find_program(i, path_list = paths) conf.find_program(i, path_list = paths)
conf.find_program('zip')
# optional
try:
conf.find_program('d8', path_list = paths)
except:
conf.find_program('dx', path_list = paths)
# TODO: AAPT legacy support # TODO: AAPT legacy support
# TODO: dx support
class aapt2compile(javaw.JTask): class aapt2compile(javaw.JTask):
color = 'GREEN' color = 'GREEN'
@ -84,7 +99,7 @@ class aapt2compile(javaw.JTask):
class aapt2link(javaw.JTask): class aapt2link(javaw.JTask):
color = 'GREEN' # android green :) color = 'GREEN' # android green :)
run_str = '${AAPT2} link -v --allow-reserved-package-id -o ${OUTAPK_UNALIGNED_NOCLASSES_NOJNI} -A ${ASSETSDIR} --manifest ${MANIFEST} --java ${OUTRDIR} -I ${CLASSPATH_ANDROID} ${SRC}' run_str = '${AAPT2} link -v ${AAPT2_LINKFLAGS} -o ${OUTAPK_UNALIGNED_NOCLASSES_NOJNI} -A ${ASSETSDIR} --manifest ${MANIFEST} --java ${OUTRDIR} -I ${CLASSPATH_ANDROID} ${SRC}'
vars = ['AAPT2', 'OUTAPK_UNALIGNED_NOCLASSES_NOJNI', 'ASSETSDIR', 'MANIFEST', 'OUTRDIR', 'CLASSPATH_ANDROID'] vars = ['AAPT2', 'OUTAPK_UNALIGNED_NOCLASSES_NOJNI', 'ASSETSDIR', 'MANIFEST', 'OUTRDIR', 'CLASSPATH_ANDROID']
def runnable_status(self): def runnable_status(self):
@ -123,6 +138,22 @@ class d8(javaw.JTask):
self.outputs = [ self.generator.outdir.make_node('classes.dex') ] self.outputs = [ self.generator.outdir.make_node('classes.dex') ]
return super(d8, self).runnable_status() return super(d8, self).runnable_status()
class dx(javaw.JTask):
color = 'GREEN' # Android green :)
run_str = '${DX} --dex ${D8_FLAGS} --output=${OUTDIR}/classes.dex ${SRC} ${DX_CLASSPATH}'
vars = ['DX', 'D8_FLAGS', 'OUTDIR']
def runnable_status(self):
for t in self.run_after:
if not t.hasrun:
return Task.ASK_LATER
if not self.inputs:
self.inputs = self.generator.outdir.ant_glob('**/*.class', quiet=True)
self.outputs = [ self.generator.outdir.make_node('classes.dex') ]
return super(dx, self).runnable_status()
def javac(func): def javac(func):
old_runnable_status = getattr(javaw.javac, 'runnable_status', None) old_runnable_status = getattr(javaw.javac, 'runnable_status', None)
setattr(javaw.javac, 'old_runnable_status', old_runnable_status) setattr(javaw.javac, 'old_runnable_status', old_runnable_status)
@ -139,7 +170,7 @@ class apkjni(Task.Task):
color = 'BLUE' color = 'BLUE'
run_str = '${ZIP} ${OUTAPK_UNALIGNED_NOCLASSES_NOJNI} --out ${OUTAPK_UNALIGNED_NOCLASSES} && ${ZIP} -ru ${OUTAPK_UNALIGNED_NOCLASSES} ${JNIDIR}' run_str = '${ZIP} ${OUTAPK_UNALIGNED_NOCLASSES_NOJNI} --out ${OUTAPK_UNALIGNED_NOCLASSES} && ${ZIP} -ru ${OUTAPK_UNALIGNED_NOCLASSES} ${JNIDIR}'
vars = ['ZIP', 'JNIDIR', 'OUTAPK_UNALIGNED_NOCLASSES_NOJNI', 'OUTAPK_UNALIGNED_NOCLASSES'] vars = ['ZIP', 'JNIDIR', 'OUTAPK_UNALIGNED_NOCLASSES_NOJNI', 'OUTAPK_UNALIGNED_NOCLASSES']
def runnable_status(self): def runnable_status(self):
""" """
Waits for dependent tasks to be complete, then read the file system to find the input nodes. Waits for dependent tasks to be complete, then read the file system to find the input nodes.
@ -152,7 +183,7 @@ class apkjni(Task.Task):
self.inputs = self.generator.outdir.ant_glob('{0}/**/*'.format(self.env.JNIDIR), quiet=True) self.inputs = self.generator.outdir.ant_glob('{0}/**/*'.format(self.env.JNIDIR), quiet=True)
self.inputs += self.generator.outdir.ant_glob(self.env.OUTAPK_UNALIGNED_NOCLASSES_NOJNI) self.inputs += self.generator.outdir.ant_glob(self.env.OUTAPK_UNALIGNED_NOCLASSES_NOJNI)
self.outputs = [self.generator.outdir.make_node(self.env.OUTAPK_UNALIGNED_NOCLASSES)] self.outputs = [self.generator.outdir.make_node(self.env.OUTAPK_UNALIGNED_NOCLASSES)]
return super(apkjni, self).runnable_status() return super(apkjni, self).runnable_status()
class apkdex(Task.Task): class apkdex(Task.Task):
@ -220,6 +251,8 @@ def apply_aapt(self):
self.env.OUTAPK_UNALIGNED_NOCLASSES = apkname + '.unaligned.noclasses.apk' self.env.OUTAPK_UNALIGNED_NOCLASSES = apkname + '.unaligned.noclasses.apk'
self.env.OUTAPK_UNALIGNED = apkname + '.unaligned.apk' self.env.OUTAPK_UNALIGNED = apkname + '.unaligned.apk'
self.env.OUTAPK = apkname + '.apk' self.env.OUTAPK = apkname + '.apk'
if self.env.BUILD_TOOLS_VERSION[0] > 27:
self.env.append_unique('AAPT2_LINKFLAGS', '--allow-reserved-package-id')
self.env.OUTRDIR = os.path.join(outdir.abspath(), getattr(self, 'gendir', 'gen')) # build/gen self.env.OUTRDIR = os.path.join(outdir.abspath(), getattr(self, 'gendir', 'gen')) # build/gen
self.env.RESOUTFILE = os.path.join(outdir.abspath(), 'compiled') self.env.RESOUTFILE = os.path.join(outdir.abspath(), 'compiled')
@ -245,7 +278,12 @@ def apply_d8(self):
self.env.D8_FLAGS = '--debug' self.env.D8_FLAGS = '--debug'
else: self.env.D8_FLAGS = '--release' else: self.env.D8_FLAGS = '--release'
self.d8_task = self.create_task('d8')
if self.env.D8:
self.d8_task = self.create_task('d8')
else:
self.d8_task = self.create_task('dx')
self.d8_task.cwd = self.outdir self.d8_task.cwd = self.outdir
self.d8_task.set_run_after(self.javac_task) self.d8_task.set_run_after(self.javac_task)