在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());
}
Run Code Online (Sandbox Code Playgroud)
堆栈跟踪没有立即见解,但它指出了我正确的方向.
| 归档时间: |
|
| 查看次数: |
9077 次 |
| 最近记录: |