0001b
最近在公司做了一个多渠道打包的工具,趁今天有空就来讲讲 Android 多渠道打包这件小事。众所周知,随着业务的不断增长,APP 的渠道也会越来越多,如果用 Gradle 打多渠道包的话,可能会耗费几个小时的时间才能打出几百个渠道包。所以就必须有一种方法能够解决这种问题。
目前市面上比较好的解决方案就是在 apk 文件中“动手脚”,比如由一位360 Android 工程师提出的“在 apk 文件中添加 comments 多渠道打包方法”,具体的代码在GitHub 上可以找到:MultiChannelPackageTool 。除此之外,还有美团点评技术团队在博客上发表过一篇《美团Android自动化之旅—生成渠道包》,里面讲叙了一种在 apk 文件中的 META-INF 目录下添加渠道信息的方法,之后再在程序启动时去动态读取,具体的实现原理可以去美团博客上看,这里就不说了。
我们解压多渠道打出来的 apk 包后,就会发现在 META-INF 目录下多了一个 channel_xxxxx 文件,而这个就是我们的渠道文件:
本文所采用的方法就是根据美团提供的思路实现的,当然网上有很多使用 Python 语言实现美团思路的版本,经过测试发现 Python 版本比 Java 版本打渠道包的速度更快一些。但是,在这里只提供 Java 版本实现方案,Python 版本实现的方案会在文末以参考链接的方式给出。
0010b
在这里先说明一下,Java 编写的多渠道打包工具依赖 commons-io.jar 和 zip4j.jar 。下面我们就开始进入正题吧。
我们先规定一下,渠道文件命名为 channel.txt ,并且要打包的 apk 文件和 channel.txt 与多渠道打包工具在同一目录下。
其中 channel.txt 的格式就是每个渠道独占一行,如下所示:
wandoujia
googleplay
xiaomi
huawei
kumarket
anzhi
然后我们先定义几个常量:
1 | // 渠道文件地址 |
定义好之后,我们下一步就是编写方法去读取 channel.txt 中的渠道信息:
1 | /** |
上面 getChannel()
方法中都是简单的 I/O 流操作,相信不需要解释大家都可以看得懂吧。之后我们要做的就是去当前路径下查找有无 apk 文件。在这里说明一下,我们这个多渠道打包小工具是支持多个 apk 文件一起打包的,所以我们要把当前目录下所有 apk 文件的路径存储起来。
1 | /** |
做好上面的步骤后,最后就剩下打包的代码了,一起来看看:
1 | /** |
buildApk()
方法中主要做的就是两个 for 循环嵌套。遍历当前目录的 apk 文件,然后遍历渠道信息,最后打包。另外需要注意的是要复制出一个 apk 文件来进行多渠道打包,而不是在原文件的基础上。
在这里打包的部分就结束了,我们还有一个步骤需要完成。那就是在应用程序启动时去读取相应的渠道,可以通过以下方法去读取:
1 | public static String getChannelFromMeta(Context context) { |
读取渠道之后,我们 APP 可以把相应的渠道号发送给服务器或者第三方统计平台做统计。
0011b
最后,我们可以把这个多渠道打包的 Java 项目打成一个 jar 包,然后写一个 bat 脚本,这样就通过鼠标双击就可以实现快速打渠道包了。以下是 bat 脚本的内容,要注意的是 bat 脚本要和 jar 包处于同一级目录下才可以哦:
@echo off
echo 欢迎使用多渠道打包工具
echo 请确保当前目录下有要打包的apk文件和渠道信息channel.txt
java -jar AndroidBuildApkTool.jar
echo 按任意键退出
pause>nul
exit
通过我们的努力 Java 版的多渠道打包工具就做好了。但是不足的是,测试后发现 Java 版打渠道包的速度没有 Python 版的快,主要是在 apk 文件中添加渠道信息文件这一步操作耗费的时间有点多。如果哪位小伙伴有更好的解决方案,欢迎联系我!
附上多渠道打包工具的源码:
0100b
References: