您的位置:首页 > 移动开发 > Android开发

Android多渠道打包(六):maven&gradle

2016-10-06 15:21 281 查看
本章将介绍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 论坛

美团点评技术文章
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息