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
    }