SlideShare une entreprise Scribd logo
1  sur  28
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

Contenu connexe

Tendances

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

Tendances (20)

20170217 julia小程式到專案發布之旅
20170217 julia小程式到專案發布之旅20170217 julia小程式到專案發布之旅
20170217 julia小程式到專案發布之旅
 
Swagger
SwaggerSwagger
Swagger
 
Android 2.2 手機應用程式設計:第四章 第一個程式
Android 2.2 手機應用程式設計:第四章 第一個程式Android 2.2 手機應用程式設計:第四章 第一個程式
Android 2.2 手機應用程式設計:第四章 第一個程式
 
Android 智慧型手機程式設計
Android 智慧型手機程式設計Android 智慧型手機程式設計
Android 智慧型手機程式設計
 
Mvp in practice
Mvp in practiceMvp in practice
Mvp in practice
 
應用 Sikuli 在 Android 設備上執行自動化測試
應用 Sikuli 在 Android 設備上執行自動化測試應用 Sikuli 在 Android 設備上執行自動化測試
應用 Sikuli 在 Android 設備上執行自動化測試
 
快快樂樂學會 Angular 2 網站開發框架 (Modern Web 2016)
快快樂樂學會 Angular 2 網站開發框架 (Modern Web 2016)快快樂樂學會 Angular 2 網站開發框架 (Modern Web 2016)
快快樂樂學會 Angular 2 網站開發框架 (Modern Web 2016)
 
Git flow 與團隊合作
Git flow 與團隊合作Git flow 與團隊合作
Git flow 與團隊合作
 
Gradle 和 Android Studio --- Jason Ko
Gradle 和 Android Studio --- Jason KoGradle 和 Android Studio --- Jason Ko
Gradle 和 Android Studio --- Jason Ko
 
用 Go 語言 打造微服務架構
用 Go 語言打造微服務架構用 Go 語言打造微服務架構
用 Go 語言 打造微服務架構
 
Flutter 踩雷心得
Flutter 踩雷心得Flutter 踩雷心得
Flutter 踩雷心得
 
給 iOS 工程師的 Flutter 開發
給 iOS 工程師的 Flutter 開發給 iOS 工程師的 Flutter 開發
給 iOS 工程師的 Flutter 開發
 
20170905 dev ops in hiiir
20170905 dev ops in hiiir20170905 dev ops in hiiir
20170905 dev ops in hiiir
 
Using google appengine_1027
Using google appengine_1027Using google appengine_1027
Using google appengine_1027
 
Go 語言基礎簡介
Go 語言基礎簡介Go 語言基礎簡介
Go 語言基礎簡介
 
向jquery学习
向jquery学习向jquery学习
向jquery学习
 
用 Go 語言打造 DevOps Bot
用 Go 語言打造 DevOps Bot用 Go 語言打造 DevOps Bot
用 Go 語言打造 DevOps Bot
 
用 Drone 打造 輕量級容器持續交付平台
用 Drone 打造輕量級容器持續交付平台用 Drone 打造輕量級容器持續交付平台
用 Drone 打造 輕量級容器持續交付平台
 
ModernWeb 2017 angular component
ModernWeb 2017 angular componentModernWeb 2017 angular component
ModernWeb 2017 angular component
 
Git 經驗分享
Git 經驗分享Git 經驗分享
Git 經驗分享
 

En vedette

Reactive X 响应式编程
Reactive X 响应式编程Reactive X 响应式编程
Reactive X 响应式编程Jun Liu
 
不同尺寸與解析度的螢幕下,Android 程式 UI 的設計與解決方式
不同尺寸與解析度的螢幕下,Android 程式 UI 的設計與解決方式不同尺寸與解析度的螢幕下,Android 程式 UI 的設計與解決方式
不同尺寸與解析度的螢幕下,Android 程式 UI 的設計與解決方式信宏 陳
 
大鱼架构演进
大鱼架构演进大鱼架构演进
大鱼架构演进Jun Liu
 
Line Height (中文版)
Line Height (中文版)Line Height (中文版)
Line Height (中文版)bigCat Mao
 
Android Bootcamp Tanzania: android manifest
Android Bootcamp Tanzania: android manifestAndroid Bootcamp Tanzania: android manifest
Android Bootcamp Tanzania: android manifestDenis Minja
 
Android layout 工程師在想什麼?給視覺設計師
Android layout   工程師在想什麼?給視覺設計師Android layout   工程師在想什麼?給視覺設計師
Android layout 工程師在想什麼?給視覺設計師Kane Shih
 
Android進階UI控制元件
Android進階UI控制元件Android進階UI控制元件
Android進階UI控制元件艾鍗科技
 
Android 介面設計
Android 介面設計Android 介面設計
Android 介面設計PingLun Liao
 
Gradleでビルドするandroid NDKアプリ
Gradleでビルドするandroid NDKアプリGradleでビルドするandroid NDKアプリ
Gradleでビルドするandroid NDKアプリHideyuki Kikuma
 
窺探職場上所需之資安專業技術與能力 Tdohconf
窺探職場上所需之資安專業技術與能力 Tdohconf窺探職場上所需之資安專業技術與能力 Tdohconf
窺探職場上所需之資安專業技術與能力 Tdohconfjack51706
 
RESTful API的设计与开发
RESTful API的设计与开发RESTful API的设计与开发
RESTful API的设计与开发Ace Lee
 
Android動態ui介面設計
Android動態ui介面設計Android動態ui介面設計
Android動態ui介面設計艾鍗科技
 
[DEPRECATED]Gradle the android
[DEPRECATED]Gradle the android[DEPRECATED]Gradle the android
[DEPRECATED]Gradle the androidJun Liu
 
Gradle,the new build system for android
Gradle,the new build system for androidGradle,the new build system for android
Gradle,the new build system for androidzhang ghui
 
RWD常見設計模式
RWD常見設計模式RWD常見設計模式
RWD常見設計模式Nowill Chang
 
Writing Fast MATLAB Code
Writing Fast MATLAB CodeWriting Fast MATLAB Code
Writing Fast MATLAB CodeJia-Bin Huang
 
Android IPC Mechanism
Android IPC MechanismAndroid IPC Mechanism
Android IPC MechanismLihan Chen
 
Android: Intent, Intent Filter, Broadcast Receivers
Android: Intent, Intent Filter, Broadcast ReceiversAndroid: Intent, Intent Filter, Broadcast Receivers
Android: Intent, Intent Filter, Broadcast ReceiversCodeAndroid
 

En vedette (20)

Reactive X 响应式编程
Reactive X 响应式编程Reactive X 响应式编程
Reactive X 响应式编程
 
不同尺寸與解析度的螢幕下,Android 程式 UI 的設計與解決方式
不同尺寸與解析度的螢幕下,Android 程式 UI 的設計與解決方式不同尺寸與解析度的螢幕下,Android 程式 UI 的設計與解決方式
不同尺寸與解析度的螢幕下,Android 程式 UI 的設計與解決方式
 
大鱼架构演进
大鱼架构演进大鱼架构演进
大鱼架构演进
 
Line Height (中文版)
Line Height (中文版)Line Height (中文版)
Line Height (中文版)
 
Profile django
Profile djangoProfile django
Profile django
 
Android Bootcamp Tanzania: android manifest
Android Bootcamp Tanzania: android manifestAndroid Bootcamp Tanzania: android manifest
Android Bootcamp Tanzania: android manifest
 
Android layout 工程師在想什麼?給視覺設計師
Android layout   工程師在想什麼?給視覺設計師Android layout   工程師在想什麼?給視覺設計師
Android layout 工程師在想什麼?給視覺設計師
 
作業系統
作業系統作業系統
作業系統
 
Android進階UI控制元件
Android進階UI控制元件Android進階UI控制元件
Android進階UI控制元件
 
Android 介面設計
Android 介面設計Android 介面設計
Android 介面設計
 
Gradleでビルドするandroid NDKアプリ
Gradleでビルドするandroid NDKアプリGradleでビルドするandroid NDKアプリ
Gradleでビルドするandroid NDKアプリ
 
窺探職場上所需之資安專業技術與能力 Tdohconf
窺探職場上所需之資安專業技術與能力 Tdohconf窺探職場上所需之資安專業技術與能力 Tdohconf
窺探職場上所需之資安專業技術與能力 Tdohconf
 
RESTful API的设计与开发
RESTful API的设计与开发RESTful API的设计与开发
RESTful API的设计与开发
 
Android動態ui介面設計
Android動態ui介面設計Android動態ui介面設計
Android動態ui介面設計
 
[DEPRECATED]Gradle the android
[DEPRECATED]Gradle the android[DEPRECATED]Gradle the android
[DEPRECATED]Gradle the android
 
Gradle,the new build system for android
Gradle,the new build system for androidGradle,the new build system for android
Gradle,the new build system for android
 
RWD常見設計模式
RWD常見設計模式RWD常見設計模式
RWD常見設計模式
 
Writing Fast MATLAB Code
Writing Fast MATLAB CodeWriting Fast MATLAB Code
Writing Fast MATLAB Code
 
Android IPC Mechanism
Android IPC MechanismAndroid IPC Mechanism
Android IPC Mechanism
 
Android: Intent, Intent Filter, Broadcast Receivers
Android: Intent, Intent Filter, Broadcast ReceiversAndroid: Intent, Intent Filter, Broadcast Receivers
Android: Intent, Intent Filter, Broadcast Receivers
 

Similaire à Android gradle 从入门到gg 1

Android -汇博
Android -汇博Android -汇博
Android -汇博dlqingxi
 
基于Android ndk的软件开发简介 放映
基于Android ndk的软件开发简介 放映基于Android ndk的软件开发简介 放映
基于Android ndk的软件开发简介 放映heyfluke
 
基于Android ndk的软件开发简介 放映
基于Android ndk的软件开发简介 放映基于Android ndk的软件开发简介 放映
基于Android ndk的软件开发简介 放映heyfluke
 
和Android源代码一起工作 | 海豚浏览器 胡继堂
和Android源代码一起工作 | 海豚浏览器 胡继堂和Android源代码一起工作 | 海豚浏览器 胡继堂
和Android源代码一起工作 | 海豚浏览器 胡继堂imShining @DevCamp
 
Android GDB Debugging (Chinese)
Android GDB Debugging (Chinese)Android GDB Debugging (Chinese)
Android GDB Debugging (Chinese)William Lee
 
Coscup2011: porting android to brand-new cpu architecture
Coscup2011: porting android to brand-new cpu architecture Coscup2011: porting android to brand-new cpu architecture
Coscup2011: porting android to brand-new cpu architecture lusecheng
 
Android開發app
Android開發appAndroid開發app
Android開發app騰昱 魏
 
Phonegap入門
Phonegap入門Phonegap入門
Phonegap入門Roy Chen
 
Android应用开发 - 沈大海
Android应用开发 - 沈大海Android应用开发 - 沈大海
Android应用开发 - 沈大海Shaoning Pan
 
Hadoop开发者入门专刊
Hadoop开发者入门专刊Hadoop开发者入门专刊
Hadoop开发者入门专刊liangxiao0315
 
Apache cordova 開發環境建置
Apache cordova 開發環境建置Apache cordova 開發環境建置
Apache cordova 開發環境建置My own sweet home!
 
Android 程式設計(1)
Android 程式設計(1)Android 程式設計(1)
Android 程式設計(1)Roy Wang
 
GDG Taichung - Flutter and Firebase.pdf
GDG Taichung - Flutter and Firebase.pdfGDG Taichung - Flutter and Firebase.pdf
GDG Taichung - Flutter and Firebase.pdfDuran Hsieh
 
04.layman android google handheld device application design
04.layman android   google handheld device application design04.layman android   google handheld device application design
04.layman android google handheld device application designgaquay086
 
行動商務 - PhoneGapBuild and Upto Market
行動商務 - PhoneGapBuild and Upto Market行動商務 - PhoneGapBuild and Upto Market
行動商務 - PhoneGapBuild and Upto MarketMy own sweet home!
 
Android系统移植技术详解
Android系统移植技术详解Android系统移植技术详解
Android系统移植技术详解zzc89522
 

Similaire à Android gradle 从入门到gg 1 (20)

Flutter實作概述 | GDSC NYCU
Flutter實作概述 | GDSC NYCUFlutter實作概述 | GDSC NYCU
Flutter實作概述 | GDSC NYCU
 
Android -汇博
Android -汇博Android -汇博
Android -汇博
 
基于Android ndk的软件开发简介 放映
基于Android ndk的软件开发简介 放映基于Android ndk的软件开发简介 放映
基于Android ndk的软件开发简介 放映
 
基于Android ndk的软件开发简介 放映
基于Android ndk的软件开发简介 放映基于Android ndk的软件开发简介 放映
基于Android ndk的软件开发简介 放映
 
和Android源代码一起工作 | 海豚浏览器 胡继堂
和Android源代码一起工作 | 海豚浏览器 胡继堂和Android源代码一起工作 | 海豚浏览器 胡继堂
和Android源代码一起工作 | 海豚浏览器 胡继堂
 
Android GDB Debugging (Chinese)
Android GDB Debugging (Chinese)Android GDB Debugging (Chinese)
Android GDB Debugging (Chinese)
 
Coscup2011: porting android to brand-new cpu architecture
Coscup2011: porting android to brand-new cpu architecture Coscup2011: porting android to brand-new cpu architecture
Coscup2011: porting android to brand-new cpu architecture
 
Android開發app
Android開發appAndroid開發app
Android開發app
 
Flutter實作概述 | GDSC NYCU
Flutter實作概述 | GDSC NYCUFlutter實作概述 | GDSC NYCU
Flutter實作概述 | GDSC NYCU
 
Build Your Own Android Toolchain from scratch
Build Your Own Android Toolchain from scratchBuild Your Own Android Toolchain from scratch
Build Your Own Android Toolchain from scratch
 
Phonegap入門
Phonegap入門Phonegap入門
Phonegap入門
 
Android应用开发 - 沈大海
Android应用开发 - 沈大海Android应用开发 - 沈大海
Android应用开发 - 沈大海
 
Hadoop开发者入门专刊
Hadoop开发者入门专刊Hadoop开发者入门专刊
Hadoop开发者入门专刊
 
Apache cordova 開發環境建置
Apache cordova 開發環境建置Apache cordova 開發環境建置
Apache cordova 開發環境建置
 
Android 程式設計(1)
Android 程式設計(1)Android 程式設計(1)
Android 程式設計(1)
 
GDG Taichung - Flutter and Firebase.pdf
GDG Taichung - Flutter and Firebase.pdfGDG Taichung - Flutter and Firebase.pdf
GDG Taichung - Flutter and Firebase.pdf
 
Android ADK
Android ADKAndroid ADK
Android ADK
 
04.layman android google handheld device application design
04.layman android   google handheld device application design04.layman android   google handheld device application design
04.layman android google handheld device application design
 
行動商務 - PhoneGapBuild and Upto Market
行動商務 - PhoneGapBuild and Upto Market行動商務 - PhoneGapBuild and Upto Market
行動商務 - PhoneGapBuild and Upto Market
 
Android系统移植技术详解
Android系统移植技术详解Android系统移植技术详解
Android系统移植技术详解
 

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