1. 渠道包生成原理
渠道包和普通包的区别:
渠道包与普通包相比,渠道相关的信息不同,代码部分相同。开发和编码的时候,渠道信息尽可能的不要采用
硬编码,最好的方法是将渠道配置信息写入AndroidManifest的meta-data,程序中通过读取AndroidManifest的meta-data
中的信息获取渠道对应的渠道信息。
这种情况下,渠道包和普通包只有AndroidManifest有差别,通过重新生成AndroidManifest,和原来的代码和资源重新打包
就可以生成新的渠道包。
2. 快速打渠道包原理
1)生成APK包;
2)反解析APK;
$ apktool d [apk包]
如果失败,请采用
$ apktool d [apk包] -r
3)生成渠道包的AndroidManifest,替换反解析的AndroidManifest
替换生成渠道用的AndroidManifest
4)重新打包生成未签名的新APK;
$ apktool b [解压后的文件夹] -o [输出的新APK名]
5)对新APK进行签名
$ jarsigner -digestalg SHA1 -sigalg MD5withRSA -tsa -verbose -keystore [keystore文件] -storepass [用于密钥库完整性的口令] -signedjar [输出的签名apk] [未签名的apk] [keyAlias]
6)对新签名包进行优化(例如对齐处理)
2. 安装APKTOOL
1)下载APKTOOL wrapper script (右键, 链接存储为 apktool)
https://raw.githubusercontent.com/iBotPeaches/Apktool/master/scripts/osx/apktool
2) 下载 apktool-2 (下载地址)
https://bitbucket.org/iBotPeaches/apktool/downloads
3) 安装APKTOOL
下载完的apktool包重命名为 apktool.jar
移动两个文件 (apktool.jar & apktool) 到 /usr/local/bin (需要root权限)
为两个文件添加可执行(chmod +x)
现在就可以使用 apktool 命令了
通过apktool查看安装结果
我们发现我们需要修改的manifest文件就在里面,所以通过命令可以修改下他的内容,然后重新打包,就可以生成一个全新的渠道包了,省去了重新编译构建代码的过程。使用一下Python脚本,将manifest文件里面channel信息进行替换。
import re
def replace_channel(channel, manifest):
pattern = r'(<meta-data\s+android:name="channel"\s+android:value=")(\S+)("\s+/>)'
replacement = r"\g<1>{channel}\g<3>".format(channel=channel)
return re.sub(pattern, replacement, manifest)