Android P中的MatrixCursor实现是否发生了变化?

Android P中的MatrixCursor实现是否发生了变化?,android,android-9.0-pie,Android,Android 9.0 Pie,最近,我发现在使用Android p开发者预览版时,我维护的一个应用程序发生了大量崩溃 深入研究项目代码,我发现问题方法如下: publicstatict-get(MatrixCursor游标,int列){ 试一试{ cursor.moveToFirst(); 方法get=MatrixCursor.class.getDeclaredMethod(“get”,int.class); get.setAccessible(true); return(T)get.invoke(游标,列); }捕获(例外

最近,我发现在使用Android p开发者预览版时,我维护的一个应用程序发生了大量崩溃

深入研究项目代码,我发现问题方法如下:

publicstatict-get(MatrixCursor游标,int列){
试一试{
cursor.moveToFirst();
方法get=MatrixCursor.class.getDeclaredMethod(“get”,int.class);
get.setAccessible(true);
return(T)get.invoke(游标,列);
}捕获(例外e){
抛出新的IllegalArgumentException(“Android改变了MatrixCursor的实现?!”);
}
}
据我所知,此代码用于直接从MatrixCursor检索自定义对象,而不是原语类型、字节数组或字符串。以前有一个在
MatrixCursor
内部执行此操作的方法,我们通过反射访问此方法

不用说,这种方法存在许多问题。据我所知,反射访问私有API是Android极力反对的一项功能。尽管如此,在Android P预览版发布之前,它似乎一直在按预期工作

这使我提出以下问题:

自Android p以来,
MatrixCursor
的实现是否已更改,或者反射是否已被完全弃用


可悲的是,我并没有100%地弄清楚我有什么办法可以避免这个问题。如果您对此有任何建议,我们将不胜感激。是否有可用于存储自定义对象的光标

是的,有些事情改变了

否,
MatrixCursor
的底层实现可能没有更改

改变的是这一点。试图在SDK类上使用私有字段或方法(无论是通过直接调用、反射还是JNI)将导致崩溃

如果您在运行p的设备上运行有问题的代码并查看logcat输出,您应该会看到类似于以下内容的消息:

访问隐藏字段Landroid/os/Message;->标志:I(浅灰色列表,JNI)

我强烈建议您全面阅读有关这些限制的链接文档,以了解完整的上下文以及有关如何处理这些限制的更多信息


一个选择(如果需要,你应该尽快这么做!)是提交一个bug,这样Android团队就知道这是你使用的一种方法,没有公开的替代方法。如果您在Android P发布之前就这样做,那么团队很可能会为该方法创建一个公共替代方案,或者允许您在P中继续访问该方法。

感谢您的明确解释-我将提出一个错误,并祈祷Android团队同情meGood luck!据我所知,他们非常愿意与开发人员合作进行此项更改,这也是他们鼓励每个人尝试P预览的一个重要原因-他们希望在最终发布之前了解这些问题。但是,这不会导致崩溃。这些消息会出现,但不会使代码崩溃,从DP2开始,“MatrixCursor的实现是否已更改”——可能是这样。如果没有Java堆栈跟踪,我们无法告诉您崩溃的位置和方式。“是否有可用于存储自定义对象的游标?”--Cursor是一个接口。编写自己的实现。