代码之家  ›  专栏  ›  技术社区  ›  Orion Edwards

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

  •  2
  • Orion Edwards  · 技术社区  · 6 年前

    我的公司有一个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 警告。

    如果我们开发的是一个独立的应用程序,那么解决方案就很清楚了;只需更新所有内容以使用最新(28)版本的支持库。如果我们搬到 androidX .

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

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

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

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

    3. 删除对的所有引用 com.android.support支持 从我们的软件开发工具包中,但免除 com.android.support:support-annotations 对于 @可以为空 . 也许这会使警告消失?失败的 LocalBroadcastManager 不过也不太好。这还可以吗?

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

    5. 将我们针对不同支持库编译的SDK并行发布不同版本,第三方可以在其中选择他们想要的版本。这是很多工作(我们要返回多少个版本?)我想会很困惑。

    6. 放弃并只支持iOS(LOL)

    不管怎样-正如前面提到的,我一直找不到任何关于如何处理这类事情的指导。任何反馈都会非常感谢

    1 回复  |  直到 6 年前
        1
  •  3
  •   TheWanderer    6 年前

    选项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,如果我实现的一个库使用的支持库版本高于我自己的版本,我想我从来没有遇到过这样的问题。这可能只是林特的一个错误。