首页 > 解决方案 > Android P 显示 API 兼容性错误消息

问题描述

在 Android P 上运行基于 SDK 级别 27 构建的应用程序会有些不可预测地显示以下对话框(对话框标题是应用程序的名称):

神秘对话

检测到 API 兼容性问题(访问 g.co/dev/appcompat 了解更多信息)

该 URL 指向有关非 SDK 接口限制的此页面。我的应用程序本身不使用反射,但它确实使用了 Gson。

Logcat 中没有立即明显的日志消息,除了可能的消息,例如:

访问隐藏字段 Landroid/widget/AbsListView;->mIsChildViewEnabled:Z(浅灰名单,反射)

标签: android-9.0-pie

解决方案


原来我的一个 Gson 模型暴露了一个返回 File 的 getter。Gson 使用反射递归地检查类的字段,这样做违反了不允许的 SDK 接口的反射。

阅读问题中链接的限制文档让我仔细查看了日志消息,果然,其中一个引起了我的注意:

访问隐藏字段 [...](深灰名单、反射)

我不记得确切的消息,但这里的重点是它在灰名单中。

我通过以 SDK 级别 28 为目标并启用新的 StrictMode 功能发现了这一点detectNonSdkApiUsage(),在此功能上我的应用程序将因堆栈跟踪而崩溃:

if (BuildConfig.DEBUG && Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
    StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder()
            .detectNonSdkApiUsage()
            .penaltyLog()
            .build());
}

堆栈跟踪并没有立即洞察力,但它为我指明了正确的方向。


推荐阅读