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

来源:互联网 发布:做美工的配置要多少? 编辑:程序博客网 时间:2024/05/14 03:38

本章将介绍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/bashpackage(){    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 论坛
美团点评技术文章


1 0
原创粉丝点击