API-интерфейс Fabricated Overlay в Android 12 возвращает безродные темы

Помните, как в Android 8 стало проще создавать темы для вашего устройства? Помните, как это было весело? Что ж, это снова в Android 12, с некоторыми изменениями.

Полная конюшня Андроид 12 релиз уже не за горами, и у Google даже есть выложил исходный код в свой репозиторий AOSP. Есть много нового в Android 12, включая дополнение к наложениям ресурсов под названием Fabricated Overlays. То, что было задумано как API, помогающее системе управлять динамическими изменениями, используемыми в Материальный ты и monet может превратиться в нечто гораздо большее — по крайней мере, до выхода Android 13.

Фон

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

Что такое искусственные накладки?

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

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

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

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

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

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

Изготовленные накладки без рута

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

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

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

АБР на устройстве

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

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

Использование расширенных API в приложении

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

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

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

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

Сидзуку и искусственные накладки

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

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

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

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

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

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

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

Вот несколько скриншотов из приложения, спасибо Мишаалу Рахману.

Кстати, у меня также есть общее приложение-менеджер наложений под названием... Менеджер наложений. Само предварительно скомпилированное приложение доступно только на моем Patreon, но исходный код находится в свободном доступе всем, кто хочет скомпилировать или изменить его.

Заключение

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

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

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

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