No1:

Build Variant = Build Type + Product Flavor

Build Variant:构建的产物

Build Type:构建的类型

Product Flavor:构建的渠道

android{
compileSdkVersion 23
buildToolsVersion "23.0.1"
productFlavors{
google{}
baidu{}
}
}

No2:

Flurry多渠道和友盟多渠道构建

Flurry本身没有渠道的概念,它有Application,所以可以把一个Application当成一个渠道,每个Application都有一个Key,称为Flurry Key;友盟本身有渠道的概念,只要我们在AndroidManifest.xml配置标注即可。

android{
compileSdkVersion
buildToolsVersion "23.0.1" defaultConfig{
applicationId "org.flysnow.app.example112"
minSdkVersion
targetSdkVersion
versionCode
versionName '1.0.0'
resConfig 'zh'
}
buildTypes{
release{
minifyEnabled true
projuardFiles getDefaultProguardFile('proguard-android.txt'),'proguard-rules.pro'
zipAlignEnabled true
}
}
productFlavors{
google{
buildConfigField 'String','FLURRY_KEY','"BHJKOUASDASFKLZL"'
}
baidu{
buildConfigField 'String','FLURRY_KEY','"HJSDKHFJDSF23478"'
}
}
}

这样每个渠道的BuildConfig类中都会有名字为FLURRY_KEY常量定义

友盟渠道是在AndroidManifest.xml中配置的

<meta-data android :value="Channel ID" android:name="UMENG_CHANNEL"/>

其中Channel ID就是渠道值

No3:

多渠道构建定制--其实就是对Android Gradle插件的ProductFlavor的配置,通过配置ProductFlavor达到灵活地控制每个渠道的目的

applicationId就是该渠道的包名

android{
...
productFlavors{
google{
applicationId "org.flysnow.app.example112.google"
}
}
}

consumerProguardFiles--只对Android库项目有用

android{
productFlavors{
google{
consumerProguardFiles 'proguard-rules.pro','proguard-android.txt'
}
}
}

testApplicationId--测试包名

android{
...
productFlavors{
google{
testApplicationId "org.flysnow.app.example112.test"
}
}
}

testFunctionalTest--是否为功能测试,testHandleProfiling--是否启用分析功能

android{
productFlavors{
google{
testFunctionalTest true
testHandleProfiling true
}
}
}

testInstrumentationRunner--用来配置运行测试使用的Instrumentation Runner的类名

android{
productFlavors{
google{
testInstrumentationRunner 'android.test.InstrumentationTestRunner'
}
}
}

testInstrumentationRunnerArguments--用来配置Instrumentation Runner使用的参数

android{
productFlavors{
google{
testInstrumentationRunnerArguments.put("coverage",'true')
}
}
}

useJack--用于标记是否启用Jack和Jill这个全新的、高性能的编译器

android{
productFlavors{
google{
useJact true
}
}
}

dimension --多维度,理解为对ProdcutFlavor进行分组。用flavorDimensions声明维度,才能在ProductFlavor中使用

android{
flavorDimensions "abi","version"//优先级:abi>version>defaultConfig
productFlavors{
free{
dimension 'version'
}
paid{
dimension 'version'
}
x86{
dimension 'abi'
}
arm{
dimension 'abi'
}
}
}

会生成

ArmFreeDebug

ArmFreeRelease

ArmPaidDebug

ArmPaidRelease

x86FreeDebug

x86FreeRelease

x86PaidDebug

x86PaidRelease

No4:

提高多渠道构建的效率-美团方案

1)利用Android Gradle打一个基本包

2)基于该包复制一个,文件名要能区分出产品、打包时间、版本、渠道等

3)对复制出来的apk文件进行修改,在其META-INF目录下新增空文件,但是空文件的文件名要有意义,必须包含能区分渠道的名字,如:mtchannel_google

4)重复步骤2)步骤3生成我们所需的所有渠道包apk,这个可以使用Python这类脚本来做

5)生成了我们所有发布渠道的apk包

使用:

在apk启动(Application onCreate)时候,读取我们写apk中META-INF目录下的前缀mtchannel_文件,如果找到的话,把文件名取出来,然后就可以得到渠道标识(Google)了

《Gradle权威指南》--Android Gradle多渠道构建的更多相关文章

  1. 《Gradle权威指南》--Gradle插件

    No1: 应用插件 apply plugin:'java' apply plugin:org.gradle.api.plugins.JavaPlugin apply plugin:JavaPlugin ...

  2. 《gradle权威指南》--Gradle入门

    No1: Window下搭建Gradle:添加GRADLE_HOME环境变量,然后把GRADLE_HOME\bin添加到PATH系统变量里保存即可.完成后打开CMD,运行gradle -v来验证 No ...

  3. 《Gradle权威指南》--Gradle构建脚本基础

    No1: 设置文件默认名是setting.gradle,放在根目录下,大多数作用都是为了配置子工程 No2: 一个Project包含很多个Task.Task就是一个操作,一个原子性的操作.其实它是Pr ...

  4. 《Gradle权威指南》--Gradle任务

    No1: 多种方式创建任务 def Task ex41CreateTask1 = task(ex41CreateTask1) ex41CreateTask1.doLast{ println " ...

  5. 读书笔记--Android Gradle权威指南(下)

    前言 最近看了一本书<Android Gradle 权威指南>,收获挺多,就想着来记录一些读书笔记,方便后续查阅. 本篇内容是基于上一篇:读书笔记--Android Gradle权威指南( ...

  6. 读书笔记--Android Gradle权威指南(上)

    本篇文章已授权微信公众号 dasu_Android(大苏)独家发布 最近看了一本书<Android Gradle 权威指南>,对于 Gradle 理解又更深了,但不想过段时间就又忘光了,所 ...

  7. Gradle系列之Android Gradle插件

    原文发于微信公众号 jzman-blog,欢迎关注交流. 通过前面几篇文章学习了 Gradle 基础知识以及 Gradle 插件相关的知识,关于 Gradle 及其插件相关知识请先阅读下面几篇文章: ...

  8. Gradle系列之Android Gradle基础配置

    原文发于微信公众号 jzman-blog,欢迎关注交流. 通过前面几篇文章学习了 Gradle 基础知识以及 Gradle 插件相关的知识,关于 Gradle 及其插件相关知识请先阅读下面几篇文章: ...

  9. Gradle系列之Android Gradle高级配置

    本篇文章主要在之前学习的基础上,从实际开发的角度学习如何对 Android Gradle 来进行自定义以满足不同的开发需求,下面是 Gradle 系列的几篇文章: Gradle系列之初识Gradle ...

随机推荐

  1. 发现一sonar-runner bug

    最近在使用sonar-runner做代码扫描, 在windows环境运行多模块的扫描ok,但是在linux上sonar-runner扫描多模块报错: 先贴sonar-project.propertie ...

  2. 第16月第24天 find iconv sublime utf-8

    1. find . -type f -exec echo {} \; find src -type f -exec sh -c "iconv -f GB18030 -t UTF8 {} &g ...

  3. CentOS中安装Nginx

    一.背景 最近在写一些自己的项目,用到了nginx,所以自己动手来在Centos7上安装nginx,以下是安装步骤. 二.基本概念以及应用场景 1.什么是nginx Nginx是一款使用C语言开发的高 ...

  4. 【TensorFlow】tf.nn.softmax_cross_entropy_with_logits的用法

    在计算loss的时候,最常见的一句话就是 tf.nn.softmax_cross_entropy_with_logits ,那么它到底是怎么做的呢? 首先明确一点,loss是代价值,也就是我们要最小化 ...

  5. POI导出Excel(xls、xlsx均可以,也支持图片)——(三)

    Jar包

  6. ProcessHacker可编译版本

    说明 做一个批量进程内搜索字符串的工具. 试了processhacker-2.39-src.zip. https://sourceforge.net/projects/processhacker/fi ...

  7. 蓝牙HID协议笔记【转】

    蓝牙HID协议笔记 转自:http://blog.sina.com.cn/s/blog_69b5d2a50101emll.html 1.概述     The Human Interface Devic ...

  8. kafka系列七、kafka核心配置

    一.producer核心配置 1.acks :发送应答(默认值:1) 生产者在考虑完成请求之前要求leader收到的确认的数量.这控制了发送的记录的持久性.允许以下设置: acks=0:设置为0,则生 ...

  9. 用nodejs搭建BS环境

    var http = require('http'); http.createServer(function (req, res) {res.writeHead(200, {'Content-Type ...

  10. VS "以下文件中的行尾不一致,要将行尾标准化吗?"

    原文地址:http://www.cnblogs.com/yymn/p/6852857.html 这是由Windows和Unix不同的标准引起的...即“回车”和“换行”的问题... “回车”和“换行” ...