多模块构建(gradle系列五)

背景

  • Android studio不仅允许你为你的app和依赖库创建模块,同时也可为Android wear,Android TV,Google App Engine等创建模块,而这些单独的模块又可以在一个单独的项目中使用。举个栗子,在你的app开发后期阶段,你可能需要用到Google Clound或者Android Wear。这种情况下,你可以在你的工程下拥有三个模块:分别是app,google cloud,Android Wear整合。了解在一个工程下的多模块构建将会加速你的开发周期。

多模块构建的结构

  • 一个工程包含多个模块,这些模块会存放到父目录下,然后为了告诉gradle,项目的结构及哪一个子文件夹包含模块,需要添加一个setting.gradle文件,每个模块可以提供其独立的build.gradle文件。举个例子,如下所示:
1
2
3
4
5
6
7
project
├─── setting.gradle
├─── build.gradle
├─── app
│ └─── build.gradle
└─── library
└─── build.gradle
  • setting.gradle文件声明的内容如下:
1
2
include ':app', ':library'
// 这保证了app和library模块都会包含在构建配置中
  • 如果需要在你的app模块中添加library模块作为其依赖,可以在app的build.gradle中添加:
1
2
3
dependencies {
compile project(':library')
}
  • 如果模块中还包含了子模块,gradle可以满足你的要求,比如:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    project
    ├─── setting.gradle
    ├─── build.grade
    ├─── app
    │ └─── build.gradle
    └─── libraries
    ├─── library1
    │ └─── build.gradle
    └─── library2
    └─── build.gradle

如果是这种情况,使用library1和library2就需要如下配置:

1
2
3
4
5
6
7
---setting.gradle
include ':app', ':libraries:library1', ':libraries:library2'
--- app build.gradle
dependencies {
compile project(':libraries:library1')
}

构建声明周期

  • 初始化阶段,gradle首先会去找setting.gradle文件,如果该文件不存在,那么gradle会认为你只有一个模块。如果有多个模块,setting.gradle定义了这些模块的位置,如果子模块中包含build.gradle,那么gradle会执行他们,并将他们合并到构建任务中。
  • gradle最大的策略是混合,你可以在根目录下定义一个build文件去定义所有模块相同的属性,然后在每个模块中的build文件去配置只属于该模块的参数。

建议

  • 在AndroidStudio中运行tasks,假如你定义了多个tasks,在AndroidStudio gradle面板中是可以展示出来的,如下图所示:
    gradle_androidStudio

加速你的多模块构建

  • 当你构建你的多模块项目,gradle会依次执行所有的模块。当你的电脑内存够大的时候,让你的构建过程多线程将会更快。该特性在gradle早已存在,但是其默认关闭。所以如果你希望启动parallel构建,你需要在grade.properties文件中配置如下属性:
1
org.gradle.parallel=true

模块耦合

  • 即你可以在一个模块中引用其他模块的属性,但是不建议这么做,可以在根目录下的build文件中定义这些公共属性。