通过apktool解包替换资源重新打包实现app定制

转载请标明原文地址:http://www.jianshu.com/p/b547d889c6c8

一个奇葩的需求,用户希望可以由客户来自定义 app 的应用名、图标,由于这些资源是不确定的,所以没有办法事先通过打包多个 flavor 来满足需求。需要在用户需要的时候,动态的完成打包工作。

apktool

思考

在接到这个需求的时候,我想到了两个可能实现的方案:

  1. 使用 gradle,将项目源文件放在服务器上,当需要打包时,替换对应的资源文件,然后调用 gradle 指令,完成打包任务(思路来自 Jenkins,其实质好像就是通过调用gradle来进行打包)。

  2. 服务器上放置 apk 文件,在需要的时候,解包 apk,替换资源文件,然后重新打包签名。(思路来自鸿洋反编译的博文)。

其中方法一需要重新编译打包,无疑是一个极其费时的方法,故考虑采用方法二。

工具:

apktool:https://ibotpeaches.github.io/Apktool/
jarsigner:安装 JDK 后在 bin 文件夹下有这个工具

步骤

  1. 下载 apktool.bat 与 apktool.jar 文件,放在同一目录下,并将该目录添加到环境变量(Windows系统)

  2. 通过 AS 打包生成 apk 文件,并放置到上述目录中
    放置在同一目录

  3. cmd 运行指令 apktool d app.apk,将 apk 文件解包(默认解包到当前目录下的同名文件夹下)
    Paste_Image.png

  4. 修改资源文件
    修改图标文件
    修改应用名

  5. cmd 运行指令apktool b app -o other.apk(app 指需要打包的文件夹,-o other.apk 表示生产新文件),重新打包 apk
    重新打包 apk

  6. 将 keystore 文件放到该目录,签名 apk 文件

    1
    2
    jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore key.keystore -storepass yourpass other.apk alias
    //注意这里是一行指令

    签名apk

-keystore key.keystore :用于指定 keystore 的位置
-storepass yourpass :用于指定 keystore 的密码
other.apk:表示要签名的文件
alias:表示 keystore 文件的别名

更多详细指令请参考:jarsigner命令详解

完成上述的6个步骤,就完成了在不重新编译的情况下,对工程进行一定的个性化定制。

TODO

将上述功能使用 Python 脚本来完成。