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

Has MatrixCursor implementation within Android P changed?

最近,我发现使用 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% 了解我必须采取哪些替代方案来避免这个问题。非常感谢任何建议,是否有可用于存储自定义对象的游标?

是的,有些东西变了。

不,MatrixCursor 的底层实现可能没有改变。

发生变化的是Android P is introducing restrictions on non-public members of SDK classes。尝试在 SDK 类 上使用私有字段或方法(无论是通过直接调用、反射还是 JNI)都会导致崩溃。

如果您在设备 运行ning P 上 运行 有问题的代码并查看 logcat 输出,您应该会看到类似这样的消息:

Accessing hidden field Landroid/os/Message;->flags:I (light greylist, JNI)

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

一个选项(如果需要,您应该尽快执行!)是提交错误,以便 Android 团队知道这是您使用的方法并且没有 public 替代方法。如果您在 Android P 发布之前执行此操作,则团队更有可能为此方法创建 public 替代方法,或者允许您继续在 P 中访问该方法。