android-9.0-pie - Android P 显示 API 兼容性错误消息
问题描述
在 Android P 上运行基于 SDK 级别 27 构建的应用程序会有些不可预测地显示以下对话框(对话框标题是应用程序的名称):
检测到 API 兼容性问题(访问 g.co/dev/appcompat 了解更多信息)
该 URL 指向有关非 SDK 接口限制的此页面。我的应用程序本身不使用反射,但它确实使用了 Gson。
Logcat 中没有立即明显的日志消息,除了可能的消息,例如:
访问隐藏字段 Landroid/widget/AbsListView;->mIsChildViewEnabled:Z(浅灰名单,反射)
解决方案
原来我的一个 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());
}
堆栈跟踪并没有立即洞察力,但它为我指明了正确的方向。
推荐阅读
- mongodb - 如何在单独的主机中配置 Rocket Chat 和 MongoDB?
- reactjs - 在 Express 和 React 应用程序中设置 cookie 时遇到问题
- cassandra - Cassandra 3.x 触发器:获取“集群键及其价值”
- shell - jenkins 中的选择参数作为 shell 脚本(管道)的输出
- sql - 四舍五入到最接近的 5 美分
- android - 如何使用 Glide 加载图像并将其添加到 android arrayadapter
- c# - Blazor - 参数值的组件“智能感知”
- c# - Wix 自定义操作运行 dll c#
- javascript - 如何处理 React 组件中的多个复选框
- firebase - 是否针对社交活动消息指示 Firebase 云消息传递