导入依赖于本地 aar 文件的库模块

Import library module that has dependency on local aar file

我有一个 Android 具有以下结构的即时应用程序:

F 的 build.gradle 如下:

repositories {
    flatDir {
        dirs 'libs'
    }
}

dependencies {
    api ":local-lib@aar"
}

我尝试将 F 模块包含到 Installed 应用程序模块中,如下所示:

dependencies {
    implementation project(':B')
    implementation project(':F')
}

但是 gradle 无法解析 local-lib,给出错误:

Error:Could not resolve all dependencies for configuration ':Installed:releaseCompileClasspath'.
> Could not find :local-lib:.
  Searched in the following locations:

      ... some remote repositories ...

  Required by:
      project :Installed > project :F

我尝试将 libs 文件夹复制到 project\Installed\libs,但成功了。所以基本上我需要 2 份 local-lib 才能完成这项工作?我应该如何组织导入以避免重复?完美的情况是 libs 文件夹在 F 模块内。

恕我直言,让它工作的最干净的方法是使用一些本地存储库,比如 Maven,在这里发布你的 local-lib,然后从这里引用它,并对你的每个库执行相同的操作.当你发布到一个工件存储库管理器——假设是一个 Maven——你将拥有你的 .aar 和一个 pom 文件,其中包含所有需要的依赖项。

你必须记住,你的 aar 是一种平面文件,这意味着,当你在某处引用它时,没有办法跟踪它的传递依赖性(这是 pom Maven 上的文件)。

这意味着当你在Installed中引用F时,添加了F aar,但是Installed没有不知道它必须获得 local-lib 才能使 F 正常工作,或者不知道在哪里。这就是为什么你在远程存储库上有几行:gradle 在任何地方(在每个可能的地方 = 在你列出的每个存储库中)搜索依赖项。

当您 copy/paste 将代码作为项目的模块时,gradle 知道什么是传递依赖项,因为它可以访问每个依赖项的 gradle 文件。

当您将 aar 直接复制到 Installed/libs 文件夹中时,它也可以工作,因为 gradle 会检查此处(您的 gradle 中可能有一个编译行检查该文件夹)。

如果你想保留平面文件,你应该尝试把所有模块都可以访问的地方放在同一文件夹级别(看看 that 问题),或者你可以尝试添加本地文件-lib 作为 Android 模块项目,而不只是将其放在 libs 文件夹中。