抬头仰望星空,是否能发现自己的渺小。

伪斜杠青年

人们总是混淆了欲望和理想

各种 Android 常用 dir 在 gradle 中的配置方式

小背景

为了保持项目结构的清晰,大多数时候对于三方 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 方法注释

官方文档:declaring_repositories

.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 projects

java{
    srcDir 'other/src/main/java'
}

关于 Android 相关配置的官方文档:

Gradle AndroidSourceSet

include、exclude

其实没什么 include,因为指定 srcDirs 就是指定包含编译的内容了。但是 exclude 是有的:Gradle Doc SourceSet

sourceSets {
  main {
    java {
      exclude 'some/unwanted/package/**'
    }
  }
}

无意中看到一个不错的 example:

gradle flavors and resources example


0条评论

发表评论