Gradle:如何在构建Android库后运行自定义任务?

时间:2015-10-01 02:07:16

标签: android gradle build

我有一个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之后尝试运行此任务,我假设它是assembleRelease阶段,所以我尝试在此build.gradle中执行此操作

assembleRelease.doLast{
   copyAARToCommonLibs
}

我使用

构建整个项目
 gradle build

但是这项任务在整个过程的最初阶段就开始了。

我也试过这个:

 applicationVariants.all { variant ->
     variant.assemble.doLast {
         copyAARToCommonLibs
     }
 }

在android {}内部属性(我想那是什么叫它?) 运行gradle构建,出现此错误:无法找到属性' applicationVariants'

然后我遇到了这个片段:

tasks.withType(JavaCompile) { compileTask -> compileTask.dependsOn copyAARToCommonLibs }

但似乎这使得任务在编译后运行,我不知道如何修改它以便在汇编后运行。

有人可以在我做错的地方纠正我,如何在生成.arr文件后让这个副本任务工作?

3 个答案:

答案 0 :(得分:17)

似乎finalizedBy可能会有所帮助。

assembleRelease.finalizedBy(copyAARToCommonLibs)

请注意,通过以下方式,您无法定义依赖关系:

assembleRelease.doLast {
   copyAARToCommonLibs
}
实际上......它什么都没做。您需要执行任务:

assembleRelease.doLast {
   copyAARToCommonLibs.execute()
}

但不鼓励以下列方式运行任务,这是非常糟糕的做法。

您也可以尝试:

assembleRelease.doLast {
   copy {
      from('../build/outputs/aar') {
        include '*-release.aar'
      }
      into '../AscendonSDKSamples/libs'
   }
}

答案 1 :(得分:3)

我使用了finalizedBy(),但必须将其包含在afterEvaluate ...

afterEvaluate {
    if (project.hasProperty("assembleFatRelease")) {
        assembleFatRelease.finalizedBy(crashlyticsUploadSymbolsFatRelease)
    } else {
        assembleFatDebug.finalizedBy(crashlyticsUploadSymbolsFatDebug)
    }
}

这适用于自动将原生符号上传到Fabric / Crashlytics。

答案 2 :(得分:0)

由于android studio通过动态添加任务,因此assembleRelease无法被识别。
只需在添加任务事件发生后添加钩子即可。

    tasks.whenTaskAdded {
        theTask ->
            if (theTask.name.contains('externalNativeBuild')) {
                theTask.doLast{
                    println "[*] begin to copy file."
                }
            }
//            println theTask.name
    }