狠狠撸

狠狠撸Share a Scribd company logo
2016年4月22日
刘俊
IPD创新产物部
Android Gradle
从入门到GG
第1课: Greet
? 介绍Android Gradle 插件的基本DSL使用
第1课: Greet
引用插件
buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:2.1.0-beta3'
// NOTE: Do not place your application dependencies here;
// they belong in the individual module build.gradle files
}
}
Gradle每次运行的时候, 初始化之时, 将 android gradle jar包加
载到 Gradle 运行时环境中, 而插件就在这些jar包内
Android Studio新建的工程会自动在rootProject的build.gradle
中生成以上脚本(一般就是根目录的build.gradle中)
引用插件
apply plugin 之后, 你就可以使用
android {
// configurations
}
DSL入口了
apply plugin: 'com.android.application'
引用插件
-1. 很可惜, android gradle相关插件并不在GPCR里
-2. 此处的 id 是apply的插件id, 并不是 Artifact Id, 因为一个
Artifact的Jar包, 里面可以有几个插件, 比如android的插件id
com.android.application 和 com.android.library
都在'com.android.tools.build:gradle:2.1.0-beta3'
这个artifact里面
plugins {
id "com.android.application" version "2.1.0-beta3"
}
对于 Gradle Plugin Central Repository(plugins.gradle.org)
里的插件, 可以简化为 plugins { id “Id” version “ver”}
Artifact
'com.android.tools.build:gradle:2.1.0-beta3@jar'
? group:id:version:ext
? group: 类似android packageName
? id: 该jar包的名字, 类似android applicationName
? version: 版本号, 类似android versionName
? ext: 扩展, 比如 jar, aar, txt等文件扩展, 比如某个
Android库, 既提供了jar包, 也提供了aar包, 这时就
可以通过ext来区分你想要哪一个
Artifact
'com.android.tools.build:gradle:2.1.0-beta3'
dependencies {
compile 'com.meizu.cloud.pushsdk:internal:3.0.3-beta@aar'
proguard 'com.meizu.cloud.pushsdk:internal:3.0.3-beta@pro'
...
compile 'io.reactivex:rxjava:1.1.3'
compile(group:'io.reactivex', id: 'rxjava', version: '1.1.3')
一个Artifact依赖, 可以使用 group:id:version:ext 来定位到
等价于
Artifact
compile 'io.reactivex:rxjava:1.1.3'
compile "io.reactivex:rxjava:1.1.+" // 1.1.最新版本**
compile "io.reactivex:rxjava:1.+" // 1.最新版本**
compile "io.reactivex:rxjava:+" // 最新版本
在Android Studio中, 使用了 + 号的依赖引用, 会被标黄警告
在版本管理中, + 号会导致你的 TAG分支, SNAPSHOT无法百分
百还原当时的编译
所以, 尽量避免使用 +
repositories {}
repositories {
jcenter()
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
testCompile 'junit:junit:4.12'
compile 'com.android.support:appcompat-v7:23.3.0'
compile 'com.android.support:design:23.3.0'
}
dependencies中的远程模块依赖, 来源在repositories中声明
但是repositories是project的入口, DSL中project可以省略
即 repositories {} 等价于 project.repositories {}
这意味着, 你只能对当前build.gradle配置的project有用
其他模块, 你得重新定义它的 repositories {}
repositories {}
而之前讲到过, buildscript {}是在Gradle初始化的时候首先加载
buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:2.1.0-beta3'
}
}
buildscript{} 中配置的运行时环境依赖, 对所有模块都有效
allprojects {
repositories {
jcenter()
}
}
allprojects{}: 该Gradle DSL入口的意思是
对project(模块)及其子模块都配置
将通用的配置放在rootProject的allprojects
中吧
休息时间
课程的随堂 Sample 以及 presentation 在如下
git 中
http://git.ipd.meizu.com/AnR/android-gradle-samples
[Github用户移步] https://github.com/Jween/android-gradle-samples
android { }
? defaultConfig { }: 默认配置, 所有 flavor 都会继承
? sourceSets { }: 对代码/资源的配置, android 重新对 gradle sourceSets 进行
了针对 Android 的实现, 叫做 AndroidSourceSet
? productFlavors { }: 模块所有 flavor, 不同的 flavor, 可以打包出不同的 apk
? buildTypes { }: 模块所有 build 类型, 不同的类型, 可以打包出不同的 apk
? signingConfig { }: App 模块打包 apk 的签名配置
? splits { }: Apk 分割, 全资源apk, 根据分辨率与abi分割成若干个小apk
? *Options { }: dexOptions { }, packagingOptions { }, aaptOptions { },
lintOptions { }, compileOptions { }, adbOptions { }, testOptions { }
? 你可以在 http://google.github.io/android-gradle-dsl/current/com.android.build.gradle.BaseExtension.html 这里查
看详细的 DSL, 本节课只讲常用到的 android DSL, 标红的重点讲述
android.defaultConfig { }
defaultConfig {
applicationId "com.meizu.sample.basicdsl"
minSdkVersion 22
targetSdkVersion 23
versionCode 1
versionName "1.0"
}
以上是 Android Studio 新建一个工程的时候, 自动配置的, library
模块的话无法配置applicationId, 毕竟 library 不是 application
为了方便理解, 先抛出一些概念
1. defaultConfig 本质上就是 ProductFlavor
2. 把 src/main (android.sourceSets.main) 看作是默认的 flavor
source set, 那么, defaultConfig 就是对 main 这个 flavor 的配
置
3. 等会儿讲完 ProductFlavor, 我们再回来看看 defaultConfig
android.productFlavors { }
假设我们开发了一款新产物, 需要区分免费版与旗舰版怎么办?
productFlavors {
free { // 免费版本
}
utlra { // 旗舰版本
}
}
android.sourceSets.free { }
android.sourceSets.ultra { }
上一节课, 我们讲了对 sourceSets.main { } 的一些配置
当我们添加了 free 与 ultra 之后, 你同样可以配置
sourceSets.free { } 以及 sourceSets.ultra { }
默认的路径在 main 文件夹同级目录各 flavor 同名文件夹
android.productFlavors { }
我们希望区分免费版与旗舰版的包名怎么办?
productFlavors {
free { // 免费版本
applicationIdSuffix ".free" // 免费版包名后缀 .free
}
utlra { // 旗舰版本
applicationIdSuffix ".ultra" // 旗舰版包名后缀 .ultra
}
}
同理,你可以区分应用版本, Android min targe版本等, 你可以区
分签名signingConfig, 区分http://google.github.io/android-gradle-
dsl/current/com.android.build.gradle.internal.dsl.ProductFlavor.html 中的一切
android.productFlavors { }
与此同时, Gradle会自动生成一个 BuildConfig 类, 包含当前选定
的 variant 的 applicationId, Debug开关, flavor, buildType, 版本等
public final class BuildConfig {
public static final boolean DEBUG = Boolean.parseBoolean("true");
public static final String APPLICATION_ID = "com.meizu.sample.basicdsl.free";
public static final String BUILD_TYPE = "debug";
public static final String FLAVOR = "free";
public static final int VERSION_CODE = 1;
public static final String VERSION_NAME = "1.0";
}
选择 Build Variant 一般在
Android Studio 左下角
android.buildTypes { }
我们可以看到 Build Variant
选定的是 freeDebug
buildTypes 默认有 debug 和 release
BuildType 类似 ProductFlavor, 但是多了与编译深度相关的
proguard代码混淆, 资源Shrink, debug开关, 等等
buildTypes {
release {
minifyEnabled true // 代码混淆
shrinkResources true // 移除没用到的资源和代码
proguardFiles getDefaultProguardFile('proguard-android.txt'),
'proguard-rules.pro'
}
}
Build Variant
我们可以看到 Build Variant
选定的是 freeDebug
Build Variant = [flavors, buildTypes].combinations()
[['a', 'b'],[1, 2, 3]].combinations() == [['a', 1], ['b', 1], ['a', 2], ['b', 2], ['a', 3], ['b', 3]]
[[free, ultra], [debug, release]].combinations() ==
[[free,debug], [ultra, debug], [free, release], [ultra, release]]
? freeDebug, freeRelease, ultraDebug, ultraRelease
Build Variant
variant! 想想 groovy 的
combinations!
flavor buildType variant
free debug
freeDebug
freeRelease
ultra release
ultraDebug
ultraRelease
Build Variant
记住: 当你在 Build Variant 里面选定了一个 Variant 的时候,
比如, 这里的 freeDebug, Android Studio当前的对项目的配置
就是根据 free 的 flavor 以及 debug 的 buildType 来的,
你需要确保, 所有的 variant 都能正常编译
android.productFlavors { }
现在有免费版和旗舰版了, 要发应用商店了, 需要区分各个应
用商店的渠道怎么办?
flavorDimensions "channel", "type" // flavor 维度声明
productFlavors {
free { // 免费版本
dimension "type" // type 维度的 free flavor
applicationIdSuffix ".free" // 免费版包名后缀 .free
}
utlra { // 旗舰版本
dimension "type" // type 维度的 ultra flavor
applicationIdSuffix ".ultra" // 旗舰版包名后缀 .ultra
}
flyme { // Flyme 渠道
dimension "channel" // channel 维度的 flyme flavor
}
tap { // 应用宝 渠道
dimension "channel" // channel 维度的 tap flavor
}
}
android.productFlavors { }
注意 flavorDimensions 后参数的顺序, 这个顺序就是维度的顺序
flavorDimensions "channel", "type" // flavor 维度声明
命令行编译举例: 编译 flyme 渠道, 免费版本, 正式发布包
>./gradlew –p app/ assembleFlymeFreeRelease
或者偷懒, 省略每个单词后面的字母也可以
>./gradlew –p app/ assFlyFreeRel
后续你还会看到大量驼峰法命名
Build Variant
我们现在有 channel 维度, type 维度, 以及 buildType 维度 了
打包的时候, 对每个维度的 sourceSet 的资源选取顺序, 只要记住
前面的覆盖后面的, 除了buildType, 优先级最高的是 buildType
比如 flymeFreeDebug, debug > flyme > free
即 flyme/中的同名资源会覆盖free/的, debug/的会覆盖flyme/
小技巧: 永远在后面加上 main 这个默认的基本 sourceSet
flymeFreeDebugMain <=> debug > flyme > free > main
Build Variant
各个优先级资源覆盖所涉及的 ResourceMerger, ManifestMerger
在后续课程中详细讲解
例如: 高德地图 key 根据编译类型选择, 不同的渠道包
AndroidManifest 结点数据不一样, 不同 flavor 的资源不一样, 代
码不一样等等, 在讲 ResourceMerger, ManifestMerger 的时候详
解
proguard
proguardFiles, proguardFile 指定 proguard 规则文件,
建议对引用的第三方 progaurd 文件, 区分存储
所有 开启了混淆 打包的 retrace 文件在
build/outpus/mappings/ 文件夹下
buildTypes {
release {
minifyEnabled true // 代码混淆
shrinkResources true // 移除没用到的资源和代码
proguardFiles getDefaultProguardFile('proguard-android.txt'),
'proguard-rules.pro'
progaurdFile "proguard-rxjava.pro"
proguardFile "proguard-realm.pro"
proguardFile "proguard-retrofit.pro"
}
}
android.sourceSets { }
上节课, 我们已经玩弄过 main source set, 现在我们引入 variant
sourceSets {
free { // 对 src/free/ source set 进行配置 (flavor)
}
release { // 对 src/release/ source set 进行配置 (buildType)
}
freeFlyme { // 对 src/freeFlyme/ 额外 source set 进行配置
}
}
我们对 main 可以配置的任何东西,
都可以对其他 source set配置
freeFlyme { }: 按照之前驼峰法顺序, 随意截取一段出来, 都可以
这些额外 source set 一般很少用到, 除非极其针对的业务需求
Demo
Demo实战…
2016年4月22日
刘俊
这将是一个系列课程,
每周一节课
IPD创新产物部
课后任务
samples内有BasicDSL 工程, 对免费和旗舰版的
Application Name 后追加 免费版 以及 旗舰版
tips: string.xml 文件覆盖
http://git.ipd.meizu.com/AnR/android-gradle-samples
记得使用自己的邮箱名作为分支名PR给我
[Github用户移步] https://github.com/Jween/android-gradle-samples
Ad

Recommended

Android gradle 从入门到gg 2
Android gradle 从入门到gg 2
Jun Liu
?
Android gradle 从入门到gg 0
Android gradle 从入门到gg 0
Jun Liu
?
Android gradle 从入门到gg 3
Android gradle 从入门到gg 3
Jun Liu
?
[DEPRECATED]Gradle flavor
[DEPRECATED]Gradle flavor
Jun Liu
?
簡單上手Android studio
簡單上手Android studio
琨堯 林
?
Clojure cnclojure-meetup
Clojure cnclojure-meetup
sunng87
?
极速 Angular 开发:效能调校技巧 (ngChina 2019)
极速 Angular 开发:效能调校技巧 (ngChina 2019)
Will Huang
?
如何與 Git 優雅地在樹上唱歌
如何與 Git 優雅地在樹上唱歌
Mu Chun Wang
?
20170217 julia小程式到專案發布之旅
20170217 julia小程式到專案發布之旅
岳華 杜
?
Swagger
Swagger
Yan-ren Tsai
?
Android 2.2 手機應用程式設計:第四章 第一個程式
Android 2.2 手機應用程式設計:第四章 第一個程式
Robert Chi
?
Android 智慧型手機程式設計
Android 智慧型手機程式設計
Kyle Lin
?
Mvp in practice
Mvp in practice
彥彬 洪
?
應用 Sikuli 在 Android 設備上執行自動化測試
應用 Sikuli 在 Android 設備上執行自動化測試
Jz Chang
?
快快樂樂學會 Angular 2 網站開發框架 (Modern Web 2016)
快快樂樂學會 Angular 2 網站開發框架 (Modern Web 2016)
Will Huang
?
Git flow 與團隊合作
Git flow 與團隊合作
Bo-Yi Wu
?
Gradle 和 Android Studio --- Jason Ko
Gradle 和 Android Studio --- Jason Ko
力中 柯
?
用 Go 語言 打造微服務架構
用 Go 語言 打造微服務架構
Bo-Yi Wu
?
Flutter 踩雷心得
Flutter 踩雷心得
Weizhong Yang
?
給 iOS 工程師的 Flutter 開發
給 iOS 工程師的 Flutter 開發
Weizhong Yang
?
20170905 dev ops in hiiir
20170905 dev ops in hiiir
Isaac Tseng
?
Using google appengine_1027
Using google appengine_1027
Wei Sun
?
Go 語言基礎簡介
Go 語言基礎簡介
Bo-Yi Wu
?
向箩辩耻别谤测学习
向箩辩耻别谤测学习
jay li
?
用 Go 語言打造 DevOps Bot
用 Go 語言打造 DevOps Bot
Bo-Yi Wu
?
用 Drone 打造 輕量級容器持續交付平台
用 Drone 打造 輕量級容器持續交付平台
Bo-Yi Wu
?
ModernWeb 2017 angular component
ModernWeb 2017 angular component
Chieh Kai Yang
?
Git 經驗分享
Git 經驗分享
Mu Chun Wang
?
Reactive X 响应式编程
Reactive X 响应式编程
Jun Liu
?
不同尺寸與解析度的螢幕下,Android 程式 UI 的設計與解決方式
不同尺寸與解析度的螢幕下,Android 程式 UI 的設計與解決方式
信宏 陳
?

More Related Content

What's hot (20)

20170217 julia小程式到專案發布之旅
20170217 julia小程式到專案發布之旅
岳華 杜
?
Swagger
Swagger
Yan-ren Tsai
?
Android 2.2 手機應用程式設計:第四章 第一個程式
Android 2.2 手機應用程式設計:第四章 第一個程式
Robert Chi
?
Android 智慧型手機程式設計
Android 智慧型手機程式設計
Kyle Lin
?
Mvp in practice
Mvp in practice
彥彬 洪
?
應用 Sikuli 在 Android 設備上執行自動化測試
應用 Sikuli 在 Android 設備上執行自動化測試
Jz Chang
?
快快樂樂學會 Angular 2 網站開發框架 (Modern Web 2016)
快快樂樂學會 Angular 2 網站開發框架 (Modern Web 2016)
Will Huang
?
Git flow 與團隊合作
Git flow 與團隊合作
Bo-Yi Wu
?
Gradle 和 Android Studio --- Jason Ko
Gradle 和 Android Studio --- Jason Ko
力中 柯
?
用 Go 語言 打造微服務架構
用 Go 語言 打造微服務架構
Bo-Yi Wu
?
Flutter 踩雷心得
Flutter 踩雷心得
Weizhong Yang
?
給 iOS 工程師的 Flutter 開發
給 iOS 工程師的 Flutter 開發
Weizhong Yang
?
20170905 dev ops in hiiir
20170905 dev ops in hiiir
Isaac Tseng
?
Using google appengine_1027
Using google appengine_1027
Wei Sun
?
Go 語言基礎簡介
Go 語言基礎簡介
Bo-Yi Wu
?
向箩辩耻别谤测学习
向箩辩耻别谤测学习
jay li
?
用 Go 語言打造 DevOps Bot
用 Go 語言打造 DevOps Bot
Bo-Yi Wu
?
用 Drone 打造 輕量級容器持續交付平台
用 Drone 打造 輕量級容器持續交付平台
Bo-Yi Wu
?
ModernWeb 2017 angular component
ModernWeb 2017 angular component
Chieh Kai Yang
?
Git 經驗分享
Git 經驗分享
Mu Chun Wang
?
20170217 julia小程式到專案發布之旅
20170217 julia小程式到專案發布之旅
岳華 杜
?
Android 2.2 手機應用程式設計:第四章 第一個程式
Android 2.2 手機應用程式設計:第四章 第一個程式
Robert Chi
?
Android 智慧型手機程式設計
Android 智慧型手機程式設計
Kyle Lin
?
應用 Sikuli 在 Android 設備上執行自動化測試
應用 Sikuli 在 Android 設備上執行自動化測試
Jz Chang
?
快快樂樂學會 Angular 2 網站開發框架 (Modern Web 2016)
快快樂樂學會 Angular 2 網站開發框架 (Modern Web 2016)
Will Huang
?
Git flow 與團隊合作
Git flow 與團隊合作
Bo-Yi Wu
?
Gradle 和 Android Studio --- Jason Ko
Gradle 和 Android Studio --- Jason Ko
力中 柯
?
用 Go 語言 打造微服務架構
用 Go 語言 打造微服務架構
Bo-Yi Wu
?
給 iOS 工程師的 Flutter 開發
給 iOS 工程師的 Flutter 開發
Weizhong Yang
?
20170905 dev ops in hiiir
20170905 dev ops in hiiir
Isaac Tseng
?
Using google appengine_1027
Using google appengine_1027
Wei Sun
?
Go 語言基礎簡介
Go 語言基礎簡介
Bo-Yi Wu
?
向箩辩耻别谤测学习
向箩辩耻别谤测学习
jay li
?
用 Go 語言打造 DevOps Bot
用 Go 語言打造 DevOps Bot
Bo-Yi Wu
?
用 Drone 打造 輕量級容器持續交付平台
用 Drone 打造 輕量級容器持續交付平台
Bo-Yi Wu
?
ModernWeb 2017 angular component
ModernWeb 2017 angular component
Chieh Kai Yang
?

Viewers also liked (20)

Reactive X 响应式编程
Reactive X 响应式编程
Jun Liu
?
不同尺寸與解析度的螢幕下,Android 程式 UI 的設計與解決方式
不同尺寸與解析度的螢幕下,Android 程式 UI 的設計與解決方式
信宏 陳
?
大鱼架构演进
大鱼架构演进
Jun Liu
?
Line Height (中文版)
Line Height (中文版)
bigCat Mao
?
Profile django
Profile django
Tim (文昌)
?
Android Bootcamp Tanzania: android manifest
Android Bootcamp Tanzania: android manifest
Denis Minja
?
Android layout 工程師在想什麼?給視覺設計師
Android layout 工程師在想什麼?給視覺設計師
Kane Shih
?
作业系统
作业系统
雅茵 許
?
础苍诲谤辞颈诲进阶鲍滨控制元件
础苍诲谤辞颈诲进阶鲍滨控制元件
艾鍗科技
?
Android 介面設計
Android 介面設計
PingLun Liao
?
Gradleでビルドするandroid NDKアプリ
Gradleでビルドするandroid NDKアプリ
Hideyuki Kikuma
?
窺探職場上所需之資安專業技術與能力 Tdohconf
窺探職場上所需之資安專業技術與能力 Tdohconf
jack51706
?
RESTful API的设计与开发
RESTful API的设计与开发
Ace Lee
?
础苍诲谤辞颈诲动态耻颈介面设计
础苍诲谤辞颈诲动态耻颈介面设计
艾鍗科技
?
[DEPRECATED]Gradle the android
[DEPRECATED]Gradle the android
Jun Liu
?
Gradle,the new build system for android
Gradle,the new build system for android
zhang ghui
?
搁奥顿常见设计模式
搁奥顿常见设计模式
Nowill Chang
?
Writing Fast MATLAB Code
Writing Fast MATLAB Code
Jia-Bin Huang
?
Android IPC Mechanism
Android IPC Mechanism
Lihan Chen
?
Android: Intent, Intent Filter, Broadcast Receivers
Android: Intent, Intent Filter, Broadcast Receivers
CodeAndroid
?
Reactive X 响应式编程
Reactive X 响应式编程
Jun Liu
?
不同尺寸與解析度的螢幕下,Android 程式 UI 的設計與解決方式
不同尺寸與解析度的螢幕下,Android 程式 UI 的設計與解決方式
信宏 陳
?
大鱼架构演进
大鱼架构演进
Jun Liu
?
Line Height (中文版)
Line Height (中文版)
bigCat Mao
?
Android Bootcamp Tanzania: android manifest
Android Bootcamp Tanzania: android manifest
Denis Minja
?
Android layout 工程師在想什麼?給視覺設計師
Android layout 工程師在想什麼?給視覺設計師
Kane Shih
?
础苍诲谤辞颈诲进阶鲍滨控制元件
础苍诲谤辞颈诲进阶鲍滨控制元件
艾鍗科技
?
Gradleでビルドするandroid NDKアプリ
Gradleでビルドするandroid NDKアプリ
Hideyuki Kikuma
?
窺探職場上所需之資安專業技術與能力 Tdohconf
窺探職場上所需之資安專業技術與能力 Tdohconf
jack51706
?
RESTful API的设计与开发
RESTful API的设计与开发
Ace Lee
?
础苍诲谤辞颈诲动态耻颈介面设计
础苍诲谤辞颈诲动态耻颈介面设计
艾鍗科技
?
[DEPRECATED]Gradle the android
[DEPRECATED]Gradle the android
Jun Liu
?
Gradle,the new build system for android
Gradle,the new build system for android
zhang ghui
?
搁奥顿常见设计模式
搁奥顿常见设计模式
Nowill Chang
?
Writing Fast MATLAB Code
Writing Fast MATLAB Code
Jia-Bin Huang
?
Android IPC Mechanism
Android IPC Mechanism
Lihan Chen
?
Android: Intent, Intent Filter, Broadcast Receivers
Android: Intent, Intent Filter, Broadcast Receivers
CodeAndroid
?
Ad

Android gradle 从入门到gg 1

  • 2. ? 介绍Android Gradle 插件的基本DSL使用 第1课: Greet
  • 3. 引用插件 buildscript { repositories { jcenter() } dependencies { classpath 'com.android.tools.build:gradle:2.1.0-beta3' // NOTE: Do not place your application dependencies here; // they belong in the individual module build.gradle files } } Gradle每次运行的时候, 初始化之时, 将 android gradle jar包加 载到 Gradle 运行时环境中, 而插件就在这些jar包内 Android Studio新建的工程会自动在rootProject的build.gradle 中生成以上脚本(一般就是根目录的build.gradle中)
  • 4. 引用插件 apply plugin 之后, 你就可以使用 android { // configurations } DSL入口了 apply plugin: 'com.android.application'
  • 5. 引用插件 -1. 很可惜, android gradle相关插件并不在GPCR里 -2. 此处的 id 是apply的插件id, 并不是 Artifact Id, 因为一个 Artifact的Jar包, 里面可以有几个插件, 比如android的插件id com.android.application 和 com.android.library 都在'com.android.tools.build:gradle:2.1.0-beta3' 这个artifact里面 plugins { id "com.android.application" version "2.1.0-beta3" } 对于 Gradle Plugin Central Repository(plugins.gradle.org) 里的插件, 可以简化为 plugins { id “Id” version “ver”}
  • 6. Artifact 'com.android.tools.build:gradle:2.1.0-beta3@jar' ? group:id:version:ext ? group: 类似android packageName ? id: 该jar包的名字, 类似android applicationName ? version: 版本号, 类似android versionName ? ext: 扩展, 比如 jar, aar, txt等文件扩展, 比如某个 Android库, 既提供了jar包, 也提供了aar包, 这时就 可以通过ext来区分你想要哪一个
  • 7. Artifact 'com.android.tools.build:gradle:2.1.0-beta3' dependencies { compile 'com.meizu.cloud.pushsdk:internal:3.0.3-beta@aar' proguard 'com.meizu.cloud.pushsdk:internal:3.0.3-beta@pro' ... compile 'io.reactivex:rxjava:1.1.3' compile(group:'io.reactivex', id: 'rxjava', version: '1.1.3') 一个Artifact依赖, 可以使用 group:id:version:ext 来定位到 等价于
  • 8. Artifact compile 'io.reactivex:rxjava:1.1.3' compile "io.reactivex:rxjava:1.1.+" // 1.1.最新版本** compile "io.reactivex:rxjava:1.+" // 1.最新版本** compile "io.reactivex:rxjava:+" // 最新版本 在Android Studio中, 使用了 + 号的依赖引用, 会被标黄警告 在版本管理中, + 号会导致你的 TAG分支, SNAPSHOT无法百分 百还原当时的编译 所以, 尽量避免使用 +
  • 9. repositories {} repositories { jcenter() } dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) testCompile 'junit:junit:4.12' compile 'com.android.support:appcompat-v7:23.3.0' compile 'com.android.support:design:23.3.0' } dependencies中的远程模块依赖, 来源在repositories中声明 但是repositories是project的入口, DSL中project可以省略 即 repositories {} 等价于 project.repositories {} 这意味着, 你只能对当前build.gradle配置的project有用 其他模块, 你得重新定义它的 repositories {}
  • 10. repositories {} 而之前讲到过, buildscript {}是在Gradle初始化的时候首先加载 buildscript { repositories { jcenter() } dependencies { classpath 'com.android.tools.build:gradle:2.1.0-beta3' } } buildscript{} 中配置的运行时环境依赖, 对所有模块都有效 allprojects { repositories { jcenter() } } allprojects{}: 该Gradle DSL入口的意思是 对project(模块)及其子模块都配置 将通用的配置放在rootProject的allprojects 中吧
  • 11. 休息时间 课程的随堂 Sample 以及 presentation 在如下 git 中 http://git.ipd.meizu.com/AnR/android-gradle-samples [Github用户移步] https://github.com/Jween/android-gradle-samples
  • 12. android { } ? defaultConfig { }: 默认配置, 所有 flavor 都会继承 ? sourceSets { }: 对代码/资源的配置, android 重新对 gradle sourceSets 进行 了针对 Android 的实现, 叫做 AndroidSourceSet ? productFlavors { }: 模块所有 flavor, 不同的 flavor, 可以打包出不同的 apk ? buildTypes { }: 模块所有 build 类型, 不同的类型, 可以打包出不同的 apk ? signingConfig { }: App 模块打包 apk 的签名配置 ? splits { }: Apk 分割, 全资源apk, 根据分辨率与abi分割成若干个小apk ? *Options { }: dexOptions { }, packagingOptions { }, aaptOptions { }, lintOptions { }, compileOptions { }, adbOptions { }, testOptions { } ? 你可以在 http://google.github.io/android-gradle-dsl/current/com.android.build.gradle.BaseExtension.html 这里查 看详细的 DSL, 本节课只讲常用到的 android DSL, 标红的重点讲述
  • 13. android.defaultConfig { } defaultConfig { applicationId "com.meizu.sample.basicdsl" minSdkVersion 22 targetSdkVersion 23 versionCode 1 versionName "1.0" } 以上是 Android Studio 新建一个工程的时候, 自动配置的, library 模块的话无法配置applicationId, 毕竟 library 不是 application 为了方便理解, 先抛出一些概念 1. defaultConfig 本质上就是 ProductFlavor 2. 把 src/main (android.sourceSets.main) 看作是默认的 flavor source set, 那么, defaultConfig 就是对 main 这个 flavor 的配 置 3. 等会儿讲完 ProductFlavor, 我们再回来看看 defaultConfig
  • 14. android.productFlavors { } 假设我们开发了一款新产物, 需要区分免费版与旗舰版怎么办? productFlavors { free { // 免费版本 } utlra { // 旗舰版本 } } android.sourceSets.free { } android.sourceSets.ultra { } 上一节课, 我们讲了对 sourceSets.main { } 的一些配置 当我们添加了 free 与 ultra 之后, 你同样可以配置 sourceSets.free { } 以及 sourceSets.ultra { } 默认的路径在 main 文件夹同级目录各 flavor 同名文件夹
  • 15. android.productFlavors { } 我们希望区分免费版与旗舰版的包名怎么办? productFlavors { free { // 免费版本 applicationIdSuffix ".free" // 免费版包名后缀 .free } utlra { // 旗舰版本 applicationIdSuffix ".ultra" // 旗舰版包名后缀 .ultra } } 同理,你可以区分应用版本, Android min targe版本等, 你可以区 分签名signingConfig, 区分http://google.github.io/android-gradle- dsl/current/com.android.build.gradle.internal.dsl.ProductFlavor.html 中的一切
  • 16. android.productFlavors { } 与此同时, Gradle会自动生成一个 BuildConfig 类, 包含当前选定 的 variant 的 applicationId, Debug开关, flavor, buildType, 版本等 public final class BuildConfig { public static final boolean DEBUG = Boolean.parseBoolean("true"); public static final String APPLICATION_ID = "com.meizu.sample.basicdsl.free"; public static final String BUILD_TYPE = "debug"; public static final String FLAVOR = "free"; public static final int VERSION_CODE = 1; public static final String VERSION_NAME = "1.0"; } 选择 Build Variant 一般在 Android Studio 左下角
  • 17. android.buildTypes { } 我们可以看到 Build Variant 选定的是 freeDebug buildTypes 默认有 debug 和 release BuildType 类似 ProductFlavor, 但是多了与编译深度相关的 proguard代码混淆, 资源Shrink, debug开关, 等等 buildTypes { release { minifyEnabled true // 代码混淆 shrinkResources true // 移除没用到的资源和代码 proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } }
  • 18. Build Variant 我们可以看到 Build Variant 选定的是 freeDebug Build Variant = [flavors, buildTypes].combinations() [['a', 'b'],[1, 2, 3]].combinations() == [['a', 1], ['b', 1], ['a', 2], ['b', 2], ['a', 3], ['b', 3]] [[free, ultra], [debug, release]].combinations() == [[free,debug], [ultra, debug], [free, release], [ultra, release]] ? freeDebug, freeRelease, ultraDebug, ultraRelease
  • 19. Build Variant variant! 想想 groovy 的 combinations! flavor buildType variant free debug freeDebug freeRelease ultra release ultraDebug ultraRelease
  • 20. Build Variant 记住: 当你在 Build Variant 里面选定了一个 Variant 的时候, 比如, 这里的 freeDebug, Android Studio当前的对项目的配置 就是根据 free 的 flavor 以及 debug 的 buildType 来的, 你需要确保, 所有的 variant 都能正常编译
  • 21. android.productFlavors { } 现在有免费版和旗舰版了, 要发应用商店了, 需要区分各个应 用商店的渠道怎么办? flavorDimensions "channel", "type" // flavor 维度声明 productFlavors { free { // 免费版本 dimension "type" // type 维度的 free flavor applicationIdSuffix ".free" // 免费版包名后缀 .free } utlra { // 旗舰版本 dimension "type" // type 维度的 ultra flavor applicationIdSuffix ".ultra" // 旗舰版包名后缀 .ultra } flyme { // Flyme 渠道 dimension "channel" // channel 维度的 flyme flavor } tap { // 应用宝 渠道 dimension "channel" // channel 维度的 tap flavor } }
  • 22. android.productFlavors { } 注意 flavorDimensions 后参数的顺序, 这个顺序就是维度的顺序 flavorDimensions "channel", "type" // flavor 维度声明 命令行编译举例: 编译 flyme 渠道, 免费版本, 正式发布包 >./gradlew –p app/ assembleFlymeFreeRelease 或者偷懒, 省略每个单词后面的字母也可以 >./gradlew –p app/ assFlyFreeRel 后续你还会看到大量驼峰法命名
  • 23. Build Variant 我们现在有 channel 维度, type 维度, 以及 buildType 维度 了 打包的时候, 对每个维度的 sourceSet 的资源选取顺序, 只要记住 前面的覆盖后面的, 除了buildType, 优先级最高的是 buildType 比如 flymeFreeDebug, debug > flyme > free 即 flyme/中的同名资源会覆盖free/的, debug/的会覆盖flyme/ 小技巧: 永远在后面加上 main 这个默认的基本 sourceSet flymeFreeDebugMain <=> debug > flyme > free > main
  • 24. Build Variant 各个优先级资源覆盖所涉及的 ResourceMerger, ManifestMerger 在后续课程中详细讲解 例如: 高德地图 key 根据编译类型选择, 不同的渠道包 AndroidManifest 结点数据不一样, 不同 flavor 的资源不一样, 代 码不一样等等, 在讲 ResourceMerger, ManifestMerger 的时候详 解
  • 25. proguard proguardFiles, proguardFile 指定 proguard 规则文件, 建议对引用的第三方 progaurd 文件, 区分存储 所有 开启了混淆 打包的 retrace 文件在 build/outpus/mappings/ 文件夹下 buildTypes { release { minifyEnabled true // 代码混淆 shrinkResources true // 移除没用到的资源和代码 proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' progaurdFile "proguard-rxjava.pro" proguardFile "proguard-realm.pro" proguardFile "proguard-retrofit.pro" } }
  • 26. android.sourceSets { } 上节课, 我们已经玩弄过 main source set, 现在我们引入 variant sourceSets { free { // 对 src/free/ source set 进行配置 (flavor) } release { // 对 src/release/ source set 进行配置 (buildType) } freeFlyme { // 对 src/freeFlyme/ 额外 source set 进行配置 } } 我们对 main 可以配置的任何东西, 都可以对其他 source set配置 freeFlyme { }: 按照之前驼峰法顺序, 随意截取一段出来, 都可以 这些额外 source set 一般很少用到, 除非极其针对的业务需求
  • 28. 课后任务 samples内有BasicDSL 工程, 对免费和旗舰版的 Application Name 后追加 免费版 以及 旗舰版 tips: string.xml 文件覆盖 http://git.ipd.meizu.com/AnR/android-gradle-samples 记得使用自己的邮箱名作为分支名PR给我 [Github用户移步] https://github.com/Jween/android-gradle-samples