通过apktool解包替换资源重新打包实现app定制
转载请标明原文地址:http://www.jianshu.com/p/b547d889c6c8
一个奇葩的需求,用户希望可以由客户来自定义 app 的应用名、图标,由于这些资源是不确定的,所以没有办法事先通过打包多个 flavor 来满足需求。需要在用户需要的时候,动态的完成打包工作。
思考
在接到这个需求的时候,我想到了两个可能实现的方案:
使用 gradle,将项目源文件放在服务器上,当需要打包时,替换对应的资源文件,然后调用 gradle 指令,完成打包任务(思路来自 Jenkins,其实质好像就是通过调用gradle来进行打包)。
服务器上放置 apk 文件,在需要的时候,解包 apk,替换资源文件,然后重新打包签名。(思路来自鸿洋反编译的博文)。
其中方法一需要重新编译打包,无疑是一个极其费时的方法,故考虑采用方法二。
工具:
apktool:https://ibotpeaches.github.io/Apktool/
jarsigner:安装 JDK 后在 bin 文件夹下有这个工具
步骤
下载 apktool.bat 与 apktool.jar 文件,放在同一目录下,并将该目录添加到环境变量(Windows系统)
通过 AS 打包生成 apk 文件,并放置到上述目录中
cmd 运行指令
apktool d app.apk
,将 apk 文件解包(默认解包到当前目录下的同名文件夹下)修改资源文件
cmd 运行指令
apktool b app -o other.apk
(app 指需要打包的文件夹,-o other.apk 表示生产新文件),重新打包 apk将 keystore 文件放到该目录,签名 apk 文件
1
2jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore key.keystore -storepass yourpass other.apk alias
//注意这里是一行指令
-keystore key.keystore
:用于指定 keystore 的位置-storepass yourpass
:用于指定 keystore 的密码other.apk
:表示要签名的文件alias
:表示 keystore 文件的别名
更多详细指令请参考:jarsigner命令详解
完成上述的6个步骤,就完成了在不重新编译的情况下,对工程进行一定的个性化定制。
TODO
将上述功能使用 Python 脚本来完成。