Android getDeclaredConstructors () ведет себя по-разному для Android 28 (пирог) - PullRequest
0 голосов
/ 19 декабря 2018

Я знаю, это выглядит как плохая идея, но мой проект имеет следующую строку:

val constructor = SQLiteQuery::class.java.declaredConstructors.first()

У самого класса есть один не публичный конструктор, но это именно тот, который мне нужен для дальнейшей работы.

SQLiteQuery(SQLiteDatabase db, String query, CancellationSignal cancellationSignal) {
   super(db, query, null, cancellationSignal);
   mCancellationSignal = cancellationSignal;
}

Работает нормально, если установлено targetSdkVersion 27.Однако, как только я установил targetSdkVersion 28, это вызывает проблемы в Android 9. Список конструкторов пуст (поэтому даже частные не включены).

Я не могу найтилюбые изменения в API / документации.Исходный код также все еще показывает вышеупомянутый конструктор.

Вопрос: почему это так и как я могу получить полный список конструкторов?

1 Ответ

0 голосов
/ 21 декабря 2018

Хорошо, поэтому, основываясь на комментарии Майка, причина в некотором «улучшении» безопасности на стороне Andriod.

Начиная с Android 9, они ограничивают (даже с помощью Reflection) множество методов и полей.

https://developer.android.com/about/versions/pie/restrictions-non-sdk-interfaces

Поэтому, когда вы используете свое приложение, вы можете увидеть некоторые предупреждения в LogCat.Для нас это был, например, такой:

Accessing hidden field Landroid/database/sqlite/SQLiteProgram;->mBindArgs:[Ljava/lang/Object; (light greylist, reflection)

Он говорит, что конструктор, который мы хотели, был ограничен (т.е. недоступен), что привело к тому, что список конструкторов вернулся пустым (и это вызвало сбой).

Google утверждает количество запрещенных методов и полей следующим образом:

Списки примерно такие:

белый список (также известный как SDK) ~ = 74 000 методов и полей

light-greylist ~ = 11 000 методов и полей dark-greylist ~ = 121 000

черный список методов и полей ~ = 9 000 методов и полей

Имейте в виду, что этотолько «сработало» (сбой произошел из-за более позднего использования пустого возвращаемого значения, но сам вызов не выбрасывал), потому что метод light greylist, тогда как он генерировал бы исключения, если бы он был «темнее».

Самым простым решением действительно является целевая версия до 27 (вместо 28), если у вас есть только светло-серые предупреждения. Это «выигрывает ваше время» до следующей версии Android, когда они могутстрогий дальше.Для выдачи ошибок это, вероятно, не то, что вы хотите, потому что это все еще может привести к сбою!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...