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. C语言入门教程-(6)运算符

    1.运算符概述 运算符是一种编译器执行特定的数学或逻辑操作的符号.C语言提供了以下类型的运算符: 算术运算符 关系运算符 逻辑运算符 位运算符 赋值运算符 条件运算符 其他运算符 2.算术运算符 算术 ...

  2. Educational Codeforces Round 47 (Rated for Div. 2) 题解

    题目链接:http://codeforces.com/contest/1009 A. Game Shopping 题目: 题意:有n件物品,你又m个钱包,每件物品的价格为ai,每个钱包里的前为bi.你 ...

  3. CentOS6.8配置SonarQube Scanner配合SonarQube使用

    下载最新的SonarQube Scanner压缩包  https://docs.sonarqube.org/display/SCAN/Analyzing+with+SonarQube+Scanner ...

  4. pandas 定位 loc,iloc,ix

    In [114]: df Out[114]: A B C D 2018-06-30 0.318501 0.613145 0.485612 0.918663 2018-07-31 0.614796 0. ...

  5. cmake使用示例与整理总结

    转自: http://blog.csdn.net/wzzfeitian/article/details/40963457/ 本文代码托管于github  https://github.com/carl ...

  6. Reverse Words in a String I & Reverse Words in a String II

    Reverse Words in a String I Given an input string, reverse the string word by word. For example,Give ...

  7. 嵌入式系统C编程之堆栈回溯

    前言 在嵌入式系统C语言开发调试过程中,常会遇到各类异常情况.一般可按需添加打印信息,以便观察程序执行流或变量值是否异常.然而,打印操作会占用CPU时间,而且代码中添加过多打印信息时会显得很凌乱.此外 ...

  8. windows环境用python修改环境变量的注意点(含代码)

    1.部分环境变量字段需要保留原来的值,只是做添加,不可以替换 2.Path和PATH对于python来说是一样的,也就是说存在名为Path的环境变量时,添加PATH的环境变量,会覆盖原有的Path环境 ...

  9. listener failed: zbx_tcp_listen() fatal error: unable to serve on any address [[-]:20050]

    故障现象: 客户端报错:service zabbix-agent 启动后,端口没有被正常监听,服务端也无法正常连接 将客户端改为二进制文件安装也不能正常启动/usr/local/zabbix/sbin ...

  10. centos下httpd-2.4的编译安装

    httpd-2.4编译安装     依赖于更高版本的apr和apr-util      apr 全称  apache portable runtime 首先停用低版本的httpd服务 service ...