Gradle: 如何在 Android 库构建后 运行 自定义任务?
Gradle: How to run custom task after an Android Library is built?
我有一个 Android 库,它正在生成一个 debug.aar 和一个 release.aar,我需要将 release.aar 复制到另一个文件夹作为对其他部分的引用项目的。
我现在所做的就是在这个Android库中build.gradle我定义了一个任务:
task copyAARToCommonLibs(type: Copy) {
from('../build/outputs/aar') {
include '*-release.arr'
}
into '../SomeSampleApps/libs'
}
我正在尝试 运行 在生成 arr 后执行此任务,我认为这是 assemble 发布阶段,所以我尝试在此 build.gradle
assembleRelease.doLast{
copyAARToCommonLibs
}
我使用
构建整个项目
gradle build
但是这个任务运行在整个过程的最开始。
我也试过这个:
applicationVariants.all { variant ->
variant.assemble.doLast {
copyAARToCommonLibs
}
}
inside android{} 属性(我想这就是它的名字吧?)
运行 gradle 生成,出现此错误:找不到 属性 'applicationVariants'
然后我看到了这个片段:
tasks.withType(JavaCompile) { compileTask -> compileTask.dependsOn copyAARToCommonLibs }
不过好像编译后任务变成了运行,不知道assemble后怎么改成运行。
谁能纠正我哪里做错了,生成 .arr 文件后如何让这个复制任务工作?
看来 finalizedBy
可能会有帮助。
assembleRelease.finalizedBy(copyAARToCommonLibs)
请注意以下事实,您将不会定义依赖项:
assembleRelease.doLast {
copyAARToCommonLibs
}
实际上..它什么都不做。您需要执行任务:
assembleRelease.doLast {
copyAARToCommonLibs.execute()
}
但是 运行 不鼓励以下列方式执行任务,这是非常糟糕的做法。
你也可以试试:
assembleRelease.doLast {
copy {
from('../build/outputs/aar') {
include '*-release.aar'
}
into '../AscendonSDKSamples/libs'
}
}
我使用了 finalizedBy() 但不得不将其包含在 afterEvaluate 中...
afterEvaluate {
if (gradle.startParameter.taskNames.contains(":app:assembleFatReleaseInternal")) {
play.enabled = true
play.commit = true
play.track = "internal"
play.releaseStatus = "completed"
play.releaseName = versionName
generateFatReleaseInternalBuildConfig.dependsOn set_build_date
assembleFatReleaseInternal.finalizedBy(uploadCrashlyticsSymbolFileFatReleaseInternal)
uploadCrashlyticsSymbolFileFatReleaseInternal.finalizedBy(publishFatReleaseInternal)
}
}
这对于自动将本机符号上传到 Fabric / Crashlytics 以及自动播放商店发布等其他东西非常有效。
因为android工作室是动态添加任务的,所以assembleRelease
不会被识别
在任务添加事件发生后添加挂钩。
tasks.whenTaskAdded {
theTask ->
if (theTask.name.contains('externalNativeBuild')) {
theTask.doLast{
println "[*] begin to copy file."
}
}
// println theTask.name
}
我有一个 Android 库,它正在生成一个 debug.aar 和一个 release.aar,我需要将 release.aar 复制到另一个文件夹作为对其他部分的引用项目的。
我现在所做的就是在这个Android库中build.gradle我定义了一个任务:
task copyAARToCommonLibs(type: Copy) {
from('../build/outputs/aar') {
include '*-release.arr'
}
into '../SomeSampleApps/libs'
}
我正在尝试 运行 在生成 arr 后执行此任务,我认为这是 assemble 发布阶段,所以我尝试在此 build.gradle
assembleRelease.doLast{
copyAARToCommonLibs
}
我使用
构建整个项目 gradle build
但是这个任务运行在整个过程的最开始。
我也试过这个:
applicationVariants.all { variant ->
variant.assemble.doLast {
copyAARToCommonLibs
}
}
inside android{} 属性(我想这就是它的名字吧?) 运行 gradle 生成,出现此错误:找不到 属性 'applicationVariants'
然后我看到了这个片段:
tasks.withType(JavaCompile) { compileTask -> compileTask.dependsOn copyAARToCommonLibs }
不过好像编译后任务变成了运行,不知道assemble后怎么改成运行。
谁能纠正我哪里做错了,生成 .arr 文件后如何让这个复制任务工作?
看来 finalizedBy
可能会有帮助。
assembleRelease.finalizedBy(copyAARToCommonLibs)
请注意以下事实,您将不会定义依赖项:
assembleRelease.doLast {
copyAARToCommonLibs
}
实际上..它什么都不做。您需要执行任务:
assembleRelease.doLast {
copyAARToCommonLibs.execute()
}
但是 运行 不鼓励以下列方式执行任务,这是非常糟糕的做法。
你也可以试试:
assembleRelease.doLast {
copy {
from('../build/outputs/aar') {
include '*-release.aar'
}
into '../AscendonSDKSamples/libs'
}
}
我使用了 finalizedBy() 但不得不将其包含在 afterEvaluate 中...
afterEvaluate {
if (gradle.startParameter.taskNames.contains(":app:assembleFatReleaseInternal")) {
play.enabled = true
play.commit = true
play.track = "internal"
play.releaseStatus = "completed"
play.releaseName = versionName
generateFatReleaseInternalBuildConfig.dependsOn set_build_date
assembleFatReleaseInternal.finalizedBy(uploadCrashlyticsSymbolFileFatReleaseInternal)
uploadCrashlyticsSymbolFileFatReleaseInternal.finalizedBy(publishFatReleaseInternal)
}
}
这对于自动将本机符号上传到 Fabric / Crashlytics 以及自动播放商店发布等其他东西非常有效。
因为android工作室是动态添加任务的,所以assembleRelease
不会被识别
在任务添加事件发生后添加挂钩。
tasks.whenTaskAdded {
theTask ->
if (theTask.name.contains('externalNativeBuild')) {
theTask.doLast{
println "[*] begin to copy file."
}
}
// println theTask.name
}