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

如何从单个Android Library Gradle子项目生成并使用多个AAR

替代Fat-AAR的Gradle 8+解决方案

针对你的Unity-as-a-Library场景,以下是适配Gradle 8+的完整实现方案,覆盖所有需求:

1. 配置Child模块:发布本地AAR到Maven

首先将libs下的AAR作为Child模块的依赖,并通过maven-publish插件将Child及其依赖的AAR一同发布到Maven仓库。

Child模块build.gradle.kts配置:

plugins {
    id("com.android.library")
    id("maven-publish")
}

android {
    namespace "com.your.package.child"
    compileSdk = 34

    defaultConfig {
        minSdk = 24
        targetSdk = 34
        versionCode = 1
        versionName = "1.0.0"
    }

    buildTypes {
        release {
            isMinifyEnabled = false
            proguardFiles(getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro")
        }
    }
}

// 引入本地libs目录的AAR
repositories {
    flatDir { dirs("libs") }
}

dependencies {
    // 明确声明libs下的AAR(不建议通配符,避免依赖混乱)
    implementation(name = "unity-library-1", ext = "aar")
    implementation(name = "unity-library-2", ext = "aar")
    // 其他常规依赖...
}

publishing {
    publications {
        create<MavenPublication>("release") {
            from(components["release"])

            // 设置Maven坐标
            groupId = "com.your.package"
            artifactId = "child"
            version = "1.0.0"

            // 将libs下的AAR作为独立构件发布(可选:如果需要单独引用这些AAR)
            fileTree("libs").matching { include("*.aar") }.forEach { file ->
                artifact(file) {
                    setArtifactId(file.nameWithoutExtension)
                    type = "aar"
                }
            }
        }
    }

    // 配置Maven仓库地址与凭证
    repositories {
        maven {
            url = uri("https://your-maven-repo-url")
            credentials {
                username = System.getenv("MAVEN_USER")
                password = System.getenv("MAVEN_PWD")
            }
        }
    }
}

2. 配置Parent模块:本地/发布场景的依赖切换

通过Gradle任务参数判断构建场景,实现本地构建依赖Child子项目,发布时依赖Maven上的Child构件。

Parent模块build.gradle.kts配置:

plugins {
    id("com.android.library")
    id("maven-publish")
}

android {
    namespace "com.your.package.parent"
    compileSdk = 34

    defaultConfig {
        minSdk = 24
        targetSdk = 34
        versionCode = 1
        versionName = "1.0.0"
    }

    buildTypes {
        release {
            isMinifyEnabled = false
            proguardFiles(getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro")
        }
    }
}

// 判断是否为发布任务:如果任务包含publish,则使用Maven依赖,否则用本地子项目
val isPublishTask = gradle.startParameter.taskNames.any { it.contains("publish", ignoreCase = true) }

dependencies {
    if (isPublishTask) {
        implementation("com.your.package:child:1.0.0")
    } else {
        implementation(project(":Child"))
    }
}

publishing {
    publications {
        create<MavenPublication>("release") {
            from(components["release"])

            groupId = "com.your.package"
            artifactId = "parent"
            version = "1.0.0"

            // 确保依赖传递到下游项目
            pom.withXml {
                val dependenciesNode = asNode().appendNode("dependencies")
                configurations.implementation.get().allDependencies.forEach { dep ->
                    if (dep.group != null && dep.name != null && dep.version != null) {
                        val depNode = dependenciesNode.appendNode("dependency")
                        depNode.appendNode("groupId", dep.group)
                        depNode.appendNode("artifactId", dep.name)
                        depNode.appendNode("version", dep.version)
                        depNode.appendNode("scope", "compile")
                    }
                }
            }
        }
    }

    repositories {
        maven {
            url = uri("https://your-maven-repo-url")
            credentials {
                username = System.getenv("MAVEN_USER")
                password = System.getenv("MAVEN_PWD")
            }
        }
    }
}

3. 第三方AAR打包优化(可选)

如果libs下的AAR是Unity提供的第三方构件,无法单独发布到Maven,可以通过Gradle任务将其内容合并到Child的输出AAR中,避免依赖缺失:

在Child模块添加合并任务:

tasks.register<Copy>("mergeLocalAars") {
    val childOutputDir = layout.buildDirectory.dir("intermediates/aar_main_jar/release").get().asFile.parentFile
    fileTree("libs").matching { include("*.aar") }.forEach { aar ->
        from(zipTree(aar)) {
            exclude("AndroidManifest.xml") // 避免覆盖Child的清单文件
            into(childOutputDir) // 合并到Child的构建输出目录
        }
    }
}

// 关联到assemble任务,确保构建时自动合并
tasks.named("assembleRelease") {
    dependsOn("mergeLocalAars")
}

4. 下游项目依赖简化

其他子项目只需直接依赖Parent模块即可,Gradle会自动传递Child及其所有依赖的AAR:

dependencies {
    implementation(project(":Parent"))
}

验证步骤

  1. 本地构建验证:执行./gradlew :Parent:assembleRelease,检查Parent的构建输出目录(build/outputs/aar/),确认包含Child和所有AAR的代码与资源。
  2. 发布验证:先执行./gradlew :Child:publishReleasePublicationToMavenRepository发布Child,再执行./gradlew :Parent:publishReleasePublicationToMavenRepository发布Parent,检查Maven仓库中的Parent pom.xml是否包含Child的依赖声明。

内容的提问来源于stack exchange,提问作者user6519354

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 03:17:10