如何为多模块Kotlin Multiplatform库构建Fat/Uber AAR
解决KMP多模块打包成Fat AAR的方案
针对你的KMP多模块架构,要把my-sdk-api、my-sdk-domain、my-sdk-data打包进my-sdk的Android AAR产物,让使用者仅依赖my-sdk即可使用,可通过以下步骤实现:
1. 引入Fat AAR插件
在项目根目录的build.gradle.kts中添加插件依赖:
plugins { id("com.kezong.fat-aar") version "3.3.0" apply false }
2. 配置my-sdk模块
在:my-sdk的build.gradle.kts中完成以下配置:
2.1 应用必要插件
plugins { kotlin("multiplatform") id("com.android.library") id("com.kezong.fat-aar") id("maven-publish") // 用于发布到MavenLocal }
2.2 配置Android目标的嵌入依赖
在android块中,用embed替代原有的implementation/api,将本地模块打包进AAR:
android { compileSdk = 34 defaultConfig { minSdk = 21 targetSdk = 34 } // 保留你的buildTypes、productFlavors等原有配置 dependencies { // 嵌入所有需要打包进AAR的本地模块 embed(project(":my-sdk-api")) embed(project(":my-sdk-domain")) embed(project(":my-sdk-data")) } }
2.3 保留KMP公共代码依赖
在kotlin.sourceSets中,保留公共代码对API模块的依赖,确保跨平台代码能正常编译:
kotlin { androidTarget { compilations.all { kotlinOptions.jvmTarget = "1.8" } } iosX64() iosArm64() iosSimulatorArm64() sourceSets { val commonMain by getting { dependencies { // 公共代码依赖API模块,确保接口能被跨平台代码引用 api(project(":my-sdk-api")) // domain和data的公共依赖可保留implementation,Android端已通过embed打包 implementation(project(":my-sdk-domain")) implementation(project(":my-sdk-data")) } } // 保留你的androidMain、iosMain等其他sourceSet配置 } }
3. 配置发布产物
确保发布的是Fat AAR而非普通AAR,在publishing块中指定Fat AAR文件:
publishing { publications { create<MavenPublication>("release") { groupId = "com.mydomain" artifactId = "my-sdk" version = "1.0.0" // 关联Android release组件 from(components["release"]) // 替换为Fat AAR产物(插件会生成带-fat后缀的AAR) val fatAar = tasks["assembleRelease"].outputs.files.single { it.name.endsWith("-fat.aar") } artifact(fatAar) } } repositories { mavenLocal() } }
4. 发布与验证
- 执行Gradle任务:
./gradlew :my-sdk:publishToMavenLocal - 在Android应用中添加依赖:
implementation("com.mydomain:my-sdk:1.0.0") - 验证是否能正常解析
my-sdk-api中的接口类,以及通过Factory类使用库功能
注意事项
- 无需单独发布
my-sdk-api、my-sdk-domain、my-sdk-data模块,避免使用者出现依赖冲突 - Fat AAR插件版本需与你的Gradle版本兼容,若出现兼容性问题可尝试调整插件版本
- iOS目标的Framework产物会自动合并所有模块代码,使用者仅需依赖
my-sdk的Framework即可使用iOS端功能
内容的提问来源于stack exchange,提问作者J. Hegg
相关产品推荐
相关产品推荐

