Python 用 python 修改二进制的 AndroidManifest.xml

cody · 2020年06月12日 · 最后由 cody 回复于 2020年06月22日 · 3795 次阅读

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超香的。

共收到 2 条回复 时间 点赞

上产线的包,可以这么随意么,哈哈。

cody #2 · 2020年06月22日 Author
不二家 回复

可能跟我们的业务有些关系把,业务功能本身内容有自己的版本控制,分发的平台又比较多。

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册