如何在Android Library中导出依赖?AGP 3.0.0+及静态文件依赖场景
解决Android Library模块依赖导出与静态类跨模块访问问题
我来帮你理清AGP 3.0.0之后模块依赖导出的逻辑,以及静态类跨模块访问的解决办法:
一、先搞懂AGP 3.0+的api vs implementation
从AGP 3.0.0开始,Gradle引入了api和implementation两种依赖声明方式,核心区别就是是否传递依赖:
- 使用
api声明的依赖:会把这个依赖完整导出到所有依赖当前模块的上层模块(比如你的主应用),上层模块可以直接访问该依赖的所有类和资源。 - 使用
implementation声明的依赖:仅当前模块内部可用,上层模块看不到这个依赖的内容,只能通过当前模块暴露的接口间接使用。
举个实际配置例子,在你的Android Library模块的build.gradle里:
// 这个依赖会被传递给主应用,主应用能直接用它的类 api project(":some-common-module") // 这个依赖仅当前Library自己能用,主应用访问不到 implementation "com.google.guava:guava:31.0.1-android"
二、静态类NeededEverywhere的跨模块访问处理
如果你的NeededEverywhere类在独立的everywhere Gradle模块里,要让依赖Library的主应用也能直接访问它,只需要两步:
- 确保
everywhere模块是一个标准的Android Library或Java Library模块(根据类的类型选择,纯Java类就用Java Library); - 在你的业务Library模块里,用
api依赖这个everywhere模块:
api project(":everywhere")
这样主应用在依赖你的业务Library后,不需要额外依赖everywhere模块,就能直接导入并使用NeededEverywhere类了。
三、常见问题排查
如果按上面配置后还是访问不到传递依赖,可以检查这几点:
- 确认项目的AGP版本确实≥3.0.0:在项目根目录的
build.gradle里查看com.android.tools.build:gradle的版本号; - 有没有不小心把
api写成了implementation?这是最容易犯的错误; - 清理Gradle缓存并重新构建:执行命令
./gradlew clean build(Windows用gradlew.bat clean build),有时候缓存会导致依赖关系不更新; - 静态类的访问权限:确保
NeededEverywhere是public修饰的,包路径也没有写错;如果开启了混淆,要在proguard规则里添加保留该类的配置,避免被混淆掉。
内容的提问来源于stack exchange,提问作者medavox
相关产品推荐
相关产品推荐

