脚本和对象
构建时,脚本文件会转化为对象;写脚本时不懂的地方查对应对象API即可。
settings.gradle
会转化为Settings
对象。
build.gradle
会转化为Project
对象。
- 其他gradle文件,没有定义为class的,会转换为一个实现了
Script
接口的对象
任务
可以使用方法和关键字定义。
1 2 3 4 5 6 7 8 9 10 11 12
| task myTask task myTask { configure closure } task myTask(type: SomeType) task myTask(type: SomeType) { configure closure }
Task task(String name) Task task(String name,Closure configureClosure) Task task(String name,Action<? super Task> configureAction) Task task(Map<String,?> args,String name) Task task(Map<String,?> args,String name,Closure configureClosure)
|
常用属性
Project
和Settings
的常用属性
扩展属性(Ext属性)
1 2 3 4 5 6 7 8 9 10 11
| [project.]ext.foo = "bar" [project.]ext { foo = "bar" }
println project.ext.foo println rootProject.ext.foo
|
文件gradle.properites
属性
可以直接被Project
/Settings
使用
1 2 3 4 5 6
| test="test hw"
assert project.test == "test hw" assert settings.test == "test hw"
|
应用脚本
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| def version = [test: 1.0] def deps = [test : "com.example.test:test:${version.test}"] ext.deps = deps
def printHW() { println 'hello world !!!' } ext.printHW = this.&printHW
apply from: rootProject.getRootDir().getAbsolutePath() + '/deps.gradle' println deps.test printlnHW()
|
读取属性文件
修改Artifact文件目录和名称
在gradle 4.10和android gradle tools 3.3.*及以上
1 2 3 4 5 6 7
|
File dir = ApplicationVariant.getPackageApplicationProvider().get().outputDirectory
String name = VariantOutput.outputFileName
|
完整代码,在module的build.gradle
脚本文件中添加如下代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| android { ... applicationVariants.all { variant -> refactorVariant(variant) } }
import com.android.build.gradle.api.ApplicationVariant
def refactorVariant(ApplicationVariant variant) { println "old dir -> " + variant.getPackageApplicationProvider().get().outputDirectory.getAbsolutePath() variant.getPackageApplicationProvider().get().outputDirectory = new File("${project.projectDir.getPath()}/apk/${variant.getBuildType().name}") println "new dir -> " + variant.getPackageApplicationProvider().get().outputDirectory.getAbsolutePath()
variant.getOutputs().each { output -> println "old name -> " + output.outputFileName if (output.outputFileName.endsWith('.apk')) { output.outputFileName = "GradleDemo_${variant.getBuildType().name}_${variant.getVersionName()}.apk" println "new name -> " + output.outputFileName } } }
|
参考