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

KMM共享模块androidMain与Android项目build.gradle.kts的配置疑问

KMM中共享模块androidMain与Android App模块的依赖配置区分

一、何时在共享模块的androidMain中配置依赖?

  • 当依赖是共享模块代码在Android平台上的实现支撑时,放在这里:
    • 跨平台库的Android专属驱动/实现,比如SQLDelight的Android Driver、Ktor的Android HttpClient引擎——这些是commonMain里的通用逻辑(如数据库操作、网络请求接口)在Android端运行必需的底层依赖。
    • 仅被共享模块内Android专属代码调用的依赖,比如共享模块androidMain中写的Android特用工具类所需的AndroidX库片段,这类依赖只服务于共享模块自身的Android端逻辑,无需暴露给App模块。
    • 跨平台Kotlin库的Android变体依赖,部分KMM库会针对Android提供适配版本,需在androidMain中引入以匹配平台特性。

二、何时在androidApp的build.gradle.kts中配置依赖?

  • 当依赖是Android应用层专属的功能依赖时,放在这里:
    • 仅App模块使用的UI库,比如Jetpack Compose组件、Material Design库——这些是App层构建界面的工具,和共享模块的跨平台逻辑无关。
    • 应用级服务依赖,比如Firebase Analytics、Crashlytics这类仅在App层初始化和调用的服务,共享模块无需直接依赖。
    • 仅被App模块代码调用的Android系统API封装库,比如权限处理、系统服务封装工具,共享模块的跨平台逻辑不涉及这些场景。

三、为什么共享模块需要androidMain代码集?

共享模块的核心是复用跨平台通用逻辑,但并非所有代码都能完全跨平台统一实现:

  • 部分功能在不同平台的实现逻辑差异极大,无法在commonMain中统一编写。比如文件存储、传感器访问、系统通知,Android和iOS的API完全不同,必须分别在androidMain和iosMain中写平台专属实现,再通过commonMain的expect/actual机制让通用逻辑调用这些平台代码。
  • 跨平台库的平台专属配置/初始化代码,比如Ktor的Android端需要指定特定网络引擎,这类代码只能放在对应平台的sourceSet中。
  • 共享模块可能需要适配Android特有特性,比如使用Context、ContentResolver等系统API实现逻辑,这部分代码只能放在androidMain中,避免污染commonMain的跨平台纯净性。

本质上,androidMain是共享模块里Android平台专属代码和依赖的容器——既保证了commonMain通用逻辑的跨平台独立性,又能让共享模块在Android平台上完整实现所需功能,同时保持代码职责的清晰划分,不用把平台专属代码强行塞进App模块。

内容的提问来源于stack exchange,提问作者me.at.coding

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 03:42:10