Android P显示API兼容性错误消息

Pau*_*sma 14 android-9.0-pie

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

神秘的对话

检测到API兼容性问题(有关详细信息,请访问g.co/dev/appcompat)

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

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

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

Pau*_*sma 8

事实证明我的一个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)

堆栈跟踪没有立即见解,但它指出了我正确的方向.