Die*_*mar 7 dependencies android gradle android-library android-gradle-plugin
我正在一个有3个模块的项目中工作,如下所示:
Project
|
|-- Common
|
|-- SDK
|
|-- App
Run Code Online (Sandbox Code Playgroud)
Common是所有其他模块都依赖的Android库模块,但是我不必在任何地方发布它,因为它仅包含其他模块的通用代码。另一方面SDK,另一个Android库项目必须在我们的内部工件上发布。
App是SDK的示例项目。我可以毫无问题地发布SDK工件,但是当我将其导入客户端应用程序时,编译失败,因为Common找不到模块中的任何类。
对于我使用的SDK模块依赖的第三方依赖关系implementation(例如implementation 'com.squareup.okhttp3:okhttp:3.11.0',所有这些依赖关系都已成功添加到SDKPOM文件中)以及对于Common我使用的模块依赖关系implementation project(path: ':Common')。
在导入SDK库的客户端应用程序中,编译器显示以下错误
Error: cannot access Foo
class file for com.acme.Foo not found
Run Code Online (Sandbox Code Playgroud)
(Foo是“通用”模块中的类)
为什么当我导入模块中SDK的所有类时Common都找不到?我期望的是编译器将两个模块合并为一个模块。有谁知道我该如何解决这个问题?
(我知道一个解决方案是Common在工件上发布,但是我不想这样做,因为这只是内部通用代码)。
我自己也有类似的问题。
一个可视化的帮助是使用Android Studio它自己的项目结构视图:
文件 -> 项目结构
然后:app你可以检查modules dependencies你有什么:
如果需要,您可以删除当前的模块依赖项并再次添加它们以进行仔细检查。之后,当您单击“确定”时,gradle 将尝试同步其文件。
通过这种方式,您可以让 Android Studio 完成集成所有模块的工作,希望它能解决您的问题。
PS:我相信您以错误的方式导入您的项目。你应该使用api而不是implementation. 从文档:
api:当一个模块包含一个 api 依赖项时,它会让 Gradle 知道该模块想要将该依赖项传递给其他模块,以便它们在运行时和编译时都可以使用它。此配置的行为类似于 compile(现已弃用),您通常应仅在库模块中使用它。这是因为,如果 api 依赖项更改其外部 API,Gradle 会在编译时重新编译所有有权访问该依赖项的模块。因此,拥有大量 api 依赖项会显着增加构建时间。除非您想将依赖项的 API 公开给单独的测试模块,否则应用程序模块应改为使用实现依赖项。
查看官方文档:https : //developer.android.com/studio/build/gradle-plugin-3-0-0-migration.html#new_configurations
这是 gradle 模块的预期行为;正如您所猜测的,将每个项目发布为单独的工件(并在 pom 文件中列出依赖项)是唯一受支持的用法。
https://github.com/adwiv/android-fat-aar有一个插件可以满足您的需求,但它不再维护,因此您的情况可能会有所不同。或者,您可以通过更新 SDK 源集以直接指向公共模块源并完全删除 gradle 依赖项来获得类似的结果。找不到合适的链接,但应该是可能的。这确实删除了模块的所有内置处理,但可能更好地匹配您使用模块的方式。