《Gradle权威指南》--Android Gradle多渠道构建
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多渠道构建的更多相关文章
- 《Gradle权威指南》--Gradle插件
No1: 应用插件 apply plugin:'java' apply plugin:org.gradle.api.plugins.JavaPlugin apply plugin:JavaPlugin ...
- 《gradle权威指南》--Gradle入门
No1: Window下搭建Gradle:添加GRADLE_HOME环境变量,然后把GRADLE_HOME\bin添加到PATH系统变量里保存即可.完成后打开CMD,运行gradle -v来验证 No ...
- 《Gradle权威指南》--Gradle构建脚本基础
No1: 设置文件默认名是setting.gradle,放在根目录下,大多数作用都是为了配置子工程 No2: 一个Project包含很多个Task.Task就是一个操作,一个原子性的操作.其实它是Pr ...
- 《Gradle权威指南》--Gradle任务
No1: 多种方式创建任务 def Task ex41CreateTask1 = task(ex41CreateTask1) ex41CreateTask1.doLast{ println " ...
- 读书笔记--Android Gradle权威指南(下)
前言 最近看了一本书<Android Gradle 权威指南>,收获挺多,就想着来记录一些读书笔记,方便后续查阅. 本篇内容是基于上一篇:读书笔记--Android Gradle权威指南( ...
- 读书笔记--Android Gradle权威指南(上)
本篇文章已授权微信公众号 dasu_Android(大苏)独家发布 最近看了一本书<Android Gradle 权威指南>,对于 Gradle 理解又更深了,但不想过段时间就又忘光了,所 ...
- Gradle系列之Android Gradle插件
原文发于微信公众号 jzman-blog,欢迎关注交流. 通过前面几篇文章学习了 Gradle 基础知识以及 Gradle 插件相关的知识,关于 Gradle 及其插件相关知识请先阅读下面几篇文章: ...
- Gradle系列之Android Gradle基础配置
原文发于微信公众号 jzman-blog,欢迎关注交流. 通过前面几篇文章学习了 Gradle 基础知识以及 Gradle 插件相关的知识,关于 Gradle 及其插件相关知识请先阅读下面几篇文章: ...
- Gradle系列之Android Gradle高级配置
本篇文章主要在之前学习的基础上,从实际开发的角度学习如何对 Android Gradle 来进行自定义以满足不同的开发需求,下面是 Gradle 系列的几篇文章: Gradle系列之初识Gradle ...
随机推荐
- CF1009F Dominant Indices
传送门 还是放个链接让泥萌去学一下把 orzYYB 题目中要求的\(f_{x,j}\),转移是\(f_{x,j}=\sum_{y=son_x} f_{y,j-1}\),所以这个东西可以用长链剖分优化, ...
- HKE和他的小朋友(矩乘快速幂)
题面: 题目背景: HKE带着\(n\)个小朋友做游戏 题目描述: 现在有n个座位编号为\(1\)至\(n\),这些小朋友也编号\(1\)至\(n\).一开始所有小朋友都坐在相应的座位上.HKE的游戏 ...
- 说几个python与c区别的地方以及静态变量,全局变量的区别
一: python代码: a = 2 def b(): print a a = 4 print a b() 在b函数中,有a=4这样的代码,说明a是函数b内部的局部变量,而不是外部的那个值为2的全局变 ...
- B. Planning The Expedition
题目链接:http://codeforces.com/contest/1011/problem/B 题目大意: 输入的n,m代表n个人,m个包裹. 标准就是 每个人一开始只能选定吃哪一个包裹里的食物, ...
- 数据库运维平台~inception回滚功能
一 简介:inception的另一个激动人心的功能,很强大.二 功能简介: inception会针对已经执行sql语句进行1 记录 2 生成回滚语句三 备份: 1 启用远程备份机制(强烈建议一台单 ...
- SpringBoot几个重要的事件回调、监听机制
(1).需要配置在META-INF/Spring.factories 1.ApplicationContextInitializer // // Source code recreated from ...
- SpringBoot使用thymeleaf模板引擎
(1).添加pom依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactI ...
- CROSSUI桌面工具 分布加载模块(Distributed UI Module) 与 主模块Module 之间数据传输!
CROSSUI 基于 NW,如何在模Module 之间(主index.js and module1.js)传输数据? http://www.crossui.com/Forum/post577.htm ...
- python令牌桶算法
import time class TokenBucket(object): # rate是令牌发放速度,capacity是桶的大小 def __init__(self, rate, capacity ...
- phantomjs 解码url
以下为部分代码: var htmlnodeInfo=(allADUrlElements.snapshotItem(i).getAttribute("href").match(/\* ...