设定共用库
如果要配合 Android Studio 源代码项目结构的特性来架构程序,就会形成一个问题是:跨项目共用的库文件夹结构如何规划?严格地来说,这不应该是一个问题,既然是要被跨项目使用,在被产品项目引用之前,就应该是处于经过测试、编译好的状态,需要使用的开发人员只要取得 Binary 档就行了。
只是现实和理想毕竟有差距,在库的初期大多是透过各个产品项目来累积经验,利用重构的手法把可以共用的部份抽取出来单独地放在库的项目里。在这种情况下,很多的设计思考是不周全的,所以需要在后续的产品项目中来发掘问题、持续地修正。
这时候,如果引用的是 Binary 文件在调试上就不是那么地直接,使用原始码来开发会是一项可预见的需求。要引用原始码势必就会需要把不在目前 Android 项目文件夹下的 Module 包含进来。
于是就退而求其次,改为手动编辑 Gradle Root Project 下的 settings.gradle。在 settings.gradle 里增加以下内容,其中 utils 是 IDE 里 Module 的名称,必须要是一个 Gradle 的 Project。new File 里的参数是 Gradle Project 所在的路径,可以是绝对路径,或是相对于 settings.gradle 所在的路径。
include ':utils'
project(':utils').projectDir = new File('../shared/utils')
以上的范例在实体的路径中会呈现以下示范的结构:
WebProject
├── build.gradle
├── settings.gradle
├── web-module
│ ├── build.gradle
│ └── src
│ ├── main
│ └── test
├── common-module
│ ├── build.gradle
│ └── src
│ ├── main
│ └── test
shared
└── utils
├── build.gradle
└── src
├── main
└── test
修改好了之后,按下 Toolbar 上的 Sync Project with Gradle Files 图示,在 Project Tool Window 就可以看到在原本树状结构第一阶只有 Root Project 一项,更新后多了一个平行的 utils 项目。
接下来就可以新增 Gradle Project 间的依存关系,原本应该可以透过【Project Structure】的 Menu 功能来修改,但是在 “以汇入方式产生的纯 Web 项目” 的情况下,无法将新增的 Depedencies 资讯反映回 Module 所对应的 build.gradle,应该是 IDE 的功能不正常造成的。这会使 CI 系统与开发时的建置结果出现不一致的情况,所以保险的作法还是手动编辑 build.gradle,要增加的内容可以参考以下的范例:
dependencies {
compile project(':utils')
}
如果要参照的函式库只是使用在测试的目的上,则 compile 可以更换为 testCompile。