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

时间:2017-05-31 13:03:57

标签: android gradle android-gradle android-instant-apps

我有一个Android Instant App,结构如下:

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

F' build.gradle正在关注:

repositories {
    flatDir {
        dirs 'libs'
    }
}

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

我尝试将F模块包含到Installed app模块中,如下所示:

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模块内,则完美的情况。

1 个答案:

答案 0 :(得分:1)

恕我直言,最简洁的方法就是使用一些本地存储库,比如Maven,在这里发布你的local-lib,并从这里引用它,并为你的每个库做同样的事情。当您发布到工件存储库管理器时 - 让我们说一个Maven - 您将 .aar pom 文件相结合,其中包含所有必需的依赖项。

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

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

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

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

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