Android APK包签名Python脚本

804 阅读1分钟

签名Python脚本

# -*- coding:utf-8 -*-
import shutil
import os
import subprocess
import time

# jks签名证书(放在当前目录中)
# jksFile = r'E:\\工作\\签名\\key.keystore'
jksFile = r'E:\appsiger\debug.keystore.jks'
# KeyStore密码
storePassword = 'xxxx'
# 生成jks时指定的alias
keyAlias = 'xxx'
# 签署者的密码,即生成jks时指定alias对应的密码
keyPassword = 'xxxxx'

# 获取当前目录中所有的apk源包
# 这里放着你要操作的文件夹名称
path = 'E:\\appsiger\\no_singer\\'
src_apks = []
# python3 : os.listdir()即可,这里使用兼容Python2的os.listdir('.')
listdir = os.listdir(path)
for file in os.listdir(path):
    # os.path.isdir()用于判断某一对象(需提供绝对路径)是否为目录
    if os.path.isfile(path + file):
        extension = os.path.splitext(file)[1][1:]
        if extension in 'apk':
            src_apks.append(file)
try:
    for src_apk in src_apks:
        # file name (with extension)
        src_apk_file_name = os.path.basename(src_apk)
        # 分割文件名与后缀
        temp_list = os.path.splitext(src_apk_file_name)
        # name without extension
        src_apk_name = temp_list[0]
        # 后缀名,包含.   例如: ".apk "
        src_apk_extension = temp_list[1]
        # 创建生成目录
        # output_dir = 'E:\\appsiger\\output\\'
        output_dir = 'E:\\appsiger\\output\\'
        # 目录不存在则创建
        if not os.path.exists(output_dir):
            os.mkdir(output_dir)
        # 目标文件路径
        target_apk = path + src_apk_name + src_apk_extension
        # 签名后的文件路径
        signer_apk = output_dir + src_apk_name + '_signer' + src_apk_extension
        # 拼装签名命令
        # cmd /c dir:是执行完dir命令后关闭命令窗口;
        # cmd /k dir:是执行完dir命令后不关闭命令窗口。
        # os.chdir('E:/AS/AS3_2/AndroidSDK/build-tools/26.0.1')quit
        # retval = os.getcwd()
        # print("当前工作目录为 %s" % retval)
        signer_str = 'cmd.exe /k apksigner sign --ks ' + jksFile \
                     + ' --ks-pass pass:' + storePassword \
                     + ' --ks-key-alias ' + keyAlias \
                     + ' --key-pass pass:' + keyPassword \
                     + ' --out ' + signer_apk + ' ' + target_apk
        # 执行签名命令
        signer_result = os.popen(signer_str)
        # print(signer_result)
        # print(type(signer_result))
        # with os.popen(signer_str) as p:
        #     # 输出签名命令执行结果
        #     if p.read() != '':
        #         print('signer_result:\t', 'success')
        #     else:
        #         print('signer_result:\t', 'fail')
        # 输出签名命令执行结果
        # if signer_result.read() != ' ':
        #     # 执行成功就删除
        #     os.remove(target_apk)
        #     print('signer_result:\t', 'success')
        # else:
        #     print('signer_result:\t', 'fail')
        time.sleep(3)
        if os.path.exists(signer_apk):
            app_size = os.path.getsize(signer_apk)
            app_size_kb = app_size / float(1024)
            if app_size_kb > 0:
                # os.remove(target_apk)
                print('signer_result:\t', 'success:' + signer_apk + '--' + '%.2f kb' % app_size_kb)
                # 拼装验证签名命令
                verify_str = 'apksigner verify -v --print-certs ' + signer_apk
                # 执行对签过的apk进行签名验证
                verify_result = os.popen(verify_str)
                # 输出验证签名命令执行结果
                print('verify_result:\t', verify_result.read())
        else:
            print('signer_result:\t', 'fail:' + src_apk)

        # os.remove(target_apk)
except Exception as e:
    print('Exception:\t', repr(e))
print('请输入任意键退出')
# 等待输入
input()