签名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()