解释 Android Build System 文档中描述的传递依赖策略

Posted

技术标签:

【中文标题】解释 Android Build System 文档中描述的传递依赖策略【英文标题】:Explain transitive dependencies strategy described in Android Build System documentation 【发布时间】:2014-10-25 19:54:51 【问题描述】:

有人能解释一下下面引用的这段简短段落中 android 工具团队的含义吗?

具体来说: 什么是“somelib.jar”?

他们是否建议我创建一个只有依赖项的新子项目,将其命名为“projectA”,然后让项目发布“projectA.jar”? (使用 artifacts.add("default", file('projectA.jar'))

我想要的预期行为是发布“projectA.jar”及其依赖项,而不会导致任何“多个 dex 文件定义”错误。

http://tools.android.com/tech-docs/new-build-system/tips#TOC-Handling-transitive-dependencies-for-local-artifacts-jars-and-aar-

引用:

如果你有一个本地 jar 或 aar 库你想在更多地方使用 除了一个项目,您不能直接将其作为本地项目引用 依赖。这是因为 android 插件会报错 对项目及其所有项目进行 dexing 时两次找到相同的 jar 文件 依赖关系。 (请注意,现在您实际上不能使用本地 aar 文件,即使您只引用一次)。

解决此问题的一种方法是将工件部署到存储库中。尽管 这是可能的,由于开销可能不方便 管理这样的存储库。

另一种选择是创建一个新的 Gradle 子项目,并使其 项目的已发布工件是您想要的 jar 或 aar 文件 重用。然后你可以简单地让其他 Gradle 子项目依赖 这个新的子项目。

在这个新的子项目中,只需创建一个 build.gradle 以下:

configurations.create("default")

artifacts.add("default", file('somelib.jar'))

【问题讨论】:

【参考方案1】:

在我看来,这主要用于库模块。

如果一个库模块依赖于somelib.jar,另一个依赖于该库模块的应用程序模块也依赖于somelib.jar,则可能会出现“多个dex文件定义”错误。

正如“Tips”所说,这个问题可以通过创建一个简单的模块来解决,该模块无法发布*.jar*.aar并且以前只能被其他模块依赖 ,只有依赖*.jars。这样,库模块的*.aar 输出将不包括somelib.jar

【讨论】:

以上是关于解释 Android Build System 文档中描述的传递依赖策略的主要内容,如果未能解决你的问题,请参考以下文章

[Android AOSP] /system/priv-app 和 /system/app区别

理解 Android Build 系统

Android通过SystemProperties获取build.prop中配置的信息

Android通过SystemProperties获取build.prop中配置的信息

Android系统信息获取

Android——build.prop 解析