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

nie*_*umi 12 android build gradle

我有一个Android库,它生成一个debug.aar和一个release.aar,我需要将release.aar复制到另一个文件夹作为对项目其他部分的引用.

我现在所做的是在这个Android库build.gradle我定义了一个任务:

task copyAARToCommonLibs(type: Copy) {
    from('../build/outputs/aar') {
        include '*-release.arr'
    }
    into '../SomeSampleApps/libs'
}
Run Code Online (Sandbox Code Playgroud)

我正在尝试在生成arr之后运行此任务,我假设它是assembleRelease阶段,所以我尝试在此build.gradle中执行此操作

assembleRelease.doLast{
   copyAARToCommonLibs
}
Run Code Online (Sandbox Code Playgroud)

我使用构建整个项目

 gradle build
Run Code Online (Sandbox Code Playgroud)

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

我也试过这个:

 applicationVariants.all { variant ->
     variant.assemble.doLast {
         copyAARToCommonLibs
     }
 }
Run Code Online (Sandbox Code Playgroud)

在android {}属性里面(我猜这就是它的名字?)运行gradle build,得到了这个错误:找不到属性'applicationVariants'

然后我遇到了这个片段:

tasks.withType(JavaCompile) { compileTask -> compileTask.dependsOn copyAARToCommonLibs }
Run Code Online (Sandbox Code Playgroud)

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

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

Opa*_*pal 19

看来这finalizedBy可能会有所帮助.

assembleRelease.finalizedBy(copyAARToCommonLibs)
Run Code Online (Sandbox Code Playgroud)

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

assembleRelease.doLast {
   copyAARToCommonLibs
}
Run Code Online (Sandbox Code Playgroud)

实际上..它什么都没做.您需要执行任务:

assembleRelease.doLast {
   copyAARToCommonLibs.execute()
}
Run Code Online (Sandbox Code Playgroud)

但是劝阻以下列方式执行任务并且非常糟糕.

你也可以尝试:

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

  • 当我尝试这个时,我得到以下内容:**无法为org.gradle.api.Project类型的项目'LibraryProjectName'获取未知属性'assembleRelease'.**.有办法解决吗? (15认同)
  • "finalizedBy"和"doLast {task detail}"都适合我,非常感谢你们! (2认同)
  • 为了防止有人发生莫名其妙的错误,`include'*-release.arr'`中有一个小错字,显然应该是:`include'*-release.aar` (2认同)
  • @AnkitMittal 将其包装在 afterEvaluate 中,例如 ... afterEvaluate { assembleRelease.finalizedBy { copyaarfile } } (2认同)

She*_*ude 5

我使用了 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)
    }
}
Run Code Online (Sandbox Code Playgroud)

这对于自动将原生符号上传到 Fabric / Crashlytics 和其他东西(例如自动 Play 商店发布)非常有效。