如何从单个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")) }
验证步骤
- 本地构建验证:执行
./gradlew :Parent:assembleRelease,检查Parent的构建输出目录(build/outputs/aar/),确认包含Child和所有AAR的代码与资源。 - 发布验证:先执行
./gradlew :Child:publishReleasePublicationToMavenRepository发布Child,再执行./gradlew :Parent:publishReleasePublicationToMavenRepository发布Parent,检查Maven仓库中的Parent pom.xml是否包含Child的依赖声明。
内容的提问来源于stack exchange,提问作者user6519354
相关产品推荐
相关产品推荐

