我的公司有一个android库(SDK),我们将其分发给第三方。它使用了Android支持库的某些功能-特别是(但不限于)android.support.annotation
和android.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),我们不能这样做。
据我所知,这里没有指导。我能想到的选项:
什么也不做。第三方可以忽略该警告。这是我们过去一直在做的事情,看起来确实不错,但是我不喜欢运送会向客户发出警告的东西的想法。
从我们的SDK中删除对com.android.support
的所有引用。这非常痛苦,因为LocalBroadcastmanager
仅存在于支持库中,它不是Android本身的一部分,而且我们广泛使用@NonNull
和@Nullable
。它们非常擅长防止错误,并且对于Kotlin支持非常重要,我也不想失去它们。
从我们的SDK中删除所有对com.android.support
的引用,但将com.android.support:support-annotations
的{{1}}免除。也许那会使警告消失了?丢失@Nullable
并不好。这样还可以吗?
始终将针对最新支持库编译的SDK寄出,并积极推动第三方进行更新。像这样推动第三方感觉不好,这也意味着如果我们没有发布9个月的版本,我们将不得不发布临时版本以跟上Android支持库的更新。
根据不同的支持库并行编译我们的SDK的不同版本,第三方可以在其中选择所需的库。这是很多工作(我们要返回几个版本?),我想起来会很混乱。
放弃并仅支持iOS(lol)
无论如何-如前所述,我一直无法找到有关如何处理此类问题的指南。任何反馈将不胜感激
答案 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
,其余的都被保留了。
我认为解决此问题的一种好方法是做两件事:
PS,如果我实现的库所使用的支持库版本高于我自己的版本,我认为我从来没有遇到过问题。这可能只是皮棉上的一个错误。