1

我有一个具有以下结构的 Android Instant App:

  • B:基础模块
  • 已安装:已安装的应用模块
  • Instant:即时应用模块
  • F:具有特定于已安装应用程序的功能的功能。F 取决于位于local-lib的本地 aar 库project\F\libs

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模块内。

4

1 回答 1

1

恕我直言,使其工作的最干净的方法是使用一些本地存储库,如 Maven,在此处发布您的local-lib,并从此处引用它,并对您的每个库执行相同的操作。当您发布到工件存储库管理器(比如说 Maven)时,您的.aar将与pom文件相结合,其中包含所有需要的依赖项。

您必须记住,您的 aar 是一种平面文件,这意味着,当您在某处引用它时,无法跟踪它的传递依赖关系(这是Maven 上pom文件的工作)。

这意味着当您引用Fin时Installed,会添加F aar,但Installed不知道它必须获取local-lib才能F正常工作,或者不知道在哪里。这就是为什么您在远程存储库中有行的原因:gradle 到处搜索(在每个可能的位置 = 在您列出的每个存储库中)以查找依赖项。

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

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

如果您想保留平面文件,您应该尝试将所有模块都可以访问的位置放在同一文件夹级别(看看那个问题),或者您可以尝试将 local-lib 添加为 Android 模块项目,并且不只是把它放在 libs 文件夹中。

于 2017-05-31T13:24:26.330 回答