Пам’ятаєте, як Android 8 полегшив створення теми для вашого пристрою? Пам'ятаєте, як це було весело? Що ж, він повернувся в Android 12 із родзинкою.
Повна стайня Android 12 випуск не за горами, і Google навіть опублікував вихідний код до свого репозиторію AOSP. Є багато нового в Android 12, включно з доповненням до накладень ресурсів під назвою «Виготовлені накладки». Що мало на увазі як API, щоб допомогти системі керувати динамічними змінами, які використовуються в Матеріал Ви і Моне може перетворитися на щось набагато більше — принаймні до випуску Android 13.
Фон
Мішал Рахман виявив цей новий API і привернув його до моєї уваги. Він використовував для нього команду оболонки, щоб перевірити різні значення ресурсів в Android 12, не маючи щоб вручну скомпілювати накладені файли APK, і він подумав, що це може стати цікавою ідеєю додатків для пристроїв із root-доступом. Коли він привернув це до моєї уваги, я багато вивчив вихідний код для Android 12 і помітив щось, що здалося мені досить цікавим. Я перевірив те, що знайшов, і ось ми тут – як виявилося, Fabricated Overlay API можна використовувати для повернення безкорінних тем. Перш ніж зайти занадто далеко в те, що тут відбувається, я поясню, що таке виготовлені накладки.
Що таке виготовлені накладки?
Виготовлені накладки – це нова функція, представлена в Android 12. Вони схожі на класичні накладення ресурсів виконання (RRO), які Android має вже кілька років. І RRO, і виготовлені накладки можуть замінювати різні ресурси для різних програм. Ви можете змінити логічне значення з false на true (або навпаки), встановити розмір рядка стану тощо.
Проте виготовлені накладки мають деякі помітні відмінності від РРО. По-перше, вам не потрібно створювати накладений APK, а потім встановлювати його. Замість цього ви просто повідомляєте Android, які значення ви хочете змінити для якої програми, і він подбає про реєстрацію ваших змін як накладення, яке ви можете потім увімкнути.
Вони також дещо більш обмежені, ніж РРО. До Android 11 RRO могли перевизначати майже будь-які ресурси: логічні значення, цілі числа, розміри, атрибути, макети та навіть файли необроблених даних. Android 11 вніс деякі зміни в роботу RRO, зробивши перевизначення макетів фактично неможливим, хоча загалом це зробило RRO більш стабільними.
Створені накладення, з іншого боку, можуть замінювати лише значення, які можна представити як цілі числа. Це включає цілі числа (дух), розміри, логічні значення та кольори. Ви не можете використовувати їх для заміни ресурсів необроблених даних, макетів, рядків або масивів - принаймні це не так просто. Це дещо довільне обмеження в API: він приймає лише цілі значення та категорії ресурсів, як визначено класом TypedValue. TypedValue робить підтримка рядки та інші типи ресурсів, але лише для посилання на їхній ресурс, а не для зберігання фактичних даних.
Однак ці обмеження не є надто великими для цільового призначення Fabricated Overlays: Material You та ефектів Моне. Створені накладення дозволяють системі легко генерувати та застосовувати кольорові та розмірні накладення на льоту, без необхідності перезавантаження чи очікування компіляції APK.
Зараз, як правило, це був би просто ще один гарний API, яким можуть скористатися люди з рутивованими пристроями. Якщо немає лазівки, створеної виробником (як-от та, якою користується Synergy на пристроях Samsung), накладення можуть установлювати лише треті сторони з кореневим доступом. Але це найкраща частина — Google забув залатати діру в Android 12.
Виготовлені накладки без кореня
Android 8 представив новий API служби диспетчера накладень (або OMS), і люди досить швидко виявили, що накладені APK можна встановити як звичайні програми, а потім увімкнути за допомогою ADB. На жаль, Google виправив це в Android 9, і відтоді динамічно можна встановлювати лише оверлеї, підписані тим самим ключем, що й система.
Як виявилося, виготовлені накладки Android 12 мають лазівку, що нагадує ту, що є в Android 8: їм не потрібен root-доступ або дозволи на рівні підпису. Їм просто потрібно щось, що працює як користувач оболонки (тобто ADB), щоб зареєструвати їх.
Цілком зрозуміло, що Google планував, щоб Fabricated Overlays були доступні лише для root і системних користувачів. Існує реалізація команди ADB для їх створення, і вона не запускатиметься, якщо користувач, який виконує, не є root. Лазівка полягає в тому, що перевірка відбувається лише в команді, а не в реальному API, що означає, що ми можемо скористатися цим, трохи попрацювавши.
ADB на пристрої
Вже давно 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 потрібно налаштувати лише один раз, перш ніж кожна програма, що реалізує бібліотеку Shizuku API, зможе її використовувати. Якщо вам цікаво, як працює Shizuku і як ви можете інтегрувати його у свій додаток, У мене є посібник для цього тут.
Шизуку та виготовлені накладки
Зараз ви, мабуть, бачите, куди це йде. Ми можемо використовувати такий сервіс, як Shizuku, щоб отримати доступ до API Fabricated Overlays як користувач оболонки, і ми можемо використовувати бездротову функцію ADB Android 11, щоб отримати доступ на рівні оболонки на пристрої. Оскільки обмеження користувача root присутні лише в команді оболонки Fabricated Overlays, а не у фактичному API, для безпосереднього використання достатньо запустити його як користувача оболонки.
Реалізація: бібліотека та приклад програми
Що щодо деталей реалізації? Що ж, я вас також застрахую.
Готуючись до цього, я зробив обидва a бібліотеку та повнофункціональний приклад програми використовуючи цю бібліотеку.
Сама бібліотека в основному для зручності. Він охоплює деякі приховані системні API і дає вам кілька зручних методів обробки дозволів Shizuku. Він також гнучкий, тому ви можете надати власний екземпляр API IOverlayManager, якщо у вас є інший спосіб отримати його.
Зразок програми показує, як можна реалізувати бібліотеку за допомогою Shizuku. Це також повнофункціональна та корисна програма. Головна сторінка відображає наразі зареєстровані виготовлені накладки, створені за допомогою неї, згруповані за цільовою програмою. Ви також можете вмикати, вимикати та видаляти їх звідти.
Торкнувшись кнопки «Додати накладення» внизу, ви перейдете до списку всіх програм, які можна накласти. Виконайте пошук або прокрутіть, щоб знайти потрібний, і торкніться його. Потім ви можете натиснути кнопку «Додати» внизу екрана, щоб переглянути список ресурсів, які можна змінити в цій програмі. Виберіть ресурс, установіть його значення та повторіть для стількох значень, які ви хочете змінити. Натисніть кнопку «Зберегти», введіть назву, підтвердьте, і ви повернетеся на головний екран, де тепер буде показано нове накладання, готове до ввімкнення.
Ось кілька скріншотів із програми, завдяки Мішалу Рахману.
До речі, я також маю загальну програму для керування накладаннями під назвою... Менеджер накладень. Сама попередньо скомпільована програма є доступно лише на моєму Patreon, але вихідний код знаходиться у вільному доступі для всіх, хто хоче скомпілювати або змінити його.
Висновок
Новий API Fabricated Overlays в Android 12 чудовий, головним чином тому, що йому не потрібен root. Він може бути не таким складним, як повноцінний RRO APK, але він дає вам набагато більше гнучкості без кореневого доступу.
Перегляньте програму Fabricate Overlay на GitHub
Якщо у вас є пристрій під керуванням Android 12 і ви хочете спробувати це, перегляньте репозиторій GitHub, посилання на яке наведено вище. У розділі «Випуски» буде файл .apk для завантаження та використання. Бібліотеку має бути легко включити у вашу власну програму за допомогою JitPack.
Звичайно, ви не повинні очікувати, що ця функція залишиться надовго. Google дуже не любить сторонні накладки, тому це майже напевно буде виправлено, коли вийде Android 13. А тим часом насолоджуйтесь, поки воно триває!