如何防止来自第三方库的"Call requires API level"



应用代码

当我们在Android应用程序中使用一些在最小版本SDK中不存在的代码时,Android Studio将显示有关它的错误。

示例
假设我的应用有目标 SDK 26 和最小 SDK 21,并且我的代码尝试调用Objects.isNull(var);:然后我们得到一个很好的错误消息:

Call requires API level 24 (current min is 21): java.util.Objects#isNull

AFAIK 这是一条 Lint 消息(不是编译器警告或错误)。

第三方代码

我们如何对第三方 Java 库进行相同的检查?

示例
当项目依赖于lib.jar文件并且此库内部使用Objects.isNull时,我们不会收到任何错误/警告,并且应用程序将在旧设备上崩溃。

避免这种情况的一种方法是进行检测测试 - 但这些测试很慢,而且您永远不会有 100% 的代码覆盖率。

例如,我实际上认为ProGuard应该报告此问题。但事实并非如此。
也许是因为它使用目标Android SDKminSDK?

那么在以下两种情况下我们能做些什么呢:

  1. 我们必须按原样使用第三方库
  2. 我们可以分叉
  3. 第三方库并可以使用这个分叉:我们可以做些什么来发现/避免这些错误:例如,我们应该将其转换为 AAR 吗?

我们如何对第三方 Java 库进行相同的检查?

将源代码添加到项目中。

我们必须按原样使用第三方库

询问其开发人员库的相关minSdkVersion是什么,然后设置您的库以匹配,或者避免在旧设备上调用他们的库。

我们可以分叉

第三方库并可以使用这个分叉:我们可以做些什么来发现/避免这些错误:例如,我们应该将其转换为 AAR 吗?

将源代码添加到项目中。或者,使用源代码创建其他一些项目。Lint 检查源代码,而不是编译的代码。如果您使用源代码创建其他项目,则需要让它编译 JAR 或 AAR 并将其提供给您的主项目。

最新更新