如何在我自己的Android库中使用Android支持库

时间:2018-10-07 21:26:05

标签: android android-support-library

我的公司有一个android库(SDK),我们将其分发给第三方。它使用了Android支持库的某些功能-特别是(但不限于)android.support.annotationandroid.support.v4.content.LocalBroadcastManager

问题是,如果我们针对(例如)com.android.support:appcompat-v7:27.1.1编译库,而第三方针对(例如)com.android.support:appcompat-v7:28.0.0编译,则第三方应用会收到All com.android.support libraries must use the exact same version specification警告。 / p>

如果我们正在开发一个独立的应用程序,那么解决方法很明确;只需更新所有内容即可使用支持库的最新(28)版本。如果我们要移至androidX,也是一样。

但是,对于可能已经过时的可再发行库(第三方可以在我们的SDK发布后18个月使用我们的SDK),我们不能这样做。

据我所知,这里没有指导。我能想到的选项:

  1. 什么也不做。第三方可以忽略该警告。这是我们过去一直在做的事情,看起来确实不错,但是我不喜欢运送会向客户发出警告的东西的想法。

  2. 从我们的SDK中删除对com.android.support的所有引用。这非常痛苦,因为LocalBroadcastmanager仅存在于支持库中,它不是Android本身的一部分,而且我们广泛使用@NonNull@Nullable。它们非常擅长防止错误,并且对于Kotlin支持非常重要,我也不想失去它们。

  3. 从我们的SDK中删除所有对com.android.support的引用,但将com.android.support:support-annotations的{​​{1}}免除。也许那会使警告消失了?丢失@Nullable并不好。这样还可以吗?

  4. 始终将针对最新支持库编译的SDK寄出,并积极推动第三方进行更新。像这样推动第三方感觉不好,这也意味着如果我们没有发布9个月的版本,我们将不得不发布临时版本以跟上Android支持库的更新。

  5. 根据不同的支持库并行编译我们的SDK的不同版本,第三方可以在其中选择所需的库。这是很多工作(我们要返回几个版本?),我想起来会很混乱。

  6. 放弃并仅支持iOS(lol)

无论如何-如前所述,我一直无法找到有关如何处理此类问题的指南。任何反馈将不胜感激

1 个答案:

答案 0 :(得分:3)

选项7怎么样?

您的实现并不总是与用户的实现匹配是生活中的事实(?)。

我遇到了一些过时的库(使用支持25.1.3或类似的东西),并且遇到了这个错误。但是有一个非常简单的修复程序。您只需修改一下实现:

implementation ("com.my:project:project-name:1.0.0") {
    exclude group: "com.android.support"
}

这应该是不言自明的,但这只是告诉Gradle忽略库的支持实现,而是使用应用程序的实现。

这有一个潜在的问题,即如果用户未实现您使用的支持库之一,则他们只有自己实现才可以构建。但这也很容易解决:

implementation ("com.my:project:project-name:1.0.0") {
    exclude group: "com.android.support" module: "support-annotations"
}

这样,在实现中只排除了support-annotations,其余的都被保留了。

我认为解决此问题的一种好方法是做两件事:

  1. 修改自述文件以说明您使用的支持库。
  2. 指导用户如何从您的库的实现中排除他们当前在其应用程序中使用的内容(只需为每个人从上方复制该“排除”行)。

PS,如果我实现的库所使用的支持库版本高于我自己的版本,我认为我从来没有遇到过问题。这可能只是皮棉上的一个错误。