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
相关产品推荐
相关产品推荐

