#!/usr/bin/env python # # Copyright 2018 The Chromium Authors. All rights reserved. # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. """Process an app bundle (.aab) file into a set of split APKS (.apks)""" import argparse import itertools import os import shutil import sys import tempfile import zipfile # NOTE: Keep this consistent with the _app_bundle_to_apk_py_imports definition # in build/config/android/rules.gni from util import build_utils import bundletool def _ParseArgs(args): parser = argparse.ArgumentParser(description=__doc__) parser.add_argument('--aapt2', required=True, help='Path to aapt2 tool') parser.add_argument('--bundle', required=True, help='Input bundle file.') parser.add_argument('--out-zip', required=True, help='Output zip archive that will contain all APKs.') parser.add_argument('--keystore-path', required=True, help='Keystore path') parser.add_argument('--keystore-password', required=True, help='Keystore password') parser.add_argument('--key-name', required=True, help='Keystore key name') options = parser.parse_args(args) return options def main(args): args = build_utils.ExpandFileArgs(args) options = _ParseArgs(args) with build_utils.TempDir() as tmp_dir: # NOTE: The bundletool build-apks command requires the --output # path to not exist, and to end with '.apks'. tmp_bundle = os.path.join(tmp_dir, os.path.basename(options.bundle) + '.apks') cmd_args = ['java', '-jar', bundletool.BUNDLETOOL_JAR_PATH, 'build-apks'] cmd_args += ['--aapt2=%s' % options.aapt2] cmd_args += ['--bundle=%s' % options.bundle] cmd_args += ['--output=%s' % tmp_bundle] if options.keystore_path: cmd_args += [ '--ks=%s' % options.keystore_path, '--ks-key-alias=%s' % options.key_name, '--ks-pass=pass:%s' % options.keystore_password ] build_utils.CheckOutput(cmd_args) shutil.move(tmp_bundle, options.out_zip) if __name__ == '__main__': main(sys.argv[1:])