如何在Gradle中所有Release变体打包后执行自定义任务?
嘿,这个问题我熟!你完全不用手动给每个变体挨个绑定任务,Gradle提供了遍历所有Android构建变体的API,能轻松实现批量绑定,不管你新增多少变体都能自动生效。
核心解决方案
直接在你的android配置块里,通过遍历所有应用变体,给每个变体的打包任务设置finalizedBy关联你的customTask就行。具体代码如下:
android { // 这里保留你原本的Android配置(比如compileSdk、defaultConfig等) // 你的自定义任务,逻辑不变 task customTask { doLast { // 在这里实现你的解压APK、收集SHA1值的逻辑 println "执行自定义任务:处理APK并收集SHA1" // 你的具体业务代码... } } // 遍历所有应用变体,自动绑定打包任务和自定义任务 applicationVariants.all { variant -> // 获取当前变体对应的打包任务(比如packageDbRelease、packageARRelease) def packageTask = variant.getPackageApplicationProvider().get() // 设置打包任务完成后立即执行customTask packageTask.finalizedBy(customTask) } }
可选:只针对Release变体执行
如果你只希望在Release版本的APK生成后执行任务,可以加个判断过滤:
applicationVariants.all { variant -> // 只处理Release类型的变体 if (variant.buildType.name.equalsIgnoreCase("release")) { def packageTask = variant.getPackageApplicationProvider().get() packageTask.finalizedBy(customTask) } }
为什么这能生效?
applicationVariants.all会在Gradle完成所有变体配置的评估后执行,确保能获取到每个变体对应的打包任务,不管你有多少个渠道、构建类型的组合。getPackageApplicationProvider().get()是当前Gradle Android插件中获取打包任务的标准方式,兼容较新的Gradle版本(如果是旧版Gradle,可能直接用variant.packageApplication,但推荐用Provider方式更稳妥)。
这样不管你新增多少个变体(比如packageXXRelease),都不需要修改代码,Gradle会自动帮你完成绑定。
内容的提问来源于stack exchange,提问作者Dhayanand Bhaskar
相关产品推荐
相关产品推荐

