最近我发现使用Android P开发人员预览时我维护的应用程序存在大量崩溃。
潜入(深入)项目的代码,我发现问题方法如下:
public static <T> T get(MatrixCursor cursor, int column) {
try {
cursor.moveToFirst();
Method get = MatrixCursor.class.getDeclaredMethod("get", int.class);
get.setAccessible(true);
return (T) get.invoke(cursor, column);
} catch (Exception e) {
throw new IllegalArgumentException("Android has changed the implementation of MatrixCursor?!");
}
}
据我所知,此代码用于直接从MatrixCursor检索自定义对象,而不是基本类型,字节数组或字符串。之前在MatrixCursor
内有private method内部执行此操作,我们通过反射访问此方法。
毋庸置疑,这种方法存在许多问题。据我所知,访问私有API的反映是Android建议严重的功能。然而,在Android P预览之前,这似乎已经按预期工作了。
这引出了我提出以下问题:
从Android P开始,MatrixCursor
的实现是否已更改或反映完全弃用?
可悲的是,我不是100%克服我必须避免这个问题的替代方案。非常感谢任何建议,是否有一个可用于存储自定义对象的Cursor?
答案 0 :(得分:1)
是的,有些事情发生了变化。
不,MatrixCursor
的基础实施可能没有改变。
改变的是Android P is introducing restrictions on non-public members of SDK classes。尝试在SDK类上使用私有字段或方法(无论是通过直接调用,反射还是JNI)都会导致崩溃。
如果在运行P的设备上运行有问题的代码并查看logcat输出,您应该看到类似这样的消息:
Accessing hidden field Landroid/os/Message;->flags:I (light greylist, JNI)
我强烈建议您完整阅读有关这些限制的链接文档,以及有关如何处理它的更多信息。
一个选项(如果需要,你应该尽快做!)是提交一个错误,以便Android团队知道这是你使用的方法,并且没有公共选择。如果您在Android P发布之前执行此操作,则团队更有可能为此方法创建公共替代方案,或允许您继续在P中访问该方法。