Android和iOS包批量重签名
本文实例为大家分享了Android和iOS包批量重签名的具体代码,供大家参考,具体内容如下
Android篇
环境要求
1安装winrar,然后配置winrar的环境变量,要用到winrar指令
2配置java的bin目录到环境变量,要用到jarsigner指令
重签名步骤说明:
1从母包复制一个子包
2删除子包的签名文件META-INFO
3根据需要修改子包的文件,比如渠道号文件之类
4重签名子包
对应的python脚本
importos importsys importshutil importjson 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密码' defcopy_apk(src_f,dst_f): ifnotos.path.isfile(src_f): print("%snotexist"%(src_f)) else: fpath,fname=os.path.split(dst_f) shutil.copyfile(src_f,dst_f) print("copy%s->%s"%(src_f,dst_f)) defzip_del_file(apk_f,del_f): os.system("winrard%s%s"%(apk_f,del_f)) print('zip_del_file:'+del_f) defzip_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("winrara-ad%s%s"%(apk_f,"assets\\AppParamSetting.txt")) defdel_file(f): os.remove(f) print('del_file:'+f) defdel_dir(f_dir): ifos.path.exists(f_dir): shutil.rmtree(f_dir) print("del_dir:"+f_dir) defsign_app(unsigned_app,signed_app): signcmd='jarsigner-verbose-keystore%s-keypass%s-storepass%s-signedjar%s-digestalgSHA1-sigalgMD5withRSA%ssfish'%(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") forkeyinSIGNED_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篇
环境要求:
1mac机子
2证书文件,打开:Launchapd(火箭图标)->其他->钥匙串访问,就在那里
3.mobileprovision文件
重签名步骤说明:
1从.mobileprovision文件生成entitlements.plist文件
2解压ipa,会得到一个Payload目录,再往里是一个xxx.app,显示包内容可以看到里面的东西
3删除签名文件,即:Payload/xxx.app/_CodeSignature目录
4根据需要修改文件,比如渠道文件
5重签名
6压缩ipa
对应的python脚本
#!/usr/bin/python importos importsys importjson ORIGINAL_IPA='母包.ipa' SIGNED_APK={"\"子包1.ipa\"":1,"\"子包2.ipa\"":2,"\"子包3.ipa\"":3,"\"子包4.ipa\"":4} CERT_FILE='证书文件' MOBILE_PROVISION_UUID='mobileprovision的uuid' defget_mobile_provision_dir(): returnos.path.join(os.getenv('HOME'),'Library/MobileDevice/ProvisioningProfiles/') defget_mobile_provision_file(uuid): returnos.path.join(get_mobile_provision_dir(),uuid+".mobileprovision") defunzip_app(): os.system('unzip-qo./%s-d./'%(ORIGINAL_IPA)) print('unzip_app%sdone!'%(ORIGINAL_IPA)) defdel_code_signature(): os.system("rm-rf./Payload/sfish.app/_CodeSignature") print('del_code_signaturedone!') defresign_app(): os.system('/usr/bin/codesign--continue-f-s"%s"--entitlements"%s""%s"'%(CERT_FILE,'./entitlement.plist','./Payload/sfish.app')) print('resign_appdone!') defzip_app(f_ipa): os.system('zip-r%s./Payload'%(f_ipa)) print('zip_appdone!') defdel_payload(): os.system('rm-r./Payload') defgen_entitlements(uuid,out_file_name): os.system('securitycms-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)) defrep_emb_file(uuid): os.system('cp"%s"./Payload/sfish/embedded.mobileprovision'%(get_mobile_provision_file(uuid))) defupdate_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__': gen_entitlements(MOBILE_PROVISION_UUID,"entitlement.plist") unzip_app() del_code_signature() forkeyinSIGNED_APK.keys(): channel=SIGNED_APK[key] update_channel_file(channel) resign_app() zip_app(key) del_payload()
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。