如何用Gradle的if-else语句切换api与compileOnly依赖?
自动切换Gradle依赖:api vs compileOnly 适配即时/可安装应用
这场景我太熟悉了!手动改依赖确实折腾人,完全可以靠Gradle的条件配置实现自动化,给你分享两种靠谱的方案:
方案一:通过构建任务自动判断
Gradle可以通过当前执行的任务名称识别是否在构建即时应用,直接在模块的build.gradle(或build.gradle.kts)里这么写:
// 判断当前是否为即时应用构建任务 def isBuildingInstantApp = gradle.startParameter.taskNames.any { taskName -> taskName.contains("instant") || taskName.contains("Instant") } dependencies { // 公共基础依赖 implementation 'androidx.core:core-ktx:1.12.0' // 根据构建类型自动切换依赖声明 def targetLibrary = 'com.your.library:your-module:1.0.0' if (isBuildingInstantApp) { compileOnly targetLibrary } else { api targetLibrary } }
原理很直白:当你执行即时应用相关的构建任务(比如assembleInstantDebug),Gradle会自动识别并使用compileOnly;构建可安装应用时则自动切换为api,再也不用手动改配置。
方案二:用产品风味(Product Flavors)区分
如果你的项目已经用风味管理不同应用版本,直接给可安装和即时应用各定义一个风味,针对性配置依赖会更清晰:
android { productFlavors { installable { // 可安装应用的专属配置(比如版本名后缀、资源差异等) } instant { // 即时应用的专属配置 } } } dependencies { // 公共依赖 implementation 'androidx.core:core-ktx:1.12.0' // 可安装应用使用api依赖 installableApi 'com.your.library:your-module:1.0.0' // 即时应用使用compileOnly依赖 instantCompileOnly 'com.your.library:your-module:1.0.0' }
这种方式能把所有差异化配置(不止依赖)都统一到风味里,编译时只要指定对应的风味即可(比如./gradlew assembleInstantRelease),维护起来更省心。
额外提示
- 要是你是多模块项目,即时应用作为独立的feature模块,那直接在feature模块里全用
compileOnly,主应用模块用api就行,不需要额外的条件判断。 - 同步Gradle后记得分别测试两种构建方式,确认依赖生效正常,即时应用的APK体积确实得到了缩减。
内容的提问来源于stack exchange,提问作者Gillis Haasnoot
相关产品推荐
相关产品推荐

