September 11, 2018
Обход запрета на использование reflection в Android Pie
Мой канал @VolfsChannel
Для того чтобы понять, что вообще тут происходит, прочитайте предыдущую статью на канале.
Как я могу отключить данные ограничения?
Данные ограничения можно отключить на 1-м конкретном устройстве с помощью команд ADB:
adb shell settings put global hidden_api_policy_pre_p_apps 1 adb shell settings put global hidden_api_policy_p_apps 1
Команды принимают следующие входные параметры:
- 0: отключение обнаружения использования non-SDK API. Это также отключит ведение журнала, а также нарушит строгий режим API, detectNonSdkApiUsage(). Не рекомендуется для повседневного использования.
- 1: "только предупреждение" - разрешить доступ ко всем API, не связанным с SDK, но сохранять предупреждения в журнале. Строгий режим API будет продолжать работать.
- 2: запретить использование темно-серого и черного списка API.
- 3: запретить использование черного списка API, но разрешить использование темно-серого списка
Если у вас нет ПК, то вы можете прописать эти команды в эмуляторе терминала (потребуются права Root):
su settings put global hidden_api_policy_pre_p_apps 1 settings put global hidden_api_policy_p_apps 1
Со стороны ПО вы можете использовать вариант выше через Runtime.getRuntime().exec("command")
Или же создать класс Application, и поместить вызов метода в onCreate():
public void hackVmPolicy() { if (Build.VERSION.SDK_INT >= 28) { StrictMode.VmPolicy.Builder builder = new StrictMode.VmPolicy.Builder(); StrictMode.setVmPolicy(builder.build()); } else { Log.i("Lower android version " + Build.VERSION.SDK_INT); } }
Суть этого метода заключается в переопределении политики VM для конкретного приложения. Мы создаём новый (пустой) инстанс политики, и применяем его. Т.к. за рефлексию отвечает метод detectNonSdkApiUsage(), мы можем играть не по правилам.