利用指令碼快速更換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屬於菜雞新手,寫的東西比較屎,但是確實好用。黑貓白貓能抓耗子就是好貓嘛。嘿嘿。
根據你自己的需求修改完成,儲存為test.py後就可以了。# 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資源更換完畢")
這個python指令碼使用方法: python test.py <你的應用或者遊戲路徑>,最後在原路徑下生成的release.apk就是修改後並且簽名完成的包了。第一種更新java程式碼不可以這樣做,rsync程式碼後需要重新執行以下ant指令碼進行打包。因為程式碼變化後dex檔案也改變了。你可以打包後用修改後的dex替換最新的dex,然後重新簽名。原理都一樣。