Android 多渠道打包之Gradle

时间:2016年5月26日19:48:19

作者:JustDo23

说明:多渠道打包主要是在使用友盟统计的时候需要使用的。之前在Eclipse上要实现多渠道打包真是各种坑呀,ANT真是各种难用呀。

01. 渠道信息

多渠道主要指的是应用市场,在Google被墙掉之后,豌豆荚,360,百度手机,应用宝等等各种应用市场就雨后春笋蓬勃发展了。呵呵......

渠道信息主要是在AndroidManifest.xml中的application标签下面添加meta-data标签进行应用市场的标记。集成友盟添加如下的代码:


其中的value值就是用来指定渠道ID的,将${UMENG_CHANNEL_VALUE}替换成自己定义的各个渠道ID就可以了。

02. 渠道ID命名规范

渠道命名规范,以下代码复制与友盟官方文档。(拿过来撑撑场面)

  1. 可以由英文字母、阿拉伯数字、下划线、中划线、空格、括号组成,可以含汉字以及其他明文字符,但是不建议使用中文命名,会出现乱码。
  2. 首尾字符不可以为空格
  3. 不要使用纯数字作为渠道ID
  4. 最多256个字符
  5. "unknown" 及其各种大小写形式,作为友盟保留的字段,不可以作为渠道名

03. 代码获取渠道ID

在代码中可以获取到AndroidManifest.xml中定义的很多数据。在Activity中使用如下的代码可以进行渠道ID的获取。代码如下:

ApplicationInfo appInfo = this.getPackageManager().getApplicationInfo(getPackageName(), PackageManager.GET_META_DATA);
String msg=appInfo.metaData.getString("UMENG_CHANNEL");// 获取Bundle之后获取键值对
Log.d(TAG, " msg == " + msg);

在网上有看到如下的代码:

private String getChannel(Context context) {
    try {
        PackageManager pm = context.getPackageManager();
        ApplicationInfo appInfo = pm.getApplicationInfo(context.getPackageName(), PackageManager.GET_META_DATA);
        return appInfo.metaData.getString("UMENG_CHANNEL");
    } catch (PackageManager.NameNotFoundException ignored) {
    }
    return "NO BB";
}

04. 初步配置

首先,看下简单的配置代码

manifestPlaceholders = [UMENG_CHANNEL_VALUE: "JustDo23"]

这行代码主要的作用就是对AndroidManifest.xml${UMENG_CHANNEL_VALUE}进行替换。

其次,这行代码主要放在 app目录下bulid.gradledefaultConfig下面。具体代码如下:

apply plugin: 'com.android.application'

android {
    compileSdkVersion 23
    buildToolsVersion "23.0.2"

    defaultConfig {
        applicationId "com.justdo.duoqudao"
        minSdkVersion 14
        targetSdkVersion 23
        versionCode 1
        versionName "1.0"
        manifestPlaceholders = [UMENG_CHANNEL_VALUE: "JustDo23"]// 设置渠道ID
    }
}

最后,这种可以理解为默认设置,或者,只有一个渠道包(当然这种情况就不用这么复杂了)

05. 升级配置

需要多个渠道的时候,可以在build.gradle文件里添加ProductFlavors配置,该配置的位置是和defaultConfig同等级别的。ProductFlavors其实就是可定义product特性。具体代码如下:

apply plugin: 'com.android.application'

android {
    compileSdkVersion 23
    buildToolsVersion "23.0.2"

    defaultConfig {
        applicationId "com.justdo.duoqudao"
        minSdkVersion 14
        targetSdkVersion 23
        versionCode 1
        versionName "1.0"
        manifestPlaceholders = [UMENG_CHANNEL_VALUE: "JustDo23"]
    }
    
    productFlavors {// 多渠道打包
        BaiDu {
            manifestPlaceholders = [UMENG_CHANNEL_VALUE: "BaiDu"]
        }
        WanDouJia {
            manifestPlaceholders = [UMENG_CHANNEL_VALUE: "WanDouJia"]
        }
        XiaoMi {
            manifestPlaceholders = [UMENG_CHANNEL_VALUE: "XiaoMi"]
        }
    }
}

注意: 如果使用这种方式,那么上一步中写到的初步配置就不会起作用了。平常debug安装(在Android Studio中Run as)不会起作用,进行打包的是同样不会起作用。debug模式默认会执行productFlavors配置下的第一个(这里的第一个是名称排序的第一个,并不是写的位置的第一个)。

06. 再次升级配置

很明显在上面的代码中有太多的复用代码。重复就显得和Low了。其实有更简洁的配置方法。代码如下:

apply plugin: 'com.android.application'

android {
    compileSdkVersion 23
    buildToolsVersion "23.0.2"

    defaultConfig {
        applicationId "com.justdo.duoqudao"
        minSdkVersion 14
        targetSdkVersion 23
        versionCode 1
        versionName "1.0"
        manifestPlaceholders = [UMENG_CHANNEL_VALUE: "JustDo23"]
    }

    productFlavors {// 多渠道打包
        JustDo23 {}
        BaiDu {}
        WanDouJia {}
        XiaoMi {}
    }
    productFlavors.all { flavor ->
        flavor.manifestPlaceholders = [UMENG_CHANNEL_VALUE: name]
    }
}

至此,代码就简洁很多了,使用Gradle进行多渠道打包的配置基本完成。

后记

  • 本片文章只是记录了自己在Android Studio下利用Gradle进行多渠道打包的配置,比较简单,其实网上有更多更详细的介绍。
  • 对于多渠道打包的之后远不止这些,推荐美团技术中的两篇文章,都是在14年发表的文章,NB。
    • 生成渠道包:http://tech.meituan.com/mt-apk-packaging.html
    • 适配渠道包:http://tech.meituan.com/mt-apk-adaptation.html
  • 新资源,在github上看到https://github.com/mcxiaoke/gradle-packer-plugin看介绍5秒钟可以打1000个渠道包,好快,看下面的配置很多,没有实际动手操作。先贴出来晒晒。
  • 再来一篇http://geek.csdn.net/news/detail/76488#rd

你可能感兴趣的:(Android 多渠道打包之Gradle)