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

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


评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值