More Related Content Similar to Android gradle 从入门到gg 1 (20) Android gradle 从入门到gg 13. 引用插件
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”}
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
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 一般很少用到, 除非极其针对的业务需求