You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Gradle:Android APK生成后立即执行自定义任务

让CustomTask在所有APK生成后自动触发的解决方案

嘿,我刚好处理过一模一样的需求,给你一套靠谱的实现方式,确保不管你构建的是Debug、Release还是自定义Flavor的APK,你的CustomTask都能在APK生成完成后精准触发:

第一步:先把你的CustomTask捋顺

先确认你写的解压+SHA1收集任务已经能正常跑起来,要是还没完全定型,参考这个基础结构就行:

task collectApkSha1(type: CustomTask) {
    // 这里放你的任务逻辑:比如指定APK路径、要提取的文件、计算SHA1的代码
    // 后面我们会动态给它传当前变体的APK路径,不用硬写死
}

第二步:把任务绑定到所有APK构建流程

核心就是用Gradle的finalizedBy机制(任务完成后自动执行指定任务),再结合Android Gradle插件的变体API,遍历所有构建变体,让每个变体的APK生成任务都关联你的CustomTask。

方案一:绑定到完整构建任务(覆盖所有场景)

assemble<变体名>是每个变体的完整构建任务(从编译到打包出APK全流程),把你的任务设为它的finalizedBy,不管是点Android Studio的「Build APK」,还是跑./gradlew assemble命令,都会触发:

android {
    // ... 你的其他Android配置(比如compileSdk、defaultConfig这些)

    // 遍历所有应用变体
    applicationVariants.all { variant ->
        // 获取当前变体的assemble任务
        def assembleTask = tasks.named("assemble${variant.name.capitalize()}")
        // 让assemble任务跑完后自动执行你的CustomTask
        assembleTask.configure {
            finalizedBy collectApkSha1
        }

        // 可选:给你的任务传当前变体的APK路径,不用硬编码
        collectApkSha1.configure {
            // 获取这个变体输出的APK文件
            apkFile = variant.outputs.first().outputFile
            // 还能传其他参数,比如要收集SHA1的文件路径列表
            targetFiles = ["classes.dex", "resources.arsc"]
        }
    }
}

方案二:精准绑定到APK打包任务

如果你只想在APK打包完成后触发(比如单独执行packageDebug这种打包命令时也触发,跳过编译步骤),那就绑定到变体的package<变体名>任务:

android {
    // ... 其他配置

    applicationVariants.all { variant ->
        def packageTask = tasks.named("package${variant.name.capitalize()}")
        packageTask.configure {
            finalizedBy collectApkSha1
        }

        // 同样可以动态传APK路径
        collectApkSha1.configure {
            apkFile = variant.outputs.first().outputFile
        }
    }
}

第三步:测试验证

随便选几种场景测一遍:

  • 跑./gradlew assembleDebug,跑完看看你的CustomTask是不是自动执行了
  • 跑./gradlew assembleRelease,同样确认触发
  • 在Android Studio里选个自定义Flavor的变体,点「Build APK(s)」,检查任务日志

几个小提醒

  • 如果你有多个Flavor和Build Type的组合,applicationVariants.all会自动遍历所有变体,不会漏掉任何一个
  • 要是你项目生成拆分APK(比如按ABI拆分),别用outputs.first(),改成遍历variant.outputs获取所有APK文件
  • 尽量给你的CustomTask设置输入输出,符合Gradle增量构建规则——比如把APK设为输入,SHA1结果文件设为输出,这样没变化的话就不会重复执行,节省时间

内容的提问来源于stack exchange,提问作者Dhayanand Bhaskar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 03:56:30