美团多渠道打包以快出名,早有耳闻,但总觉得神龙见首不见尾,大多文章都是讲原理的东西,却始终难懂到底怎么样用,今天就以初学者的姿态一边探索,一边总结,也希望能帮住大家少走写冤枉路。
首先,明白几个问题:
一、为什么要进行多渠道打包?
安卓应用商店(一个商店也叫做一个渠道,如360,baidu,xiaomi)众多,大大小小几百个,我们发布应用之后需要统计各个渠道的用户下载量,所以才有了多渠道打包。
二、怎么样统计各个渠道的下载量呢?
现在有比较成熟的第三方应用帮我们实现统计功能(比如友盟、腾讯统计分析),统计的本质就是收集用户信息传输到后台,后台生成报表,帮助我们跟踪分析并完善app。通过系统的方法已经可以获取到,版本号,版本名称,系统版本,机型,地区等各种信息,唯独应用商店(渠道)的信息我们是没有办法从系统获取到的,所以我们就人为的在apk里面添加渠道信息(其实就用一个字段进行标识,如360,baidu),我们只要把这些信息打包到apk文件并将信息传输到后台,后台根据这个标识,可以统计各个渠道的下载量了,并没有多么的高大上。
说了那么多,其实多渠道打包只需要关注两件事情:
- 将渠道信息写入apk文件
- 将apk中的渠道信息传输到统计后台
其实网上大多数文章都只是告诉读者“怎么样将渠道信息写入apk文件”这一个步骤,导致一些初学者摸不着头脑(我就是其中一个),那么,然后呢?这样就行了吗?总觉得缺了点什么。
三、Gradle打包(本例以友盟统计为例)
1:在AndroidMainfest.xml配置可动态替换的渠道参数**
<meta-data
android:name="UMENG_CHANNEL"
android:value="xiaomi" /><!--渠道号为:小米-->
如果想动态的替换渠道号怎么办呢?
<meta-data
android:name="UMENG_CHANNEL"
android:value="${CHANNEL_ID}" /><!--动态替换渠道号-->
${CHANNEL_ID}
为占位符,其中的CHANNEL_ID
可以自己任意定义
2:在build.gradle设置productFlavors
android {
productFlavors {
xiaomi {
manifestPlaceholders = [UMENG_CHANNEL_VALUE: "xiaomi"]
}
_360 {
manifestPlaceholders = [UMENG_CHANNEL_VALUE: "_360"]
}
baidu {
manifestPlaceholders = [UMENG_CHANNEL_VALUE: "baidu"]
}
wandoujia {
manifestPlaceholders = [UMENG_CHANNEL_VALUE: "wandoujia"]
}
}
}
或者批量修改
android {
productFlavors {
xiaomi {}
_360 {}
baidu {}
wandoujia {}
}
productFlavors.all {
flavor -> flavor.manifestPlaceholders = [UMENG_CHANNEL_VALUE: name]
}
}
3:使用gradle打包
AS为我们提供了图形界面的方式,点击菜单栏 —> Build —> Generate Signed APK (输入相关的签名证书路径和密码)—> 一步步下去 —> Flavors中全选—> Finish.
四、命令行打包(本例以友盟统计为例)
1:在AndroidMainfest.xml配置可动态替换的渠道参数
<meta-data
android:name="UMENG_CHANNEL"
android:value="xiaomi" /><!--渠道号为:小米-->
如果想动态的替换渠道号怎么办呢?
<meta-data
android:name="UMENG_CHANNEL"
android:value="${CHANNEL_ID}" /><!--动态替换渠道号-->
${CHANNEL_ID}
为占位符,其中的CHANNEL_ID
可以自己任意定义
2:在项目的build.gradle文件中设置打包签名信息 signingConfigs:
新浪微博SSO登录,微信分享这些都需要签名打包,才能看到效果,设置默认签名文件为自己的签名jks,这样就不需要打包了直接运行起来就是正式的签名。
在android.signingConfigs{}下定义一个或者多个签名信息,然后在buildTypes{}配置使用即可。
在app目录下添加你的.jks,然后app的build.gradle文件中的增加以下内容:
(1)debug版本
android {
signingConfigs {
debug {
storeFile file("WuXiaolong.jks")
storePassword 'android'
keyAlias 'android'
keyPassword 'android'
}
}
}
buildTypes没有配置,也是直接取得debug,是不是不配置默认取得是debug呢?
(2)release版本
android {
signingConfigs {
release {
storeFile file("WuXiaolong.jks")
storePassword 'android'
keyAlias 'android'
keyPassword 'android'
}
}
buildTypes {
debug {
signingConfig signingConfigs.release
}
}
}
3:在build.gradle设置productFlavors
android {
productFlavors {
xiaomi {
manifestPlaceholders = [UMENG_CHANNEL_VALUE: "xiaomi"]
}
_360 {
manifestPlaceholders = [UMENG_CHANNEL_VALUE: "_360"]
}
baidu {
manifestPlaceholders = [UMENG_CHANNEL_VALUE: "baidu"]
}
wandoujia {
manifestPlaceholders = [UMENG_CHANNEL_VALUE: "wandoujia"]
}
}
}
或者批量修改
android {
productFlavors {
xiaomi {}
_360 {}
baidu {}
wandoujia {}
}
productFlavors.all {
flavor -> flavor.manifestPlaceholders = [UMENG_CHANNEL_VALUE: name]
}
}
4:使用命令行打包
在AS的内置终端Terminal工具中执行命令:
./gradlew assembleRelease
(所有生成的apk在项目的build\outputs\apk下)
五、文章参考
http://www.jianshu.com/p/2f2ce33e670f
http://stormzhang.com/devtools/2015/01/15/android-studio-tutorial6/
http://wuxiaolong.me/2016/04/01/gradle4android3/
https://as.quanke.name/%E5%A4%9A%E6%B8%A0%E9%81%93%E6%89%93%E5%8C%85.html