Android 11 will harden hidden API restrictions and remove meta-reflection bypass — небольшая заметка о появившемся в исходных кодах AOSP коммите, который запрещает доступ к скрытым методам с помощью метарефлексии.
Это продолжение истории, начавшейся с выпуском Android 9, в котором Google запретила доступ ко многим скрытым методам Android. Такие методы есть в операционной системе, но отсутствуют в SDK и документации, так что с помощью стандартного SDK их не вызвать, однако всегда можно было сделать это с помощью рефлексии. В Android 9 такой способ вызова перестал работать, но оказалось, что защиту можно обойти с помощью двойной рефлексии (или метарефлексии), когда вместо вызова метода самостоятельно приложение просит сделать это операционную систему:
1 2 3 4 5 6 |
val forName = Class::class.java.getMethod("forName", String::class.java) val getMethod = Class::class.java.getMethod("getMethod", String::class.java, arrayOf<Class<*>>()::class.java) val someHiddenClass = forName.invoke(null, "android.some.hidden.Class") as Class<*> val someHiddenMethod = getMethod.invoke(someHiddenClass, "someHiddenMethod", String::class.java) someHiddenMethod.invoke(null, "some important string") |
Начиная с Android 11 этот способ также перестанет работать, но только в приложениях, собранных для API 30 и выше (targetSdk=30). Приложения, собранные для более ранних версий Android, смогут использовать рефлексию.