Android应用市场百花争艳,应用宝,baidu,小米,豌豆荚等等都是各自占据一方,为了对每个市场的应用下载以及该渠道市场上的一些行为(下单等)数据分析,所以Android要打出不同渠道的包,以方便APP客户端在API请求时带入渠道号区分不同的市场,然后做进一步的分析,指导产品或者市场以及其他方面的下一步决策,今天就和大家一起分享一下Android多渠道打包的几种方法,与大家共勉。
目前多渠道打包有如下几种方法:
(1)在apk文件中的META-INF文件夹中写入以渠道号命名的空文件方式,——Perfect,快,但是需要维护脚本。
(2)gradle自带的manifestPlaceholders && productFlavor方式——Good,简单
(3)代码实现——normal
第一种:思路就是先打包生成一个apk,然后在该apk的基础上生成其他渠道包即可,不需要再重新签名,能节省不少打包时间。(我在APK包文件分析的时候所说的META-INF中插入空文档,直接修改名字作为apk的渠道号)
首先在AndroidManifest.xml中配置如下值:
<meta-data
android:name="channel"
android:value="${channel}" />
使用apktool decode应用程序apktool d *.apk build
在META-INF目录内添加空文件,可以不用重新签名应用。因此,为不同渠道的应用添加不同的空文件,通过文件名可以唯一标识一个渠道。脚本如下:
import zipfile
zipped = zipfile.ZipFile(*.apk, 'a', zipfile.ZIP_DEFLATED)
empty_channel_file = "META-INF/channel_{channel}".format(channel=360)
zipped.write(empty_file, empty_channel_file)
获取Channel信息:
ApplicationInfo appinfo = context.getApplicationInfo();
String sourceDir = appinfo.sourceDir;
解析对应目录——如果有需要可以发。
第二种:首先分享一个最常用的办法,此方法是基于Umeng的统计,友盟官方文档中规定要在AndroidManifest.xml中配置如下值:
<meta-data android:value="Channel ID" android:name="UMENG_CHANNEL"/>
Channel_ID渠道标识。在编译时候这个值能够自动变化以满足区分多渠道的需求。
项目配置示例:首先在项目的AndroidManifest.xml中配置
<meta-data
android:name="UMENG_APPKEY"
android:value="......" />
<meta-data
android:name="UMENG_CHANNEL"
android:value="${GRADLE_CHANNEL_VALUE}" />
然后使用Gradle Android插件里的另一个功能,manifestPlaceholders。修改相关打包脚本如下:
ProductFlavors作用是定义产品特性,配合 manifest merger 使用,实现在一次编译过程中为每个渠道包产生不同的 GRADLE_CHANNEL_VALUE的值。
也可以简单配置成如下方式:
android {
productFlavors {
360{
manifestPlaceholders = [GRADLE_CHANNEL_VALUE: "360"]
}
baidu{
manifestPlaceholders = [GRADLE_CHANNEL_VALUE: "baidu"]
}
wandoujia {
manifestPlaceholders = [GRADLE_CHANNEL_VALUE: "wandoujia"]
}
......
}
在应用启动的时候获取渠道文件,就可以进行相应的分析记录了,代码如下:
PackageManager pm = context.getPackageManager();
ApplicationInfo info = pm.getApplicationInfo(context.getPackageName(), PackageManager.GET_META_DATA);
return info.metaData.getString("channel");
第三种:在build.grale中配置如下:
android {
// 这里是你的其他配置
productFlavors{
360{ }
wandoujai { }
baidu{ }
}
......
}
然后在app/src下面,分别创建和main同级目录的文件夹360, wandoujia, baidu,这三个文件夹里面都各只有一个AndroidManifest.xml文件,文件只需要如下:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="package.name">
<application>
<meta-data android:name="CHANNEL_VALUE" android:value="360"/>
</application>
</manifest>