利用脚本快速更换apk中的资源并且完成重签名

     转载请附上原文地址:  http://blog.csdn.net/strangenightmare/article/details/52471850

     本人就职于游戏公司SDK研发部门,但是经常出现修改几行java层的SDK代码就要重新打游戏包的痛苦。因为手游动辄上百M,如果只更新这几行java层代码或者更换了里面一个图片资源,再重新上打包机部署打包就要几十分钟为了测试下效果,还要联系游戏主程序合并代码,十分麻烦觉得十分没有必要,只是测试下效果嘛。本着能自己解决就不麻烦别人的原则。我就想了一个笨笨的办法来加速这种小修补的过程,完全可以自行搞定。我先说明我的思路,本人是Android开发,所以C层不研究。更新分为两种情况,第一种就是更新SDK层的java代码,另一种是只更换图片资源。

     第一种情况。这种情况的话,先down一份游戏整个工程在你的电脑上,我们不动lua层和C层,拆开一个最新的游戏包,然后rsync同步路径assets下面的所有资源到最新,然后再利用rsync命令同步一下和你的修改后的SDK代码和游戏工程中SDK层代码,接着ant直接出包。这种前提是你电脑上也要有一份签名文件。这样ant后才能出一个正常的包。可以利用下面的脚本稍微修改下就可以实现了。今天着重分析第二种情况。

     第二种情况。只是更换一两个图片资源,这种情况完全没必要重新打一遍包,劳民伤财。解决思路:1.删掉包的签名信息;2.更新图片;3.重新压缩成apk包(不是用ant,只是压缩);4.签名;5.zipalign对齐。这样基本上1分钟内就能搞定更换。比重新打包爽太多了吧。如果你写成python脚本,整个过程就简化了。很方便。下面贴上我写的python脚本

     本人python属于菜鸡新手,写的东西比较屎,但是确实好用。黑猫白猫能抓耗子就是好猫嘛。嘿嘿。

# encoding: utf-8
import shutil
import os
import sys
#设置签名信息
keystore_path = "你的keystore"
keystore_pass = "keystore密码"
keystore_alias = "alias"
keystore_alias_pass = "alias密码"
#传入apk路径
root = os.getcwd()
tmp_path = root + "/tmp/"
apk_path = sys.argv[1]
path_spilt = apk_path.split("/")
p_length = len(path_spilt)
apk_name = path_spilt[p_length-1]
#copy文件至tmp
if not os.path.exists(tmp_path):
	os.system("mkdir tmp")
shutil.copyfile(apk_path,tmp_path+apk_name)
# 删除签名信息
os.system("zip -d "+tmp_path+apk_name+" META-INF/*")
# 解压
os.system("unzip -d "+tmp_path+" "+tmp_path+apk_name)
# 删除原apk
if os.path.exists(tmp_path+apk_name):
	os.remove(tmp_path+apk_name)
# 更新资源
os.system("rsync -avz --progress --exclude .DS_Store "+root+"/res/ "+tmp_path+"/res")
# 打包
os.chdir(tmp_path)
os.system("zip -r "+root+"/release-nosign.apk "+"*")
os.chdir(root)
#签名
os.system("jarsigner -verbose -digestalg SHA1 -sigalg MD5withRSA -keystore "+ keystore_path + " -storepass " +keystore_pass + " -signedjar release-sign.apk release-nosign.apk " + keystore_alias +" -keypass " + keystore_alias_pass)
#压缩对齐
os.system("/Users/playcrab/zhangnan/adt-bundle-mac-x86_64-20140702/sdk/build-tools/24.0.1/zipalign -v 4 release-sign.apk release.apk")
#删除临时文件
shutil.rmtree(tmp_path)
#验证签名
os.system("jarsigner -verify -certs release.apk")
print ("APK资源更换完毕")
根据你自己的需求修改完成,保存为test.py后就可以了。
这个python脚本使用方法: python test.py <你的应用或者游戏路径>,最后在原路径下生成的release.apk就是修改后并且签名完成的包了。第一种更新java代码不可以这样做,rsync代码后需要重新执行以下ant脚本进行打包。因为代码变化后dex文件也改变了。你可以打包后用修改后的dex替换最新的dex,然后重新签名。原理都一样。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值