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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 03:28:13