用 python 修改二進位制的 AndroidManifest.xml

cody發表於2020-06-12

APK上架市場前修改幾次versionCodeversionName是常有的事情,大部分都是溝通上的問題,因為一個包要經過 開發->測試->己方運營->平臺方運營->平臺方測試(可能有),這是一條崎嶇漫長的路,過程中可能有人連這兩個版號是啥有啥用都不是很清楚,無奈。

既然避免不了就只能想辦法解決了:

  • 方法一: 修改原始碼重新構建
    • 優點:簡單有效
    • 缺點:
      • 耗時長,因為要重新構建
      • 開發容易夾帶私貨。如果再加上開發那邊分支管理混亂!!!(作為一個測試人員我已經不敢往下再想了,恐懼ing。。。)
  • 方法二:使用Apktool,解包->修改->重新打包
    • 優點:避免了方法一中的問題
    • 缺點:
      • 需要環境匹配,JDK版本和Apktool版本需要匹配
      • 部分包經過處理,Apktool無法正常執行
      • 重新構建後導致部分資源的壓縮發生變化而不能正常讀取

那麼能不能直接修改APK中的AndroidManifest.xml呢?因為aaptAXMLPrinter2.jar都可以直接解析二進位制的AndroidManifest.xml,所以直接修改應該是可行的,只要知道檔案的結構。

說到這裡不能不從懷裡掏出這張MindMac大神AXMLPrinter2.jar原始碼中分析出來的結構圖,膜拜Orz

四年前拿者這張寶圖,再到同性交友網GitHub上找到了一個java的專案,並在上面做了二次開發解決了修改版本的問題,原以為一切就應該到此結束了。
但是、
但是、、
但是、、、
Bug會遲到但是從不缺席:
在把versionName1.9修改成1.10後APK安裝失敗,通過定位問題後發現是AndroidManifest.xml解析錯誤,嘗試著想在原來的程式碼上修復這個Bug,結果失敗了。果然程式碼這個東西少了註釋這個紅娘,很快就和你行同陌路了。

不過好在寶圖還在,正好最近在學習Python,而且構建那塊也是用Python處理,一切都在告訴我『用Python重擼一遍吧』
好了廢話了那麼多直接上鍊接吧
https://github.com/CodyGit/ManifestEditor

Bug最終浮出了水面:
在新增字串時都是2個位元組的新增,但是每個Chunk必須是4個位元組的倍數,當把1.9改成1.10新增了1個字元對應就是2個位元組,需要在StringChunk的 末尾不上2個自己0x00

等會兒,Android需要修改iOS就不需要了?推薦你使用/usr/libexec/PlistBuddy超香的。

相關文章