使用python爲aab簽名和生成apk git子模塊

生產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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章