AAR 依赖项 - 是否捆绑?

AAR dependencies - bundle or not?

我正在开发自己的 SDK,而这又依赖于某些第 3 方 SDK。例如 - OkHttp.

我应该将 OkHttp 添加到我的 build.gradle,还是让我的 SDK 用户包含它?在这种情况下,他们可能 "anyway" 使用它,所以可以肯定地说他们已经拥有它。

要补充的另一点 - 并非我的 SDK 的所有路径都需要 "OkHttp",因此,理论上,我的 SDK 的某些用户只能使用这些部分,并且他的 APK 上没有 OkHttp。

我正在考虑的另一件事: 如果我通过 build.gradle 嵌入 OkHttp - 我的 SDK 用户如何使用该 OkHttp 库,而不是使用另一个副本?

您需要了解 api 和 gradle 中的实施 link 会有帮助

Api: 作用:声明,API,依赖关系

消耗品?没有

可解决?没有

说明:您应该在此处声明依赖项,这些依赖项可传递地导出给消费者以进行编译。

实施: 作用:声明、实现、依赖

消耗品?没有

可解决?没有

说明:您应该在此处声明纯粹内部的依赖项,不打算向消费者公开。

使用 implementation 并打包 - 消费者仍然可以 exclude 它。

一个人不能依赖某样东西然后不打包它;这不会建立。

在应用程序包中,它can/must只存在一次...所以有什么意义?

Should I add OkHttp to my build.gradle, or let the users of my SDK include that?

build.gradle中添加依赖并不意味着将依赖打包到aar文件中。 aar 文件 不包含传递依赖项 并且没有描述库使用的依赖项的 pom 文件。

将工件上传到 maven 存储库,您将拥有 aar 和一个包含依赖项列表的 pom 文件。
这样 gradle 将自动下载所有依赖关系树,您可以将 gradle 配置为 排除 相同的库。

我会倒序回答你的问题

Another thing I am contemplating: If I do embed OkHttp on by build.gradle - how can users of my SDK use that OkHttp library, instead of consuming another replica?

假设 Gradle 构建系统是如何工作的,在我的项目中,我使用你的库,我使用的是 OkHttp 的 v2,而你的库使用的是 OkHttp 的 V1,那么 gradle 将自动使用最新版本。你可以阅读它here

Another point to add - not all paths of my SDK needs "OkHttp", so, in theory, some user of my SDK could use those parts only, and have not OkHttp on his APK.

在我的项目中,我使用了你的库,它使用了 OkHttp,而我在我的项目中也没有使用它,我没有使用你库中你使用 OkHttp 的部分,但我的 APK 仍然包含OKHttp 在里面。这可以通过将您的库拆分为两个单独的库或在我的项目中使用混淆器来避免。

Should I add OkHttp to my build.gradle, or let the users of my SDK include that? In this scenario, they will probably "anyway" use it, so its safe to say they already have it.

你不应该将它捆绑在你的图书馆中你只是使用 implementation 并且让你的图书馆的用户决定他是否想要排除它。