【问题标题】:Gradle: How to run custom task after an Android Library is built?Gradle:构建Android库后如何运行自定义任务?
【发布时间】:2015-12-28 23:09:21
【问题描述】:

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

我现在所做的是在这个 Android Library 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
     }
 }

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

然后我遇到了这个sn-p:

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

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

有人可以纠正我在哪里做错了吗?在生成 .arr 文件后如何让这个复制任务工作?

【问题讨论】:

    标签: android gradle build


    【解决方案1】:

    看来finalizedBy 可能会有所帮助。

    assembleRelease.finalizedBy(copyAARToCommonLibs)
    

    请注意,以下方式不会定义依赖项:

    assembleRelease.doLast {
       copyAARToCommonLibs
    }
    

    实际上.. 它什么也不做。您需要执行任务:

    assembleRelease.doLast {
       copyAARToCommonLibs.execute()
    }
    

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

    你也可以试试:

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

    【讨论】:

    • finalizedBydoLast { task detail } 都为我工作,非常感谢!
    • 只是为了防止有人莫名其妙出错,include '*-release.arr'有个小错字,明明应该是:include '*-release.aar
    • 我收到一个错误:access to finalizedBy exceeds its access rights
    • 当我尝试这个时,我得到以下信息:无法为 org.gradle.api.Project 类型的项目“LibraryProjectName”获取未知属性“assembleRelease”。。有办法解决吗?
    • @AnkitMittal 将其包裹在 afterEvaluate 例如 ... afterEvaluate { assembleRelease.finalizedBy { copyaarfile } }
    【解决方案2】:

    我使用 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 以及自动播放商店发布等其他功能非常有效。

    【讨论】:

    • 添加afterEvaluate 是必不可少的。但我认为通常你会同时定义 assembleFatDebugassembleFatRelease,所以else 在这里可能是错误的。由于您选择了构建配置,因此最终只会调用 assemble 任务之一。另一个已禁用或处于休眠状态。
    • 好电话...看看我正在使用的一些现有 Gradle 脚本 gradle.startParameter.taskNames.contains()。
    【解决方案3】:

    由于android studio是动态添加任务的,所以assembleRelease不会被识别。
    只需在任务添加事件发生后添加钩子即可。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-06-07
      • 1970-01-01
      • 2015-12-30
      • 1970-01-01
      • 2015-08-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多