美文网首页
使用python为aab签名和生成apk

使用python为aab签名和生成apk

作者: SerBad | 来源:发表于2022-07-06 14:36 被阅读0次

    生产aab格式的文件后,为了上传到google play还需要签名的,还有从生成aab到生成可以安装用的apk要花蛮多步骤的。
    所以,这里用Python做下自动化简化下步骤

    import os
    import subprocess
    import time
    import zipfile
    import shutil
    import argparse
    
    class BuildOptions:
        def __init__(self):
            self.parser = argparse.ArgumentParser(description="自动打包文件")
            self.parser.add_argument("--path", type=str, required=True, help="aab的路径")
            self.parser.add_argument("--password", type=str, required=True, help="你自己的密码")
            self.parser.add_argument("--jks_path", type=str, required=True, help="你自己jks的地址")
            self.parser.add_argument("--alias", type=str, default="release", help="你自己jks的地址")
    
        def parse(self):
            return self.parser.parse_args()
    
    
    # 用来执行jar包的
    def query_by_java_jar(jar_path, param):
        execute = "java -jar {} {}".format(jar_path, param)
        print(execute)
        output = subprocess.Popen(execute, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
        res = output.stdout.readlines()
        return res
    
    
    # 用来执行jarsigner命令的
    def query_by_jarsigner(param):
        # jarsigner 是来自于java的,确保自己本地的java环境正确即可
        execute = "jarsigner {}".format(param)
        print(execute)
        # 这个是为了自动输入密码
        echo = subprocess.Popen(['echo', password], stdout=subprocess.PIPE)
        output = subprocess.Popen(execute, shell=True, stdout=subprocess.PIPE, stdin=echo.stdout, stderr=subprocess.STDOUT)
        res = output.stdout.readlines()
        return res
    
    
    if __name__ == '__main__':
        parser = BuildOptions()
        args = parser.parse()
        # 替换自己的jks地址
        jks_path = args.jks_path
        # 替换自己的密码
        password = args.password
    
        aab_path = args.path
        print('aab_path', aab_path)
        dir_name = os.path.dirname(aab_path)
    
        apks_path = os.path.basename(aab_path).replace('.aab', '.apks')
    
        query_by_jarsigner(
            '-verbose -sigalg SHA256withRSA -digestalg SHA-256 -keystore ' + jks_path + ' ' + aab_path + ' release')
        query_by_java_jar('./bundletool-all-1.9.1.jar',
                          'build-apks --bundle=' + aab_path + ' --output=' + apks_path + ' --mode=universal --ks=' + jks_path + ' --ks-pass=pass:' + password + ' --ks-key-alias=' + args.alias + ' --key-pass=pass:' + password)
        zip_path = apks_path.replace('.apks', '.zip')
        os.renames(apks_path, zip_path)
        zFile = zipfile.ZipFile(zip_path, "r")
        zip_apk_path = dir_name + os.sep + 'apk'
        os.remove(zip_path)
        if os.path.exists(zip_apk_path):
            shutil.rmtree(zip_apk_path)
        for fileM in zFile.namelist():
            zFile.extract(fileM, zip_apk_path)
    
        rename = zip_apk_path + os.sep + time.strftime("%Y_%m_%d_%H_%M_%S", time.localtime()) + '_' + apks_path.replace(
            '.apks', '.apk')
        os.renames(zip_apk_path + '/universal.apk', rename)
        print("output apk", rename)
        zFile.close()
    

    其中bundletool-all-1.9.1.jar是来自于https://github.com/google/bundletool/releases,可以替换成你自己需要的jar

    使用方法是:

    python build.py --path 'abb file path' --jks_path 'jks file path' --password 'your jks password' --alias 'your jks alias'
    

    或者,在Android项目中的build.gradle,新建一个task,可以替换成自己需要的文件目录

    task buildAAB(type: Exec) {
        commandLine 'python3', '../build.py', '--path', "$buildDir/outputs/bundle/*.aab", '--jks_path', 'jks file path', '--password', 'your jks password', ' --alias', 'your jks alias'
    }
    

    然后使用下面的命令就可以上传了。

    ./gradlew buildAAB
    

    本项目地址存放在,https://github.com/SerBad/RunBuildAAB.git

    git子模块

    可以使用git的submodule方法来把其他git的子模块添加到项目里面去 使用方法是

    git submodule add https://github.com/SerBad/RunBuildAAB.git
    

    相关文章

      网友评论

          本文标题:使用python为aab签名和生成apk

          本文链接:https://www.haomeiwen.com/subject/agrybrtx.html