如何无需Clean操作强制Gradle重新生成APK文件
解决Gradle在APK被移动/删除时强制重打包的问题
你找对方向了,package<BuildType>就是负责生成APK的核心任务,要适配所有构建类型,直接在app模块的build.gradle(或build.gradle.kts)里配置即可,不用逐个任务修改。
方案一:强制每次执行都重打包(简单直接)
不管APK是否存在,只要执行构建就会重新打包APK,但不会触发源码重新编译(源码没改动的话,编译任务依然是UP-TO-DATE)。
Groovy DSL 配置
android { buildTypes.all { buildType -> def packageTask = tasks.named("package${buildType.name.capitalize()}") packageTask.configure { outputs.upToDateWhen { false } } } }
Kotlin DSL 配置
android { buildTypes.all { val packageTask = tasks.named("package${name.replaceFirstChar { it.uppercase() }}") packageTask.configure { outputs.upToDateWhen { false } } } }
方案二:仅当APK不存在时重打包(更智能)
只在APK被删除或移动时才触发重打包,其他情况保持UP-TO-DATE,避免无意义的重复操作。
Groovy DSL 配置
android { buildTypes.all { buildType -> def packageTask = tasks.named("package${buildType.name.capitalize()}") packageTask.configure { outputs.upToDateWhen { // 检查所有输出的APK文件是否存在 outputs.files.any { it.exists() } } } } }
Kotlin DSL 配置
android { buildTypes.all { val packageTask = tasks.named("package${name.replaceFirstChar { it.uppercase() }}") packageTask.configure { outputs.upToDateWhen { outputs.files.any { it.exists() } } } } }
原理说明
buildTypes.all会遍历你定义的所有构建类型(比如默认的debug、release,以及自定义的staging等),自动适配所有构建类型的打包任务。package<BuildType>任务的职责是把已经编译好的资源、class文件打包成APK,它不会触发源码编译流程——只要源码没有改动,compile<BuildType>JavaWithJavac这类编译任务会保持UP-TO-DATE,只会执行打包步骤,完全符合你“不重新编译全部源码”的需求。
内容的提问来源于stack exchange,提问作者AntumDeluge
相关产品推荐
相关产品推荐

