Android P中的MatrixCursor实现是否已更改?

时间:2018-05-31 14:59:52

标签: android android-9.0-pie

最近我发现使用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?

1 个答案:

答案 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中访问该方法。