Android和iOS包批量重签名

编程之家收集整理的这篇文章主要介绍了Android和iOS包批量重签名编程之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

Android篇

环境要求

1 安装winrar,然后配置winrar的环境变量,要用到winrar指令

2 配置java的bin目录到环境变量,要用到jarsigner指令

 

重签名步骤说明:

1 从母包复制一个子包

2 删除子包的签名文件Meta-INFO

3 根据需要修改子包的文件,比如渠道号文件之类

4 重签名子包

 

对应的python脚本

import os
import sys
import shutil
import json

ORIGINAL_APK='母包.apk'
UNSIGN_APK='unsign.apk'
SIGNED_APK={"\"子包1.apk\"":1,"\"子包2.apk\"":2,"\"子包3.apk\"":3,"\"子包4.apk\"":4}

KEY_STORE='keystore文件.keystore'
KEY_PASS='key密码'
STORE_PASS='store密码'

def copy_apk(src_f,dst_f):
    if not os.path.isfile(src_f):
        print("%s not exist"%(src_f))
    else:
        fpath,fname=os.path.split(dst_f)
        shutil.copyfile(src_f,dst_f)
        print("copy %s -> %s"%(src_f,dst_f))


def zip_del_file(apk_f,del_f):
    os.system("winrar d %s %s"%(apk_f,del_f))
    print('zip_del_file:'+del_f)
    
def zip_add_file(apk_f,channel):
    del_dir("assets")
    os.makedirs("assets")
    f=open("assets\\AppParamSetting.txt",'w')
    f.write('{"channel":%s,"bundleIdentifier":""}'%(channel))
    f.close()
    os.system("winrar a -ad %s %s"%(apk_f,"assets\\AppParamSetting.txt"))
    
def del_file(f):
    os.remove(f)
    print('del_file:'+f)
    
def del_dir(f_dir):
    if os.path.exists(f_dir):
        shutil.rmtree(f_dir)
        print("del_dir:"+f_dir)
    
def sign_app(unsigned_app,signed_app):
    signcmd='jarsigner -verbose -keystore %s -keypass %s -storepass %s -signedjar %s -digestalg SHA1 -sigalg MD5withRSA %s sfish' % (KEY_STORE,KEY_PASS,STORE_PASS,signed_app,unsigned_app)
    os.system(signcmd)
    print(signcmd)
        
if __name__ == '__main__':
    cur_dir=os.getcwd()
    print('cur_dir'+cur_dir)
    copy_apk(ORIGINAL_APK,"tmp_"+ORIGINAL_APK)
    zip_del_file("tmp_"+ORIGINAL_APK,"Meta-INF")
    for key in SIGNED_APK.keys():
        channel=SIGNED_APK[key]
        zip_add_file("tmp_"+ORIGINAL_APK,channel)
        sign_app("tmp_"+ORIGINAL_APK,key)
    del_dir("assets")
    del_file("tmp_"+ORIGINAL_APK)
    input("Done")

iOS篇

环境要求:

1 mac机子

2 证书文件,打开:Launchapd(火箭图标)->其他 -> 钥匙串访问,就在那里

3 .mobileprovision文件

 

 

重签名步骤说明:

1 从.mobileprovision文件生成entitlements.plist文件

2 解压ipa,会得到一个Payload目录,再往里是一个xxx.app,显示内容可以看到里面的东西

3 删除签名文件,即:Payload/xxx.app/_CodeSignature目录

4 根据需要修改文件,比如渠道文件

5 重签名:/usr/bin/codesign指令

6 压缩ipa:zip指令

 

对应的python脚本

#!/usr/bin/python

import os
import sys
import json

ORIGINAL_IPA='母包.ipa'
SIGNED_APK={"\"子包1.ipa\"":1,"\"子包2.ipa\"":2,"\"子包3.ipa\"":3,"\"子包4.ipa\"":4}
CERT_FILE='证书文件'
MOBILE_PROVISION_UUID = 'mobileprovision的uuid'

def get_mobile_provision_dir():
    return os.path.join(os.getenv('HOME'),'Library/MobileDevice/Provisioning Profiles/')

def get_mobile_provision_file(uuid):
    return os.path.join(get_mobile_provision_dir(),uuid + ".mobileprovision")

def unzip_app():
    os.system('unzip -qo ./%s -d ./'%(ORIGINAL_IPA))
    print('unzip_app %s done!'%(ORIGINAL_IPA))  

def del_code_signature():
    os.system("rm -rf ./Payload/sfish.app/_CodeSignature")
    print('del_code_signature done!')

def resign_app():
    os.system('/usr/bin/codesign --continue -f -s "%s" --entitlements "%s" "%s"'%(CERT_FILE,'./entitlement.plist','./Payload/sfish.app'))
    print('resign_app done!')

def zip_app(f_ipa):
    os.system('zip -r %s ./Payload'%(f_ipa))
    print('zip_app done!')

def del_payload():
    os.system('rm -r ./Payload')

# 生成entitlements.plist文件
def gen_entitlements(uuid,out_file_name):
    os.system('security cms -D -i "%s" > entitlement_full.plist '%(get_mobile_provision_file(uuid) ))
    os.system('/usr/libexec/PlistBuddy -x -c \'Print:Entitlements\' entitlement_full.plist > "%s" '%( out_file_name))

def rep_emb_file(uuid):
    os.system('cp "%s" ./Payload/sfish/embedded.mobileprovision' % (get_mobile_provision_file(uuid)))

def update_channel_file(channel):
    f_channel='./Payload/xxx.app/Data/Raw/channel.txt'
    fr=open(f_channel,'r')
    txt=fr.read()
    fr.close()
    js=json.loads(txt)
    js['channel_id']=channel
    fw=open(f_channel,'w')
    fw.write(json.dumps(js))
    fw.close()

if __name__ == '__main__':
    # 生成entitlements.plist文件
    gen_entitlements( MOBILE_PROVISION_UUID,"entitlement.plist" )
    unzip_app()
    # 删除签名文件
    del_code_signature()
    for key in SIGNED_APK.keys():
        # 根据需要修改文件,比如渠道文件
        channel=SIGNED_APK[key]
        update_channel_file(channel)
        # 重签名
        resign_app()
        # 压缩ipa
        zip_app(key)
    del_payload()

 

 

 

总结

以上是编程之家为你收集整理的Android和iOS包批量重签名全部内容,希望文章能够帮你解决Android和iOS包批量重签名所遇到的程序开发问题。

如果觉得编程之家网站内容还不错,欢迎将编程之家网站推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。

小编个人微信号 jb51ccc
喜欢与人分享编程技术与工作经验,欢迎加入编程之家官方交流群!

相关文章

猜你在找的iOS相关文章

Symbol Value Meaning NULL (void *)0 literal null value for C pointers nil (id)0 literal null value for Objective-C objects nil:对象为空定义某一实例对象为空值。例如:NSObject* obj = nil;if (...
%s和%@%s是c标准的字符串而%@是objective-C的字符串NSString 补充%@ 对象 %d 十进制整数 %i 十进制整数 %u 十进制无符号整型 %o 八进制整数 %x 十六进制整数 %e 指数形式的浮点数 %f 浮点数 %s 字符串 %c 字符 %p 指针格式转换NSString *tempA = @"123";NSStrin...
转载注明出处:https://blog.csdn.net/joosonmao/article/details/21172835刚接触iOS开发的人难免会对苹果的各种证书、配置文件等不甚了解,可能你按照网上的教程一步一步的成功申请了真机调试,但是还是对其中的缘由一知半解。这篇文章就对Certificate、Provisioning Profile等做个总结。 1.概念介绍如果你拥有一个开...
导入iOS证书p12到钥匙串,双击p12文件,登录,导入证书1.选择Generic iOS Device,选择其他模拟器是不能Archive的2.Xcode 工具条 Product 下点击 Archive3.如果弹出下面框,输入本机密码,始终允许4.点击Export5.点击Enterprise6.点击Next7.选择证书,点击Next8....
iOS9以下的自己越狱后,通过PP助手备份到电脑或者直接通过pp助手直接下载 
编译报错当你开心得升级完新 macOS,以及新 XCode,准备体验了一把 Dark Mode 编程模式,开心的打开自己的老项目的时候,发现编译不通过了╮(╯_╰)╭如果你的工程中如果依赖libstdc++,无论是你本身的功能用 C++ 跨平台编写,还是你引入了某个 SDK 其内部依赖这个libstdc++,都会导致整个工程编译不通过,报出Undefined symbols,C+...
终端中运行xcodebuild -showsdks
Dear Developer,We identified one or more issues with a recent delivery for your app, “xxxxxx”. Please correct the following issues, then upload again.Invalid architectures - This app has invalid ar...