小背景
为了保持项目结构的清晰,大多数时候对于三方 SDK 会将其 aar、jar、so 等单独用一个 module 装起来,可用传递依赖的方式去配置 jar,但 so 与 aar 则需要另外配置。
另外,还有 额外的res、纯 java 目录等。
混淆文件proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro', 'other/proguard-rules.pro'
.aar
对于 aar,需要修改的是 flatDir,一般放在 app/build.gradle 统筹全局,这也是无法传递依赖的折中解决办法。
由于 aar 一般是远程依赖,这里也是使用相当于添加一个仓库的效果,所以在 repositories 的节点下。
来自 flatDir 方法注释:来自 flatDir 方法注释
.so
对于 so,则需要修改 jniLibs,可以用+=的方式去拼接,也可以按官方的这种写法android {...
sourceSets {main{jniLibs.srcDirs 'imported-lib/src/', 'more-imported-libs/src/'
}
}}
java、manifest、aidl、res、assets 源代码目录sourceSets {main{manifest.srcFile '/src/main/AndroidManifest.xml'
java.srcDirs = ['/src/main/java', 'other/src/main/java']
aidl.srcDirs = ['/src/main/aidl', 'other/src/main/aidl']
res.srcDirs = ['/src/main/res']
assets.srcDirs = ['/src/main/assets']
}
}
这里为什么有个 main 呢,主要还是因为 flavor,main 只是一个基础的 flavor。
透露个小姿势,这里都是用的xxx.srcDirs直接指定一个数组,但实际上,也可以使用拼接的方式。但往往看到的都是:java.srcDirs += 'other/src/main/java'
java.srcDirs += ['/src/main/java', 'other/src/main/java']
其实这里可以还可以这样做,并不需要+=,为什么?看看这个就知道了Gradle building java projectsjava{srcDir 'other/src/main/java'
}
关于 Android 相关配置的官方文档:
include、exclude
其实没什么 include,因为指定 srcDirs 就是指定包含编译的内容了。但是 exclude 是有的:Gradle Doc SourceSetsourceSets {
main {
java {
exclude 'some/unwanted/package/**'
}
}
}
无意中看到一个不错的 example: