多渠道意味着您的应用程序可以发布到不同的应用程序市场。 在由不同用户从不同市场下载后,您可以监视每个应用程序从哪个市场安装。 有很多方法可以实现,主要是通过在安装包中放置一个标志来区分不同的频道包。

在进行多渠道打包之前,先介绍一下Android Studio工程中的gradle脚本。
多渠道打包实践

展开Gradle Scripts我们可以看到里面有两个build.gradle文件和一个settings.gradle文件。其中的build.gradle(Project: passenger)文件是我们整个工程的build文件,而build.gradle(Module: app)文件是我们工程下的一个Module的build文件。

多渠道打包实现思路

思路1:AndroidManifest.xml占位符与productFlavor结合
比较常见的友盟移动统计sdk中使用的方案,这种方案是 通过build.gradle脚本中的productFlavor 来实现的。首先在AndroidManifest.xml文件的 application 标签里指定一个 meta-data ,然后Umeng SDK会读取这个标签中value传到Umeng的后台,这样就可以让开发者监测到自己的应用程序渠道分布情况了。
其实meta-data元素可以作为子元素,被包含在 activity,application,service和receiver标签中,但是不同位置下的 meta-data 读取方法不一样,我们这里就以在application中放置占位符为例。

思路2:一次打包,动态替换渠道标识符
在美团的技术博客上(https://tech.meituan.com/mt-apk-packaging.html)还分享过 另外一种实现思路 :就是在打包完apk之后,再拆包替换掉其中一个文件,或者替换文件中的标识符,实现不同渠道市场的打包。因为apk实际上也是一种zip文件,里面有Android定义的一些文件组织结构,比如可以在assert目录下塞一个文件,命名为version之类的,再动态改变其中的内容。这种思路和官方的buildTypes + productFlavor方式有所不同。因为这种思路只需要执行一次打包任务,剩下的操作是拆开apk,替换文件。可想而知这种速度比较快,如果你有很多个渠道包要打的话,这种思路能提高很多速度,据说100个渠道包大概只要2分钟。而普通的buildTypes + productFlavor方式,我打了4个渠道包也花费了几十秒。可见如果有很多渠道包要出,建议采用美团的这种思路。

小结:
运行gradle build命令时,终端里会显示当前正在执行的task,里面有很多我们熟悉的任务,例如dex、javaCompile这些。

相关文章: