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

如何为多模块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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 05:48:28