问题

有时候一个Project中包含了好几个module,每个module都要用到Android Support Library,每当升级Support Library时要改好几处,相当麻烦。

1
2
3
4
5
6
7
8
root
--module1
--build.gradle
--module2
--build.gradle
--module3
--build.gradle
--build.gradle

利用Gradle的apply from进行拆分

Gradle基于Groovy脚本语言,本身使用Plugin机制提供扩展和模块化,也支持文件间的引用包含apply from,跟C的include,Java的import一样,那么我们就把Android Support Library相关的部分单独提取到root/gradleScript/dependencies.gradle中。

1
2
3
4
5
6
7
8
9
10
root
--gradleScript
--dependencies.gradle
--module1
--build.gradle
--module2
--build.gradle
--module3
--build.gradle
--build.gradle

应用

root/gradleScript/dependencies.gradle中:

1
2
3
4
5
6
7
8
9
10
11
12
13
ext {
//Version
supportLibrary = '22.2.0'
//Support Libraries dependencies
supportDependencies = [
design : "com.android.support:design:${supportLibrary}",
recyclerView : "com.android.support:recyclerview-v7:${supportLibrary}",
cardView : "com.android.support:cardview-v7:${supportLibrary}",
appCompat : "com.android.support:appcompat-v7:${supportLibrary}",
supportAnnotation: "com.android.support:support-annotations:${supportLibrary}",
]
}

root/build.gradle中:

1
2
3
4
5
6
7
8
9
10
11
12
buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:1.3.0'
}
}
// 引用gradle文件
apply from: 'gradleScript/dependencies.gradle'

module/build.gradle中使用:

1
2
3
4
5
dependencies {
//......
compile supportDependencies.appCompat
compile supportDependencies.design
}

总结

Gradle利用Grovvy,其动态脚本语言的特性,跟JavaScript一样,运行时将所有Plugin和自写代码载入到一个上下文中,Plugin可以看成是Groovy的一个jar包,独立出来的gradle文件是一个只有一个文件的jar包,其自身的扩展性潜力无限,这也是Android Studio选择Gradle Build System的原因。