关于Android-Studio3.0中的Gradle配置

S3.0 新特性


看官方的版本发布说明,就能知道大概了: https://developer.android.google.cn/studio/releases/index.html

如:

1
2
3
4
5
6
7
8
9
对java8的一些feature的支持;
profiler debug;
device file explorer;
instant apps support;
app links support;
layout editor;
apk analyzer;
d8 dex compiler;
...

Gradle 变化


kotlin、cmake的支持,新建一个项目,应用这些特性,就能看到配置了,就不贴了

AS3.0的gradle变化的说明地址:https://developer.android.google.cn/studio/build/gradle-plugin-3-0-0-migration.html

gradle.properties

1
2
#新的dex编译器
android.enableD8 = true

<module>/build.gradle

  • 新的依赖项
1
2
3
4
5
api: 与以前的compile 完全一样:在依赖项,其内部的依赖发生变化时,将会使所有的module重新编译;且会向外暴露所依赖子项的接口。
implementation: 在依赖项,其内部的依赖发生变化时,只重新编译内部依赖项;不会向外暴露内部依赖项的接口
testImplementation:测试依赖。 对应以前:testCompile
compileOnly: 只编译,不打参与打包。 对应以前:provided
runtimeOnly: 只在运行时,参与打包。 对应以前:apk

作者君,某天就被api和implementation 坑了好久。还以为哪里的环境出了问题,报各种gradle相关错误。

引发的场景:有一个android-Lib-module, 内部有依赖一些jar文件… 在app-module中,有代码使用到了jar文件中的类;而在android-Lib-module中jar的依赖是这样的implementation fileTree(include: ['*.jar'], dir: 'libs'),造成在app中老是提示 cannot access xxx-class

  • productFlavors 要求每个flavor都有配置一个dimension属性
1
2
3
4
5
demo {
dimension "DimenA"
applicationId "com.stone.myapplication.pro"
...
}

这些dimension要配置在一个地方,一般放在defaultConfig中:

1
2
3
4
defaultConfig {
...
flavorDimensions "DimenA", "DimenB"
}

3.0 之前:flavors和buildTypes的子项 会多对多匹配;即会有 m * n 个build variant

3.0 之后:flavors中需要配置dimension, 其又声明在flavorDimensions里面;
匹配规则是:不同dimension的flavor会被联合,然后与buildTypes的每项匹配。

如buildType有:debug和release; productFlavors如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
demo {
dimension "DimenA"
applicationId "com.stone.myapplication.pro"
}
full {
dimension "DimenA"
applicationId "com.stone.myapplication.free"
}
xxx {
dimension "DimenB"
applicationId "com.stone.myapplication.xxx"
}

这样就会组合成如下6项build variant:

1
2
3
4
5
6
demoXxxDebug
demoXxxRelease
demoXxxStaging
fullXxxDebug
fullXxxRelease
fullXxxStaging
  • applicationVariants中的变化

3.0前可以改变apk的输出路径和名字:

1
2
3
4
5
applicationVariants.all { variant ->
variant.outputs.each { output ->
output.outputFile = ...
}
}

3.0中,outputFile只有get方法,没有set方法了,所以不能通过这种方式设置

可以通过如下方式,设置输出apk的名字:

1
2
3
4
5
applicationVariants.all { variant ->
variant.outputs.all {
outputFileName = "v${variant.versionName}_${variant.flavorName}}.apk"
}
}

关于variant.outputs.each 要说的一点是:该迭代器,访问的对象需要在构建之前就已经是存在的。测试时发现如果在each内操作一个File对象,其对应的文件必须事先存在,才能操作;且在构建任务一开始运行时就被执行了。

------ 本文结束 ------

版权声明
协议:No Fuck License

stone 创作并维护
本文首发于 stone世界 博客( http://stone86.top
版权所有,侵权必究。如要转载,请声明出处

Fork me on GitHub