Android 12 Fabricated Overlay API возвращает кастомизацию без root-доступа

Android 12 Fabricated Overlay API возвращает кастомизацию без root-доступа

Zachary Wander

Полный стабильный релиз Android 12 уже не за горами, и Google даже выложил исходный код в репозиторий AOSP. В Android 12 много нового, включая дополнение к оверлеям ресурсов под названием Fabricated Overlays. То, что задумывалось как API применяющееся для помощи системе в управлении динамическими изменениями, используемыми в Material You и monet, может превратиться в нечто гораздо большее - по крайней мере, до выхода Android 13.
(повествование пойдет от лица Закари Вандера)

Справочная информация

Мишаал Рахман обнаружил этот новый API и обратил на него мое внимание. С помощью команды shell он тестировал различные параметры ресурсов в Android 12 без необходимости вручную компилировать оверлейные APK, и ему показалось, что это может стать интересной задумкой в качестве приложеня для рутированных устройств. Когда он обратил на это мое внимание, я внимательно изучил исходный код Android 12 и заметил кое-что, что показалось мне довольно интересным. Я протестировал то, что нашел, и вот мы здесь - как оказалось, Fabricated Overlay API можно использовать для воскрешения кастомизации без рута. Прежде чем углубиться в суть происходящего, я объясню, что же такое на самом деле Fabricated Overlays.

Что такое Fabricated Overlays?

Fabricated Overlays - это новая функция, появившаяся в Android 12. Они похожи на классические Runtime Resource Overlays (RROs), которые существуют в Android уже несколько лет. Как RRO, так и Fabricated Overlays могут перезаписывать различные ресурсы для разных приложений. Вы можете изменить булево значение с false на true (или наоборот), установить размер строки состояния и т.д.

Fabricated Overlays все же имеют некоторые заметные отличия от RRO. Например, вам не нужно генерировать APK оверлея и затем устанавливать его. Вместо этого вы просто сообщаете Android, какие значения вы хотите изменить для того или иного приложения, после чего он регистрирует ваши изменения в виде оверлея, который затем можно включить.

Они также немного более ограничены, чем RRO. До Android 11 RRO могли переопределять практически любые ресурсы: булевы, целые числа, размеры, атрибуты, макеты и даже файлы необработанных данных. Android 11 внес некоторые изменения в работу RRO, в результате чего перезапись макетов стала не совсем возможной, хотя в целом RRO стали более стабильными.

Fabricated Overlays, с другой стороны, могут переопределять только те значения, которые могут быть представлены в виде целых чисел. К ним относятся целые числа (очевидно), размеры, булевы числа и цвета. Вы не можете использовать их для изменения ресурсов необработанных данных, макетов, строк или массивов - по крайней мере, не так легко. Это в некоторой степени произвольное ограничение API: он принимает только целочисленные значения и категории ресурсов, определенные классом TypedValue. TypedValue поддерживает строки и другие типы ресурсов, но только для ссылки на их ресурс, а не для хранения их фактических данных.

Однако эти ограничения не так уж страшны для того, для чего изначально были предназначены Fabricated Overlays: Material You и Monet-персонализация. Fabricated Overlays позволяет системе легко генерировать и применять оверлеи цветов и размеров "на лету", без необходимости перезагрузки или ожидания компиляции APK.

В обычных условиях это было бы просто еще одним изящным API, которым могли бы воспользоваться люди с устройствами с root-доступом. Если только нет лазейки, созданной производителем (как та, которой пользуется Synergy на устройствах Samsung), оверлеи могут быть установлены только сторонними разработчиками с root-доступом. Но это самое интересное - Google забыла залатать дыру в Android 12.

Fabricated Overlays не требует root-доступа

В Android 8 появился новый API Overlay Manager Service (или OMS), и люди довольно быстро обнаружили, что APK-файлы оверлеев можно устанавливать как обычные приложения, а затем включать их с помощью ADB. К сожалению, Google исправил это в Android 9, и с тех пор динамическая установка возможна только для оверлеев, подписанных тем же ключом, что и система.

Как выяснилось, в Android 12 Fabricated Overlays есть лазейка, напоминающая ту, что присутствовала в Android 8: им не нужен root-доступ или разрешения на уровне подписи. Им просто нужно, чтобы что-то, запущенное от имени shell пользователя (т.е. ADB), зарегистрировало их.

Совершенно очевидно, что Google планировала, чтобы доступ к Fabricated Overlays был только у пользователей с root-правами и системными правами. Существует команда ADB для их создания, и она не будет запущена, если выполняющий ее пользователь не имеет root права. Лазейка в том, что проверка находится только в команде, а не в фактическом API, что означает, что немного потрудившись, мы можем воспользоваться этим преимуществом.

Использование ADB на устройстве

Уже давно в Android есть возможность беспроводного подключения ADB. Она позволяет компьютеру (или любому другому устройству, имеющему бинарный файл ADB и доступ к сети) подключаться к устройству по беспроводной сети. В основном она предназначена для устройств Android, не имеющих доступных пользователю USB-разъемов, таких как смарт-часы и телевизоры. Кроме того, до Android 11 для активации беспроводного режима требовалось проводное подключение ADB.

Android 11 - это именно то, что официально принесло беспроводной ADB на телефоны и планшеты. Он немного сложнее, чем классический беспроводной ADB, с сопряжением и кодами аутентификации, но он может быть активирован пользователем полностью на устройстве, пока устройство подключено к WiFi. Это означает, что можно подключиться к устройству через ADB с вашего устройства, и все, что вам нужно - это подключение к WiFi.

Использование Elevated APIs в приложении

Существует множество причин, по которым вы можете захотеть использовать ограниченные API в своем приложении. Обычно это связано с тем, что они предоставляют некоторые специальные функции, которые необходимы вам. Если нужный вам API имеет реализацию shell-команды, то использовать его из приложения довольно просто. Все, что вам нужно сделать, это создать процесс shell с root (или ADB), выполнить нужную команду и проанализировать результат, если таковой имеется.

Что делать, если API не имеет поддержки shell, или в реализации shell не хватает чего-то нужного? Если у ваше устройство с root-доступом, вы можете использовать что-то вроде libRootJava. libRootJava позволяет вам взаимодействовать с API фреймворка Android так, как будто ваше приложение запущено от имени root пользователя. Это и удобнее, и намного быстрее, чем выполнение команд оболочки, поскольку все это на одном языке, и вам не нужно беспокоиться о ручном парсинге строк. У этого метода есть некоторые ограничения, но в большинстве случаев он работает отлично.

API libRootJava довольно гибкий. Вы можете адаптировать его для запуска от имени shell пользователя вместо root. К счастью, вам это не нужно, потому что кто-то уже разработал такой вариант, и он называется Shizuku. Shizuku - это почти что комбинация Magisk Manager и libRootJava.

Приложение Shizuku Manager поможет вам настроить процесс, запущенный как shell пользователь, к которому Shizuku может получить доступ. Библиотека API Shizuku может быть внедрена в приложения, чтобы дать им доступ к системным API, как если бы они были shell пользователем. Это гораздо более централизованный процесс, чем libRootJava, поскольку Shizuku нужно настроить только один раз, прежде чем каждое приложение, использующее библиотеку API Shizuku, сможет ее использовать. Если вам интересно, как работает Shizuku и как вы можете интегрировать ее в свое приложение, то вы можете ознакомиться с руководством по этому вопросу здесь.

Shizuku и Fabricated Overlays

Теперь вы, вероятно, понимаете, к чему все идет. Мы можем использовать такой сервис, как Shizuku, для доступа к API Fabricated Overlays как shell пользователь, и мы можем использовать беспроводную функцию ADB из Android 11 для получения доступа на уровне оболочки, и все это на устройстве. Поскольку требование root прав присутствует только в команде оболочки Fabricated Overlays, а не в самом API, для его прямого использования достаточно запустить его под shell пользователем.

Реализация: Библиотека и демонстрационное приложение

А как насчет деталей реализации? Что ж, я позабочусь и об этом.

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

Сама библиотека предназначена в основном для удобства. Она оборачивает некоторые скрытые системные API и предоставляет вам несколько удобных методов для работы с разрешениями Shizuku. Кроме того, она гибкая, поэтому вы можете предоставить свой собственный экземпляр API IOverlayManager, если у вас есть другой способ его получения.

Образец приложения показывает, как можно реализовать библиотеку с помощью Shizuku. Кроме того, это полностью функциональное и полезное приложение. На главной странице отображаются зарегистрированные на данный момент Fabricated Overlays, которые были созданы с его помощью, сгруппированные по целевым приложениям. Вы можете включать, отключать и удалять их прямо на этой странице.

Нажав кнопку "Добавить оверлей" внизу, вы увидите список всех приложений, на которые можно наложить оверлей. С помощью поиска или прокрутки найдите нужное и нажмите на него. Затем вы можете нажать кнопку "Добавить" в нижней части экрана, чтобы просмотреть список ресурсов, которые можно переопределить в этом приложении. Выберите ресурс, установите его значение и повторите для стольких значений, сколько вы хотите изменить. Нажмите кнопку "Сохранить", введите имя, подтвердите, и вы вернетесь на главный экран, где теперь отображается новый оверлей, готовый к включению.

(В качестве примечания, у меня также есть приложение для управления оверлеями под названием... Overlay Manager. Само скомпилированное приложение доступно только на моем Patreon, но исходный код находится в свободном доступе для всех, кто хочет скомпилировать или модифицировать его).

Заключение

Новый API Fabricated Overlays в Android 12 очень хорош, в основном потому, что не требует root. Возможно, он не так сложен, как полноценный RRO APK, но он дает вам гораздо больше гибкости без root-доступа.

Ознакомьтесь с приложением Fabricate Overlay на GitHub

Если у вас есть устройство под управлением Android 12 и вы хотите это опробовать, загляните в репозиторий GitHub, ссылка на который приведена выше. В разделе "Релизы" будет APK для загрузки и использования. Включение библиотеки в собственное приложение с помощью JitPack не составит труда.

Конечно, не стоит ожидать, что эта функция сохранится надолго. Google очень не любит сторонние оверлеи, поэтому эта функция будет почти наверняка убрана, когда выйдет Android 13. А пока наслаждайтесь, пока есть возможность!


Автор: Zachary Wander
Оригинальная статья на XDA

Report Page