本章将介绍maven、gradle构建工具打包方式
Android多渠道打包(一):基础多渠道打包
Android多渠道打包(二):友盟多渠道打包
Android多渠道打包(三):美团多渠道打包
Android多渠道打包(四):360多渠道打包
Android多渠道打包(五):360多渠道打包+
Android多渠道打包(六):maven&gradle
Android多渠道打包(七):系列总结及展望
原理
都是采用在AndroidManifest.xml的节点中添加如下元素,构建时替换value值得方式。
实现
- Maven
Maven是一个软件项目管理和自动构建工具,配合使用android-maven-plugin插件,以及maven-resources-plugin插件可以很方便的生成渠道包,下面简要介绍下打包过程,更多Maven以及插件的使用方法请参考相关文档。
首先,在AndroidManifest.xml的节点中添加如下元素,用来定义渠道的来源:
<!-- 使用Maven打包时会用具体的渠道号替换掉${channel} -->
<meta-data
android:name="channel"
android:value="${channel}" />
定义好渠道来源后,接下来就可以在程序启动时读取渠道号了:
private String getChannel(Context context) {
try {
PackageManager pm = context.getPackageManager();
ApplicationInfo appInfo = pm.getApplicationInfo(context.getPackageName(), PackageManager.GET_META_DATA);
return appInfo.metaData.getString("channel");
} catch (PackageManager.NameNotFoundException ignored) {
}
return "";
}
要替换AndroidManifest.xml文件定义的渠道号,还需要在pom.xml文件中配置Resources插件:
<resources>
<resource>
<directory>${project.basedir}</directory>
<filtering>true</filtering>
<targetPath>${project.build.directory}/filtered-manifest</targetPath>
<includes>
<include>AndroidManifest.xml</include>
</includes>
</resource>
</resources>
准备工作已经完成,现在需要的就是实际的渠道号了。下面的脚本会遍历渠道列表,逐个替换并打包:
#!/bin/bash
package(){
while read line
do
mvn clean
mvn -Dchannel=$line package
done < $1
}
package $1
在前期渠道很少时这种方法还可以接受,但只要渠道稍微增多该方法就不再适用了,原因是每打一个包都要执行一遍构建过程,效率太低。
- gradle
以友盟的渠道统计为例,渠道信息一般在 AndroidManifest.xml中修改以下值:
<meta-data
android:name="UMENG_CHANNEL"
android:value="wandoujia" />
首先你必须在AndroidManifest.xml中的meta-data修改以下的样子:
<meta-data
android:name="UMENG_CHANNEL"
android:value="${UMENG_CHANNEL_VALUE}" />
其中${UMENG_CHANNEL_VALUE}
中的值就是你在gradle中自定义配置的值。
build.gradle文件就利用productFlavors这样写
productFlavors {
wandoujia {
manifestPlaceholders = [UMENG_CHANNEL_VALUE: "wandoujia"]
}
baidu {
manifestPlaceholders = [UMENG_CHANNEL_VALUE: "baidu"]
}
c360 {
manifestPlaceholders = [UMENG_CHANNEL_VALUE: "c360"]
}
uc {
manifestPlaceholders = [UMENG_CHANNEL_VALUE: "uc"]
}
}
其中[UMENG_CHANNEL_VALUE: "wandoujia"]
就是对应${UMENG_CHANNEL_VALUE}
的值。
不过现在有个更加简洁的写法
productFlavors {
wandoujia {...}//支持在{}定义属性
baidu {...}
c360 {...}
uc {...}
productFlavors.all { flavor ->
flavor.manifestPlaceholders = [UMENG_CHANNEL_VALUE: name]
}
}
或者像下面这样设置
<!--1、添加channels.properties渠道信息配置文件-->
#默认渠道
channel.default=paojiao
#全部渠道列表
channel.list=baidu,c360,uc
apply from: "../channels.gradle"
productFlavors {
for (int i = 0 ; i < channelArray.size(); i++) {
def channel = channelArray[i]
"${channel}"{
manifestPlaceholders = [CHANNEL_VALUE: channel]
}
}
}
在android studio中sync gradle在build下可以看到
直接在gradle中点击assemble
可构建所有渠道的包
单独点击对应渠道的assemble
比如assembleC360
可以单独构建出C360渠道的包
代码中获取渠道值如下代码
private String getChannel(Context context) {
try {
PackageManager pm = context.getPackageManager();
ApplicationInfo appInfo = pm.getApplicationInfo(context.getPackageName(), PackageManager.GET_META_DATA);
return appInfo.metaData.getString("channel");
} catch (PackageManager.NameNotFoundException ignored) {
}
return "";
}
优缺点
maven&gradle对于每个渠道都会单独构建一次,比较耗时,但是可以对各个渠道更加细化的定制。可以和Android多渠道打包(五):360多渠道打包+按实际情况选用。
渠道定制方法如下:
android {
...
defaultConfig {
minSdkVersion 8
versionCode 10
}
productFlavors {
flavor1 {
applicationId "com.example.flavor1"
versionCode 20
}
flavor2 {
applicationId "com.example.flavor2"
minSdkVersion 14
}
}
}
android {
...
flavorDimensions "abi", "version"
productFlavors {
freeapp {
dimension "version"
...
}
paidapp {
dimension "version"
...
}
arm {
dimension "abi"
...
}
mips {
dimension "abi"
...
}
x86 {
dimension "abi"
...
}
}
}
具体可参考new-build-system/user-guide
引用
new-build-system/user-guide
umeng 论坛
美团点评技术文章