Gradle内部依赖缺失:Android库发布后应用构建失败
解决Android多模块库发布后依赖缺失问题
问题背景
多模块Gradle项目结构:
├── legacy │ ├── src │ │ └──... │ └── build.gradle ├── data │ ├── src │ │ └──... │ └── build.gradle ├── feature │ ├── src │ │ └──... │ └── build.gradle └── settings.gradle
data依赖legacy(implementation project(":legacy"))feature依赖data和legacy(implementation声明)- 仅
feature对外发布,data/legacy为内部未发布模块 - 应用依赖发布后的
featureAAR时,报错无法找到data/legacy模块
核心原因
Android Library默认不会将依赖的本地模块代码打包进AAR,只会在POM文件中保留依赖声明。当应用依赖发布后的feature时,Gradle会尝试去仓库查找未发布的data/legacy,导致依赖解析失败。
解决方案:将内部模块代码打包进feature的AAR
使用Gradle Shadow插件,把data和legacy的代码合并到feature的AAR中,无需对外发布这两个内部模块。
步骤1:引入Shadow插件
在项目根目录的settings.gradle中配置插件仓库:
pluginManagement { repositories { gradlePluginPortal() google() mavenCentral() } }
在feature/build.gradle中应用Shadow插件:
plugins { id 'com.android.library' id 'com.github.johnrengelman.shadow' version '7.1.2' // 可替换为最新稳定版 }
步骤2:配置Shadow打包规则
在feature/build.gradle中添加Shadow配置,指定要合并的内部模块代码:
shadowJar { // 导入data和legacy模块的编译输出 from project(':data').sourceSets.main.output from project(':legacy').sourceSets.main.output // 处理重复类(根据实际情况调整策略) duplicatesStrategy = DuplicatesStrategy.INCLUDE } // 确保打包AAR时包含Shadow生成的合并代码 tasks.withType(com.android.build.gradle.tasks.PackageLibrary) { dependsOn shadowJar from zipTree(shadowJar.archiveFile) }
步骤3:调整feature的依赖声明
将feature对data/legacy的依赖改为compileOnly,避免传递未发布模块的依赖声明:
// feature/build.gradle compileOnly project(':legacy') compileOnly project(':data')
验证
发布feature模块后,解压生成的AAR文件,检查classes.jar中是否包含data和legacy模块的类文件,确认代码已被打包进去。
为什么之前的尝试无效
api/implementation:仅传递依赖声明,不会打包代码,导致应用仍需查找未发布的内部模块compileOnly:仅在编译时提供依赖,运行时无对应类文件,引发类找不到错误- 本地依赖替换:仅能在本地开发环境生效,无法在团队中统一推行
内容的提问来源于stack exchange,提问作者Sean Beach
相关产品推荐
相关产品推荐

