Изменилась ли реализация MatrixCursor в Android P? - PullRequest
0 голосов
/ 31 мая 2018

Недавно я наблюдал большое количество сбоев в приложении, которое я поддерживаю при использовании предварительного просмотра разработчика 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, который выполняет это внутренне, и к этому методу мы обращаемся через отражение.

Излишне говорить, что с этим связан ряд проблем.подход.Насколько мне известно, рефлексия для доступа к частным API - это функция, которую Android советует против .Тем не менее, до предварительного просмотра Android P, это, похоже, работало как ожидалось.

Это заставляет меня задавать следующие вопросы:

Изменилась ли реализация MatrixCursor или полностью отраженаустарел как Android P?

К сожалению, я не на 100% понимаю, какие у меня есть альтернативы, чтобы избежать этой проблемы.Любые предложения для этого очень ценятся, есть ли курсор, который можно использовать для хранения пользовательских объектов?

1 Ответ

0 голосов
/ 31 мая 2018

Да, что-то изменилось.

Нет, базовая реализация MatrixCursor, вероятно, не изменилась.

Что изменилось, так это то, что Android P вводит ограничения на-общественные члены классов SDK .Попытка использовать закрытые поля или методы в классах SDK (будь то путем прямого вызова, отражения или JNI) приведет к сбою.

Если вы запускаете соответствующий код на устройстве под управлением P и смотрите на logcatВ результате вы должны увидеть сообщение, подобное этому:

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

Я настоятельно рекомендую вам полностью прочитать связанную документацию по этим ограничениям для полного контекста и для получения дополнительной информации о том, как выможет справиться с этим.

Один из вариантов (который вы должны сделать как можно скорее, если это необходимо!) - сообщить об ошибке, чтобы команда Android знала, что это метод, который вы используете, и не имеет публичной альтернативы.Если вы сделаете это перед выпуском Android P, существует большая вероятность того, что команда либо создаст общедоступную альтернативу этому методу, либо позволит вам продолжить доступ к этому методу в P.

...