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

如何在我自己的Android库中使用Android支持库,android,android-support-library,Android,Android Support Library,我的公司有一个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编译库,那么第

我的公司有一个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编译库,那么第三方应用程序将收到警告

如果我们开发的是一个独立的应用程序,那么解决方案是明确的;只需更新所有内容以使用最新(28)版本的支持库。如果我们移动到
androidX
,同样的交易

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

据我所知,在这里做什么没有指导。我能想到的选择是:

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

  • 从SDK中删除对
    com.android.support
    的所有引用。这是非常痛苦的,因为
    LocalBroadcastmanager
    只存在于支持库中,它不是Android本身的一部分,而且我们广泛使用
    @NonNull
    @Nullable
    。它们在防止bug方面非常出色,对Kotlin的支持非常重要,我不想失去它们

  • 从我们的SDK中删除对
    com.android.support
    的所有引用,但对
    com.android.support:support注释
    @Nullable
    进行豁免。也许这会让警告消失?但是,丢失
    LocalBroadcastManager
    并不是件好事。这样行吗

  • 始终提供根据最新支持库编译的SDK,并积极推动第三方进行更新。像这样推第三方感觉不好,而且这也意味着如果我们在9个月内没有发布,我们将不得不发布临时版本,以跟上Android支持库的更新

  • 根据不同的支持库并行提供不同版本的SDK,第三方可以从中选择他们想要的版本。这是一个很大的工作(我们有多少版本回去了?),我想会相当混乱

  • 放弃并仅支持iOS(lol)

  • 无论如何,正如前面提到的,我一直无法找到任何关于如何处理这类事情的指导。任何反馈都将不胜感激

    选择7如何

    这只是生活中的一个事实(?)您的实现并不总是与用户的实现相匹配

    我遇到过有些过时的库(使用support 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"
    }
    
    这样,只有
    支持注释
    被排除在实现之外,剩下的就不用管了

    我认为一个很好的方法是做两件事:

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


  • 另外,如果我实现的库使用的支持库版本高于我自己的版本,我认为我从来没有遇到过问题。这可能只是lint中的一个错误。

    如果实现不匹配,我并不介意,但来自Android studio的警告确实让我有点担心;这让我觉得,如果我的库引用了26版的支持库,而第三方应用引用了28版,那么应用程序可能会崩溃或微妙地崩溃,但是的,我想这可能是OK,它可能会崩溃。这就是警告存在的原因。啊。那么,避免这种风险的唯一方法就是完全避免在您分发给第三方的任何库中引用支持库。竖起大拇指谷歌