1. 程式人生 > >利用指令碼快速更換apk中的資源並且完成重簽名

利用指令碼快速更換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,然後重新簽名。原理都一樣。