Безопасность Андроид
Всем привет! Сегодня мы коротко опишем основные достоинства и проблемы в мобильной операционной системе Андроид. Про безопасность Андроид написаны десятки тысяч статей и сотни книг. Разумеется, мы не будем пытаться объять необъятное; вместо этого попробуем окинуть взглядом экосистему в целом.
Кстати, вас также может заинтересовать статья «Как вытащить данные из Андроид», в которой мы рассказывали как криминалисты извлекают информацию из телефонов и планшетов.
Безопасность Андроид
Скажем сразу: смартфоны на Android самые распространенные, но при этом наименее безопасные. Версии Android 4.4 и ниже можно назвать дырявым ведром, не слишком погрешив против истины. Критические уязвимости и зияющие бреши в безопасности были (и есть) в сборках 5.0–5.1.1.
Минимально приемлемый уровень безопасности в Android был достигнут только с версией 6.0, причем только в тех устройствах, которые выходили с завода уже с Android 6.0 на борту. А вот в Android 7 (относительная доля которого до сих пор не перевалила за 8% устройств) физическая безопасность уже реализована вполне неплохо.
Называя Android дырявым ведром, нельзя не уточнить, что по абсолютному числу найденных уязвимостей iOS далеко впереди. Однако если Apple исправляет уязвимости и выпускает обновление в течение двух-трех недель, то уязвимости, найденные в Android, будут исправлены в «сферическом коне в вакууме», полумифическом AOSP. Обычные же пользователи могут получить их вместе с ежемесячным обновлением безопасности (только для актуальных флагманов у избранных производителей), получить через полгода-год или не получить никогда. Диаграмма распространенности разных версий Android намекает, что актуальные пaтчи безопасности своевременно поступят к от силы 7% пользователей.
В случае с Android значение имеет не только какая версия системы установлена, но и с какой версией устройство вышло с завода. Так, Android 6.0 «из коробки» по умолчанию шифрует раздел с пользовательскими данными, но смартфонов, обновившихся до Android 6 по воздуху, это не коснется.
- Сколько телефонов с Андроид зашифровано?
На Google I/O сообщили, что порядка 80% устройств под управлением Android 7 и порядка 25% под управлением Android 6 зашифрованы.
Что это означает на практике?
Сравним распространенность версий Андроид с данными о шифровании:
Android 5.1.1 и более старые: ~62% рынка (данных о шифровании нет);
Android 6: 0,31 (31% рынка) * 0,25 = 0,078;
Android 7: 0,07 (7% рынка) * 0,80 = 0,056.
Итого получаем цифру в 13,4%. Это — число устройств на Android, которые точно зашифрованы. Основная заслуга здесь принадлежит Google, которая заставила производителей устройств, выходящих с Android 6 или 7 на борту, обязательно активировать шифрование.

Данных о шифровании более старых версий нет, но можно предположить, что их пользователи не горят желанием замедлять работу устройства, включив опциональное шифрование. С учетом этого вряд ли конечная цифра зашифрованных «Андроидов» превысит 15%.
Несмотря на то что Android, как и iOS, запускает приложения в песочницах, тут гораздо больше свободы. Приложения могут вмешиваться в работу других приложений (в первую очередь это разнообразные службы Accessibility, которые могут даже нажимать кнопки, и сторонние клавиатуры, которые автоматически получают возможность шпионить за пользователем). Приложения могут собирать данные о приблизительном местоположении пользователя, даже если соответствующие права отсутствуют (механизм интересный, часто применяется на практике и заслуживает отдельной статьи). Многочисленные вредоносные программы появляются еженедельно, а в некоторых телефонах (о таких мы писали) они сидят прямо в прошивках и избавиться от них возможно только с помощью перепрошивки.
Да, эта особенность, а точнее степень свободы заложена в систему (то есть это фича, а не баг), и те же сервисы Accessibility и сторонние клавиатуры требуют отдельного подтверждения для активации. Но поверьте, твоему ребенку, теще или бабушке сильно легче от этого не станет, как бы ты ни пытался натаскать их на «сюда не тыкай никогда».
А разблокирование смартфона? Казалось бы, простейшее действие, которое невозможно испортить… Но нет, разработчики Android (именно Android AOSP) — смогли. В Android встречаются любые, самые небезопасные способы аутентификации. Например, Smart Lock — автоматическое разблокирование телефона по местоположению (представьте ситуацию, в которой ФБР не приходится платить миллион долларов за взлом iPhone 5c — вместо этого агент просто дошел до дома подозреваемого). Или разблокирование при соединении с доверенным Bluetooth-устройством (агент включает трекер активности или магнитолу в машине подозреваемого).
Еще можно авторизоваться по лицу пользователя или его фотографии. Некоторые способы можно запретить с помощью корпоративной политики безопасности, но для запрета необходимо перечислить их в явном виде. Системный администратор забыл запретить разблокировку по Bluetooth-устройствам? Этой лазейкой непременно воспользуются. Ну и если появится новый небезопасный способ разблокировки — его придется запрещать дополнительно.

Да, намерения были благими: хоть как-то попробовать заставить пользователей устройств без датчика отпечатков пальцев устанавливать код блокировки. Вот только вред от таких способов просто катастрофический: пользователю внушается ложное чувство безопасности, на самом же деле «защитой» подобные способы можно назвать лишь в кавычках.
Более того, Smart Lock остается доступным даже в последних сборках Android и даже в устройствах, уже оборудованных датчиком отпечатков пальцев. Нет, использовать Smart Lock вас никто не заставит, но ведь это же так удобно…
К счастью, с помощью политики безопасности некоторые виды разблокировки можно ограничить административно:

Впрочем, нет никакой возможности помешать пользователю деактивировать такую политику!
В Android есть возможность установить свой сертификат для снифинга HTTPS-трафика:

Теперь у приложения Adguard есть возможность вырезать рекламу из HTTPS-трафика. Но вы же понимаете, что на его месте могло оказаться что угодно.
Большой Брат следит за вами
Google собирает большое количество информации о пользователях Андроид-устройств. Ее детальность и проработка просто фантастические: вы можете подробно увидеть, где вы были и что делали в такое-то время такого-то числа за последние несколько лет.
Что характерно, Google знает не только где вы были в терминах географических координат, но и в каком месте вы побывали. Гостиница, ресторан, боулинг, театр, парк — Google видит ваше местоположение и соотносит их с местоположением других пользователей (а их — миллиарды). Результат — компании известно все вплоть до того, сколько времени вы просидели за столиком в ресторане в ожидании первого блюда.
Скажете, я сгущаю краски? Ничуточки. Мы уже писали в статье «Мои действия», о том, что собирает Google и как до этой информации добраться.

Само собой разумеется, в Google есть статистика запуска и использования приложений, история браузера и поисковых запросов, логины и пароли Chrome, слова, которые вводились с клавиатуры Gboard, голосовые запросы, просмотренные на YouTube ролики и многое, многое другое.
Да, слежку и сбор информации Google вы можете ограничить, а уже собранные данные — удалить, но разнообразие этих данных таково, что только их перечисление займет несколько страниц убористого текста.

Большинство телефонов с Android поставляется с незакрытыми режимами сервисного доступа к памяти, которые изначально создавались для прошивки устройств в случае неисправности. Эти же режимы можно использовать и для извлечения данных из устройства, даже если оно выключено или заблокировано. В частности, это присуще большинству процессоров Qualcomm (режимы 9006 и 9008), практически всем MediaTek, Rockchip, Allwinner, Spreadtrum, некоторым устройствам на основе Samsung Exynos. Собственный низкоуровневый сервисный протокол есть в телефонах LG, и воспользоваться им для извлечения данных — дело техники.
Использование сервисного режима для кражи данных не оставляет следов. Защититься от кражи информации через сервисный режим довольно просто: достаточно включить шифрование данных (при этом рекомендуется Android 6.0 или выше, но даже в Android 5 шифрование уже вполне надежно).
Гранулярный контроль за разрешениями приложений в Android — больная тема. В «чистом» Android (AOSP) контроль за использованием разрешений появился только с выходом версии 6.0. В сторонних прошивках он был и раньше, но работал чрезвычайно нестабильно. При этом контроль далек от совершенства: запретить приложению работать в фоне штатными средствами невозможно, а ограничение доступа к разрешению доступа к местоположению приводит только к тому, что приложение будет определять местоположение устройства другими способами с помощью использования разрешений, гранулярный контроль которых невозможен даже в свежих версиях Android. Наконец, многие приложения просто не поддерживают гранулярное управление разрешениями, и пользователь по-прежнему соглашается с запросом на предоставление целого пакета разрешений, часть из которых вовсе не безобидна.
С помощью корпоративных политик безопасности можно запретить пользователю некоторые (но, к сожалению, далеко не все) способы обойти встроенные в систему меры безопасности. Например, можно заставить его использовать PIN-код, отключить Smart Lock, заставить использовать встроенное шифрование. Еще можно купить Android-смартфон BlackBerry; на них, по крайней мере, своевременно приходят патчи безопасности и активен режим доверенной загрузки. Впрочем, от действий самого пользователя, слежки и утечки данных в облако фирменный софт BlackBerry не защищает никак.
В Android просто не существует какой-то общей модели безопасности, которая могла бы обезопасить устройство и данные пользователя на всех уровнях. Можно включить KNOX, можно выбрать телефон с доверенной загрузкой… но все это не помешает самому пользователю установить какое-нибудь приложение, которое воспользуется «особенностями» Android (например, Overlay и Accessibility) для автоматической установки опасных зловредов, и те, снова используя уязвимости системы, попытаются получить root-доступ и прописаться в системном разделе.
Стоит отметить, что, хотя автор прав в том, смартфон на какой ОС более уязвим к взлому, следует иметь в виду, что речь именно о смартфонах, но не об Android как операционной системе. Да, Android заслужил славу дырявой операционки и рассадника вирусов, но если вдуматься: а что есть Андроид? Это то, что установлено на смартфонах LG или Samsung, те самые сильно модифицированные операционки, которые кажутся совсем не похожими на «голый» Андроид? Это прошивки менее распространенных брендов, которые устанавливаются на смартфоны, годами не получающие обновлений? Или, может быть, это что-то другое?
Технически ОС Android — это то, что Google в форме исходников выкладывает во всеобщий доступ в рамках проекта AOSP. Это тот самый чистый Android, который компания переустанавливает на смартфоны Nexus и, в слегка измененном виде, на смартфоны Pixel. Все остальные прошивки, сильно и не очень сильно модифицированные, в терминах open source называются форками. По сути это уже нечто другое, но все это тем не менее принято называть общим именем Android.
Безопаснее ли чистый Android прошивок от производителей? Да, множество багов было найдено именно в измененном Android от производителя. К тому же в чистом Android эти баги исправляются намного быстрее и обновления, с небольшой задержкой, получают сразу все юзеры Nexus и Pixel. Общий срок поддержки этих смартфонов составляет два года для крупных обновлений и еще год для обновлений безопасности.
Как правильно отметил Олег, по общему количеству найденных критических уязвимостей Android остается позади iOS, причем больше половины этих багов находят вовсе не в Android, а в закрытых драйверах железа. Перечисленные в статье проблемы смартфонов вроде того же сервисного режима к Android отношения не имеют, это проблема производителя устройства. Однако в том же Nexus сервисный режим доступен — логично, если учесть, что это смартфон для разработчиков.
Серьезная проблема Android — это вовсе не дырявость и не безграмотная архитектура ОС. В конце концов, даже версия Android 1.0 включала в себя такие вещи, как полноценные песочницы для приложений, система обмена данными между приложениями через типизированные каналы с проверкой полномочий, многоуровневая проверка легитимности тех или иных запросов к данным или функциям ОС и memory safe язык Java, нивелирующий 90% возможных уязвимостей. О более поздних версиях с интегрированной системой мандатного контроля доступа SELinux, песочницами на основе seccomp, ASLR, механизмом доверенной загрузки, шифрованием и целым букетом прочих технологий говорить вообще не стоит.
Серьезная проблема Android — это та самая фрагментация, благодаря которой Android’ом называется все, что было основано на AOSP, а по факту уже не являющееся Android’ом. Компания выпускает смартфон на Android, забивает на его обновление, чем ставит под угрозу пользователя, — виновным объявляют Android. Samsung модифицирует Android, допуская ошибку в реализации локскрина, — виноват Android. Китайцы поставляют смартфоны с незалоченным загрузчиком — это Android дырявый.
Также не стоит забывать о гораздо больших, в сравнении с iOS, возможностях системы. Все эти Accessibility, оверлеи и другие функции, которые автор преподносит как уязвимости, — это стандартная часть Android, которая доступна сторонним приложениям. Чем больше функциональности предлагает система, тем больше возможностей использовать ее в грязных целях.
Сравнивать iOS, систему с сильно обрезанной функциональностью, отсутствием возможности ставить приложения из сторонних источников и закрытой экосистемой, с открытым Android, который дает гораздо больше возможностей и доступен для свободного скачивания и модификации кому угодно, некорректно. Это все равно что сравнивать полноценную ОС типа Windows и какую-нибудь Chrome OS.
Можно ли сделать Андроид безопасным?
Если телефоном пользуется ребенок, бабушка или человек, который увлекается чем угодно, только не вопросами безопасности мобильных операционных систем, — нет. В их руках телефон на Android никогда не будет безопасным, даже если это Samsung с активированным KNOX или BlackBerry с последним патчем безопасности.
Слишком много зловредов и слишком большая для среднего пользователя степень свободы, позволяющая убрать «мешающие» средства безопасности, отключить шифрование на этапе загрузки, активировать установку приложений из сторонних источников и проделать массу других глупостей, которые тебе даже трудно вообразить.
Если же устройство дать в руки специалисту и устройство это — актуальный флагман одного из избранных производителей, не пренебрегающих ежемесячными патчами безопасности, то при должной настройке (запрет Smart Lock, шифрование с обязательным запросом пароля для дальнейшей загрузки устройства, — не путать с PIN-кодом разблокировки! — использование административной политики, жестко запрещающей установку из сторонних источников, запрет оверлеев и сервисов Accessibility, постоянный контроль за тем, какую информацию мы разрешаем о себе собирать и кому именно) для обычного пользователя вполне сойдет. Защита телефона с помощью Фаервола. Впрочем, чиновники, президенты, террористы и преступники все равно не будут так рисковать; их выбор до сих пор — BlackBerry 10 или iOS.
Традиционно последний параграф — про обновления и патчи безопасности. Специфика Android такова, что производители могут обновлять, а могут и не обновлять свои устройства до актуальных версий Android и патчей безопасности. Найденные уязвимости могут исправляться, а могут не исправляться (в большинстве случаев — не исправляются). Более-менее регулярные обновления бывают у флагманов известных производителей, но даже в этом случае сроки поддержки заметно короче, чем у устройств производства Apple или Microsoft. Телефоны с Android по уровню безопасности нельзя ставить на одну ступень с iOS или даже Windows 10 Mobile. Чем дешевле устройство, тем хуже у него будут обстоять дела с безопасностью уже через несколько месяцев после выпуска. Совсем дешевые устройства нeсут дополнительные риски, связанные с отсутствием обновлений (в том числе исправлений критических уязвимостей), физическими уязвимостями на уровне устройств и встроенными в прошивки зловредными «бонусами».
Автор: Oлег Афoнин
Похожие статьи

Поиск нежелательных прав доступа к файлам Kali Linux

Просмотр настройка и изменение Iptables Kali Linux

Использование ACL для изменения прав доступа Kali Linux
4 комментария
Андроид на сегодняшний день является самой безопасной конструкцией, поскольку имеет возможность установки и изменения (настройки) приложений, ограничивающих шпионскую деятельность ПО. Я лишь увидел, что данная статья — это не что иное, как реклама «Яблока» в итоге…
Перейдите по этой ссылке http://catcut.net/l9bw
Вас проверят на вируса и перекинется на программу которая определяет вирусное приложение которое выдоет рекламу и вы сможете удолить ее самостоятельно! Или заблокировать всплывать реклам! А после того как вы найдете приложение и не захотите удолить по каким либо причинам то вы сможете удолить в нем рекламу при помощи этого приложения вот ссылка http://catcut.net/uabw опять же она через антивирусный сайт
В общем-то автор как бы говорит правду, он не врёт. Вопрос лишь в том, как нам трактовать все эти факты. Все эти рассуждения про жуткую опасность Андроида сильно преувеличены. Точнее даже можно сказать скорее «миф», чем правда. По сути единственное отличие АйОс от Андроид в плане «безопасности» — жесткий запрет ставить что-либо не из магазина. Всё остальное рассуждения на тему. «Подхватить» зловредную программу на Андроид, реально можно только установив её самому из арк файла, скаченного где-то на сайте с порнографией.
Всё… Все остальные факторы либо полностью отсутствуют в «нормальных» телефонах на андроиде, либо вообще не имеют смысла. Вы же не будете всерьёз предлагать полностью запретить пользователям Андроид устанавливать программы не из магазина? Это первое. Второе: сбор информации о пользователе — основа бизнеса гугл. Она это делает в рекламных целях и для этого весь этот Андроид гуглом и был придуман. Эпл не зарабатывает деньги на рекламе, собирать данные о пользователях ей особо не надо, разве что продать их гуглу… Но. Вопрос в другом. А именно…
Кому интересна ваша статистика посещения кафе? В чем конфиденциальность информации? Хакерам? Государству? Ни тем, ни другим это не интересно вообще. Хакерам это точно не нужно. А у правоохранительных органов достаточно гораздо более надёжных методов собрать о Вас информацию. В чём трагедия, что гугл может подсовывать вам целевую рекламу на основе этой статистики? Где тут зло? Но самое главное в том: что именно и как Гугл собирает о пользователях Андроида — не секрет. Пусть гугл об этом не пишет на рекламных банерах, но скрыть это он (гугл) возможности не имеет — Андроид система открытая и мы всё про неё знаем досконально. В Андроид сбор информации и иные уязвимости в силу открытости и прозрачности системы видны и при желании устранимы. А вот о том, какую информацию о Вас собирает Эпл — известно одному Джобсу. Автор так уверенно пишет о том, что эпл ничего не собирает, однако ОТ КУДА ОН ЭТО ЗНАЕТ. В закрытой проприетарной ОС могут быть встроены такие механизмы слежки, о которых мы с Вами и не подозреваем. И можно ли отключить это совсем мы тоже понятия не имеем.
В Андроид же я не только могу «выключить» сбор статистики, но и быть уверенным, что он (сбор) действительно выключился. В Андроид при определённом умении можно вообще выпилить все гуглапс.
Например почему-то автор не говорит, что Эпл всё что только можно тащит в АйКлауд и как (и можно ли вообще) это запретить, мы не знаем. В Андроид я могу модифицировать систему вплоть до самых её потрохов.
Вы можете избавиться от ПО эпл в своём смартфоне ЭПЛ? А? Именно по этой причине утверждение : «Впрочем, чиновники, президенты, террористы и преступники все равно не будут так рисковать; их выбор до сих пор — BlackBerry 10 или iOS.», мягко говоря, неверно, а, грубо говоря, бредово, а именно — чистой воды художественный вымысел автора. Чиновники, президенты, террористы и преступники в первую очередь опасаются не «хакеров» с их вирусами, выложенными на порносайте, а «большого брата», которой обладает государственным, административным, экономическим и т.д. ресурсом и не нуждается в методах, которые используют хулиганы в интернете. По факту же ситуация обстоит таким образом.
Если отбросить все воздыхания про «это эпл… аааа…», а посмотреть на ситуацию с позиции здравого смысла, то оправдать выбор в пользу АйФон очень сложно.
Если мы сейчас начнём перечислять аргументы в пользу Эпл, то 9 из 10 будут сугубо субъективно-эмоциональными.
Имиджевый момент? Удобство интерфейса? Безопасность? Имиджевый момент — смотря на кого вы собираетесь производить впечатление. Если на студентов и «тёлочек», то Вам конечно в банк за кредитом на новый айфон. Если перед серьёзными людьми, то там другие критерии имиджа.
Удобство интерфейса — очень спорный и субъективный момент. Во-первых, это определяется чисто привычкой, во-вторых, миф об удобстве интерфейса АйОс разбивается в пух и прах, если попытаться разложить по полочкам и посчитать кол-во нажатий на экран для того и иного действия. Только безопасность с очень сильной натяжкой можно считать «объективным» критерием выбора. При этом «натяжка» настолько сильная, что «опасность» Андроида скорее миф, чем объективная реальность. В пользу андроид будут исключительно рациональные аргументы. Андроид смартфоны просто лучше по объективным параметрам, дают возможность разнообразного выбора и в разы дешевле. Эпл — бренд, который эксплуатирует эмоциональный, подход. Можно выразится резко и сказать — секта. Чего стоят безумные люди, живущие в палатках у магазина в очереди за новым АйФоном… Разве это не есть секта? Сравните недавнюю рекламу Самсунга S8 и АйФона Х… Если у Самсунга идёт перечисление возможностей телефона — возможностей, которые он предоставляет пользователю, то у Эпл … цветочки падают с неба в лунном свете… А? Чётко можно понять на какую публику ориентирован Эпл… Объясните мне как можно купить АйФон ХR за 90000 рублей, если за 40 000 я могу купить, например, Самсунг Ноут8? Боязнь вирусов? За деньги, за которые Эпл продаёт свои «современные» модели можно купить сразу несколько топовых Андроид смартфонов, которые будут на голову выше любого Айфона ХС и самое плохое, что случиться с пользователем этого самого Андроид смартфона, что он прочитает вот такую вот статью и испортит себе настроение, так как, не будучи специалистом, может посчитать, что всё это действительно так и есть. Если же пользователь Анродида не будет читать такие статьи, то никогда в жизни не узнает, что есть какие-то вирусы под Анроид. То есть, если Вы купили «приличный» Андроид смартфон от именитого производителя и не скачиваете арк файлы с сомнительных ресурсов, отключили СмартЛок (это легко делается прямо в настройках), запретили администратора устройства «найти устройство», запретили сбор статистики, то вероятность кражи Ваших данных равна 0,000000000000000000000001%…. Так что, автор статьи, действительно уж как-то скатился в явную предвзятость, если не сказать большего.
В Андроиде безопасности нет. Самый первый вирус там сам Google (cоздатель Андроида), второй, например, Viber, которому Google разрешил прописываться в Андроиде администратором, причем так, что его иногда и рутом оттуда не удалишь. Если Google разрешает некоторым приложениям быть администраторами (изменять настройки) телефона, то о какой безопасности пользователя или телефона можно говорить? За ним шпионят Google, Viber и вообше кто попало, кто может и знает, как это делать. Причем даже в обход Google, которого (а вернее его сервисы) можно и выбросить из Андроид. Андроид небезопасен потому, что бесплатен. Безопасность не была в числе основных целей его создания.
What Is an Android Auto-Generated RRO Product?
Customizing an Android phone is possible once you know how to code an auto-generated runtime resource overlay (RRO) product. It’s a popular option for buyers and sellers of aftermarket Android phones for a variety of reasons, like appearance and speed.
An Android RRO project is a package that changes the resource values of a target package when a program is running. This means that new RRO resource files can be placed over a mobile app’s original resource files to change values like layouts, colors, and fonts.
Learn more about the Android RRO process and how to customize phones below.
What’s the purpose of an Android RRO?
An RRO is used in the customization of Android apps or a phone’s system user interface (UI) elements. The Android operating system has a theming framework built in by Google that you can customize through additional coding. Think of UI elements as the foundation of a software application. They’re all the components that come into play between the user and software, like features that help you navigate.
There are three types of UI elements in an Android system:
- Input elements: Input is when a user enters information into a designated space on their phone or chooses items from a list, like a drop-down menu.
- Output elements: Output refers to messages sent to the user that are positive or negative, such as a warning or success message.
- Helper elements: UI helper elements are navigational, informational, or grouping components.
Using an RRO to alter UI elements greatly reduces the time and effort that’s usually needed to customize an Android device.
Create custom themes and app icons for your phone
Phone customization is often an extension of personal style. There are certain looks and colors we appreciate or respond to more than others. Just like you can customize your wardrobe, you can create custom themes for an Android phone with an RRO project. You can also apply Android icon packs and themes through a launcher — which doesn’t require any coding — to create a more uniform look for the apps on the home screen.
Runtime vs. static RROs
Android RROs are dynamic RROs that are enabled at runtime. Runtime RROs can be enabled or disabled at a later point with programming by changing the package’s permissions. On the other hand, static RROs are enabled at build time when the software application is created. Static RROs can’t be deactivated or disabled any time after creation.
When you build a new Android RRO project, you don’t have to change all the resource files at runtime. For example, you can create an RRO to change the colors of an app but leave the layout as it was originally built.
What can and can’t be overlaid with an RRO
It’s important to understand what you can and can’t change when creating an RRO project for an Android phone. Anything under the resource file of an application can be overlaid with an Android RRO, including:
- Colors
- Fonts
- Strings
- Layouts
- Drawables
- Other XML resource files
There are some limitations to be aware of when creating an Android RRO project. You can’t overlay any source code files (e.g., Java or Kotlin source code) with an RRO. SRC files are also unchangeable, as they’re file extensions usually associated with source code files.
What an RRO does on your phone
The user interface of an Android app is mostly created with XML files. When an app has separate XML resources for its appearance and attributes, the RRO framework enables you to overlay the existing files with custom XML resources.
Here’s a broad overview of how a normal app project converts and executes its files in runtime versus an RRO project’s process.
Normal app process
An app typically consists of three types of files when it’s built: the manifest file called AndroidManifest.xml, Java/Kotlin files, and resources files.
To run an app, the app project files must be converted into an Android Package (APK). During the conversion, the Java/Kotlin files are compiled into a file named “classes.dex” and the resources files are condensed into a “appresources.arsc” file. Android Studio and the Android Gradle Plugin use the Android Asset Packaging Tool (AAPT2) to compile and package an app’s resources.
The final step of the normal app process is the execution of the APK. Classes.dex and appresources.arsc are used to run the app during processing. This last step is when an RRO can come in and overlay any original resource file to customize the app.
RRO overlay process
The RRO process begins with the building of an RRO project, also known as a package. The project is assigned a package name and contains both a manifest file and resource files. An RRO project is converted into an RRO APK during the build process, so the overlay resources will be compiled into a resources.arsc file.
The RRO overlay package can now target a specific package, like fonts, in the original app you’re customizing. As the target application begins to run, it picks up the installed RRO APK resources.arsc file and uses the RRO identity mapping (IDMAP) to assign specific overlays to the correct target packages.
In a broad sense, the RRO resources.arsc overrides the appresources.arsc file of the original app. Your RRO tells the app to ignore its original build and use this new build instead.
The Android app must be a valid and signed APK for RRO customization to work.
What is a valid and signed Android APK file?
An Android Package (APK) is the file format Android uses to distribute and install apps. Also known as an Android Package Kit or Android Application Package, an APK is an archive file that has all that’s needed for an app to be installed on a device. They’re like ZIP files that combine and compress multiple files into a single, more portable, and smaller package. Unlike a ZIP, though, an APK contains extra instructions for installation on a mobile phone.
As a security measure, all APKs must be digitally signed with a certificate before they can be installed. Creating a keystore is necessary because this is where the security certificate is stored. A signed Android APK enables an app to be available for download through the Google Play Store.
A signed APK identifies the app’s author, encourages trust between Google and developers, and ensures an original and unmodified app is delivered to a device correctly.
Is it difficult to customize your Android with an RRO?
The difficulty of customizing an Android device with an RRO lies in the knowledge and skills of the developer. Google has made the Android OS an open-source operating system for cellphones.
The Android Open Source Project (AOSP) aims to offer the source code and information needed to create custom variants of the Android OS. It also ensures Android devices meet compatibility standards to keep the system functioning for millions of users.
You can develop apps and contribute code to the Android OS because of Google’s open-source project. Developers build Android apps with Android Platform application programming interfaces (APIs) in Kotlin or Java. The set of APIs that enable you to quickly and easily develop an app is known as the Android framework.
Anyone can build a new app or customize an Android once they learn how to do it. Whether working with a Google Pixel phone or a Samsung Galaxy, the operating system is the same and open to change. Custom Android ROMs and RROs allow for a variety of customization options.
How to create an Android app and RROs
There are two main ways to create an RRO. It should be easier for you to learn how to build an RRO package if you’re familiar with building apps. You’ll need to install Android SDK tools and use the Android Packaging Tool (AAPT) to build an overlay package manually. Search for online tutorials to help explain this method and more.
Developers can also use Android Studio for Android development and to build overlay packages. This software provides the fastest tools for building on an Android device and includes:
- Visual layout editor
- APK analyzer
- Fast emulator
- Intelligent code editor
- Flexible build system
- Realtime profilers
It’s easier to build RROs in Android Studio than manually. You can also test an app and RROs before installing them to see how your codes will function. Generic System Images (GSIs) can be installed and run on multiple Android devices to perform app testing.
Buying or selling a phone? See how Phonecheck adds trust to the process
Customizing phones in the Android aftermarket is popular among buyers and sellers. Just like the APK signing process adds trust to the process of app development, the Phonecheck complete device certification solution adds trust to the process of buying and selling used Android phones. We set the standards in used device certification; you’ll know that a Phonecheck-certified device is fully functioning and ready for customization.
Our industry-leading reports and certification process provides diagnostic information about a device, so you know exactly what you’re getting. Don’t buy a used device without obtaining a Phonecheck Device History Report. You can avoid costly hidden problems for about the cost of a cup of coffee.
Join the thousands of businesses already using Phonecheck to solve many of your Android aftermarket needs. Request a demo of our all-in-one services today.
Android aosp overlay что это

Собираем знания по редактированию графической части Android
- Публикуются только мануалы, уроки и т.п. по модификации приложений. Вопросы и комментарии оставляйте в Обсуждении
- Обсуждение — Обсуждение способов редактирования системных ресурсов
- Инструменты — Инструментарий разработчика модов на базе Android
- Стол заказов — Стол заказов на компилирование и редактирование системных ресурсов и приложений
- Стол заказов для MIUI — Стол заказов на моды и украшения для MIUI прошивок
- Перед оформлением сообщения с уроком.
- Рекомендуется проверить, не размещался ли он ранее, в случае повтора, информация будет удалена. Просьба подробно описывать все тонкости метода редактирования.
- Публикация уроков, мануалов и т.д.
- Разрешена только по установленному шаблону!
Новая инструкция
[center][color=blue][size=3][b]Название урока, мануала и т.д.[/b][/size][/color][/center]
[b]Протестировано на:[/b]
[list][*][color=darkred][b]Версии Android:[/b][/color] Android X.Y.Z
[*][color=purple][b]Оболочке/прошивке/устройстве:[/b][/color] Samsung/LG/AOSP/LineageOS
[/list]
[spoiler=Описание/Инструкция][color=»#000000″][b]Описание[/b][/color]
Кратко, но понятно раскрываем суть модификации
[img]// s.4pda.to/forum/style_images/f/281-divider_3.png[/img] (При вставке в сообщение уберите пробел, чтобы получилось //s.4pda.to)
[color=»#000000″][b]Инструкция[/b][/color]
Здесь ваша детально расписанная инструкция
[/spoiler]
[spoiler=Скриншоты/Видео]Прикрепляем скриншоты/видео при необходимости. Если нет, то удалите спойлер[/spoiler]
Дополнение к уже существующей инструкции
[center][size=3][color=teal][b]Дополнение к [/color][url=»//4pda.to/forum/index.php?showtopic=540887″]Ссылка на оригинал[/url][/b][/size][/center]
[spoiler=Описание/Инструкция][color=»#000000″][b]Описание[/b][/color]
Кратко, но понятно раскрываем суть дополнения
[img]// s.4pda.to/forum/style_images/f/281-divider_3.png[/img] (При вставке в сообщение уберите пробел, чтобы получилось //s.4pda.to)
[color=»#000000″][b]Инструкция[/b][/color]
Здесь ваша детально расписанная инструкция
[/spoiler]
[spoiler=Скриншоты/Видео]Прикрепляем скриншоты/видео при необходимости. Если нет, то удалите спойлер[/spoiler]
- ссылка напрямую ведёт на инструкцию в другой теме на 4pda и публикуется с согласия автора. Общий формат шаблона при этом должен быть соблюдён
- объявление о добавлении дополнения в сообщение с мануалом (расположенным в данной теме). Такое объявление должно быть удалено в течении недели после публикации
Каталог инструкций и мануалов
Первая часть (Общее, Framework, Мультимедиа)
Вторая часть (SystemUI, Связь, Другое)
Третья часть (Настройки)
Куратор темы: Арт2000 ☆ Написать
Сообщение отредактировал Арт2000 — 17.11.20, 23:55
Скрыть шапку
10.12.21, 00:13 | #2142
●
Постоянный
Реп: ( 11225 )
Реализация анимация выключения экрана
- Версии Android:Android 11
- Прошивке:Motorolla Edge 20 Pro. Порт прошивки для Poco F3
Инструкция
Разобрать services.jar
Положить смали в папку smali_classes2, при сборке они найдут свое место.
power_menu.rar ( 8.34 КБ )
Помеченное — удалить. Помеченное + добавить (то есть заменить)
services\smali\com\android\server\display\ColorFade.smali
+
# interfaces
.implements Lcom/android/server/display/ScreenStateAnimator;
Заменить имя метода в смалях
services\smali\com\android\server\display\DisplayPowerController$BrightnessReason.smali
— .method synthetic constructor (Lcom/android/server/display/DisplayPowerController;Lcom/android/server/display/DisplayPowerController$1;)V
+ .method synthetic constructor (Lcom/android/server/display/DisplayPowerController;Lcom/android/server/display/DisplayPowerController$ScreenOffAnims;)V
services\smali\com\android\server\display\DisplayPowerController$ScreenOffUnblocker.smali
— .method synthetic constructor (Lcom/android/server/display/DisplayPowerController;Lcom/android/server/display/DisplayPowerController$1;)V
+ .method synthetic constructor (Lcom/android/server/display/DisplayPowerController;Lcom/android/server/display/DisplayPowerController$ScreenOffAnims;)V
services\smali\com\android\server\display\DisplayPowerController$ScreenOnUnblocker.smali
— .method synthetic constructor (Lcom/android/server/display/DisplayPowerController;Lcom/android/server/display/DisplayPowerController$1;)V
+ .method synthetic constructor (Lcom/android/server/display/DisplayPowerController;Lcom/android/server/display/DisplayPowerController$ScreenOffAnims;)V
DisplayPowerState$4.smali
services\smali\com\android\server\display\DisplayPowerState$4.smali
# getter for: Lcom/android/server/display/DisplayPowerState;->mColorFade:Lcom/android/server/display/ColorFade;
invoke-static , Lcom/android/server/display/DisplayPowerState;->access$1000(Lcom/android/server/display/DisplayPowerState;)Lcom/android/server/display/ColorFade;
# getter for: Lcom/android/server/display/DisplayPowerState;->mColorFade:Lcom/android/server/display/ScreenStateAnimator;
invoke-static , Lcom/android/server/display/DisplayPowerState;->access$902(Lcom/android/server/display/DisplayPowerState;)Lcom/android/server/display/ScreenStateAnimator;
services\smali\com\android\server\display\DisplayPowerController.smali
# instance fields
+
.field private mScreenOffAnimation:I
4 строки
— (Lcom/android/server/display/DisplayPowerController;Lcom/android/server/display/DisplayPowerController$1;)V
+ (Lcom/android/server/display/DisplayPowerController;Lcom/android/server/display/DisplayPowerController$ScreenOffAnims;)V
Заменить
.method private animateScreenStateChange(IZ)V
.method private animateScreenStateChange(IZ)V
.registers 9
iget-boolean v0, p0, Lcom/android/server/display/DisplayPowerController;->mColorFadeEnabled:Z
if-eqz v0, :cond_1c
iget-object v0, p0, Lcom/android/server/display/DisplayPowerController;->mColorFadeOnAnimator:Landroid/animation/ObjectAnimator;
if-nez v0, :cond_16
iget-object v0, p0, Lcom/android/server/display/DisplayPowerController;->mColorFadeOffAnimator:Landroid/animation/ObjectAnimator;
if-eqz v0, :cond_1c
:cond_16
if-ne p1, v2, :cond_1b
iput-boolean v1, p0, Lcom/android/server/display/DisplayPowerController;->mPendingScreenOff:Z
:cond_1c
:goto_1c
iget-boolean v0, p0, Lcom/android/server/display/DisplayPowerController;->mDisplayBlanksAfterDozeConfig:Z
if-eqz v0, :cond_48
iget-object v0, p0, Lcom/android/server/display/DisplayPowerController;->mPowerState:Lcom/android/server/display/DisplayPowerState;
if-eqz v0, :cond_48
if-nez v0, :cond_48
iget-object v0, p0, Lcom/android/server/display/DisplayPowerController;->mPowerState:Lcom/android/server/display/DisplayPowerState;
iget-object v4, p0, Lcom/android/server/display/DisplayPowerController;->mContext:Landroid/content/Context;
iget-object v0, p0, Lcom/android/server/display/DisplayPowerController;->mColorFadeOffAnimator:Landroid/animation/ObjectAnimator;
if-eqz v0, :cond_45
:cond_45
invoke-direct , Lcom/android/server/display/DisplayPowerController;->setScreenState(I)Z
:cond_48
iget-boolean v0, p0, Lcom/android/server/display/DisplayPowerController;->mPendingScreenOff:Z
if-eqz v0, :cond_58
if-eq p1, v3, :cond_58
iput-boolean v1, p0, Lcom/android/server/display/DisplayPowerController;->mPendingScreenOff:Z
iget-object v0, p0, Lcom/android/server/display/DisplayPowerController;->mPowerState:Lcom/android/server/display/DisplayPowerState;
:cond_58
const/high16 v0, 0x3f800000 # 1.0f
if-ne p1, v2, :cond_6e
if-eqz v1, :cond_15e
iget-object v1, p0, Lcom/android/server/display/DisplayPowerController;->mPowerState:Lcom/android/server/display/DisplayPowerState;
iget-object v0, p0, Lcom/android/server/display/DisplayPowerController;->mPowerState:Lcom/android/server/display/DisplayPowerState;
:cond_6e
const/4 v4, 0x5
if-ne p1, v4, :cond_93
iget-object v1, p0, Lcom/android/server/display/DisplayPowerController;->mScreenBrightnessRampAnimator:Lcom/android/server/display/RampAnimator;
if-eqz v1, :cond_81
iget-object v1, p0, Lcom/android/server/display/DisplayPowerController;->mPowerState:Lcom/android/server/display/DisplayPowerState;
if-eq v1, v2, :cond_15e
:cond_81
invoke-direct , Lcom/android/server/display/DisplayPowerController;->setScreenState(I)Z
if-eqz v1, :cond_15e
iget-object v1, p0, Lcom/android/server/display/DisplayPowerController;->mPowerState:Lcom/android/server/display/DisplayPowerState;
iget-object v0, p0, Lcom/android/server/display/DisplayPowerController;->mPowerState:Lcom/android/server/display/DisplayPowerState;
:cond_93
const/4 v4, 0x3
if-ne p1, v4, :cond_b8
iget-object v1, p0, Lcom/android/server/display/DisplayPowerController;->mScreenBrightnessRampAnimator:Lcom/android/server/display/RampAnimator;
if-eqz v1, :cond_a6
iget-object v1, p0, Lcom/android/server/display/DisplayPowerController;->mPowerState:Lcom/android/server/display/DisplayPowerState;
if-eq v1, v2, :cond_15e
:cond_a6
invoke-direct , Lcom/android/server/display/DisplayPowerController;->setScreenState(I)Z
if-eqz v1, :cond_15e
iget-object v1, p0, Lcom/android/server/display/DisplayPowerController;->mPowerState:Lcom/android/server/display/DisplayPowerState;
iget-object v0, p0, Lcom/android/server/display/DisplayPowerController;->mPowerState:Lcom/android/server/display/DisplayPowerState;
:cond_b8
const/4 v5, 0x4
if-ne p1, v5, :cond_ea
iget-object v1, p0, Lcom/android/server/display/DisplayPowerController;->mScreenBrightnessRampAnimator:Lcom/android/server/display/RampAnimator;
if-eqz v1, :cond_cb
iget-object v1, p0, Lcom/android/server/display/DisplayPowerController;->mPowerState:Lcom/android/server/display/DisplayPowerState;
if-ne v1, v5, :cond_15e
:cond_cb
iget-object v1, p0, Lcom/android/server/display/DisplayPowerController;->mPowerState:Lcom/android/server/display/DisplayPowerState;
if-eq v1, v5, :cond_de
if-eqz v1, :cond_dd
:cond_de
:goto_de
iget-object v1, p0, Lcom/android/server/display/DisplayPowerController;->mPowerState:Lcom/android/server/display/DisplayPowerState;
iget-object v0, p0, Lcom/android/server/display/DisplayPowerController;->mPowerState:Lcom/android/server/display/DisplayPowerState;
:cond_ea
const/4 v4, 0x6
if-eq p1, v4, :cond_131
iput-boolean v3, p0, Lcom/android/server/display/DisplayPowerController;->mPendingScreenOff:Z
iget-boolean v0, p0, Lcom/android/server/display/DisplayPowerController;->mColorFadeEnabled:Z
if-nez v0, :cond_f9
iget-object v0, p0, Lcom/android/server/display/DisplayPowerController;->mPowerState:Lcom/android/server/display/DisplayPowerState;
:cond_f9
iget-object v0, p0, Lcom/android/server/display/DisplayPowerController;->mPowerState:Lcom/android/server/display/DisplayPowerState;
cmpl-float v0, v0, v2
if-nez v0, :cond_10e
iput-boolean v1, p0, Lcom/android/server/display/DisplayPowerController;->mPendingScreenOff:Z
iget-object v0, p0, Lcom/android/server/display/DisplayPowerController;->mPowerState:Lcom/android/server/display/DisplayPowerState;
:cond_10e
if-ne p1, v3, :cond_115
iget v0, p0, Lcom/android/server/display/DisplayPowerController;->mScreenOffAnimation:I
if-eqz v0, :cond_115
:cond_115
if-eqz p2, :cond_12b
iget-object v0, p0, Lcom/android/server/display/DisplayPowerController;->mPowerState:Lcom/android/server/display/DisplayPowerState;
iget-object v1, p0, Lcom/android/server/display/DisplayPowerController;->mContext:Landroid/content/Context;
if-eqz v2, :cond_12b
iget-object v2, p0, Lcom/android/server/display/DisplayPowerController;->mColorFadeOffAnimator:Landroid/animation/ObjectAnimator;
:cond_12b
iget-object v0, p0, Lcom/android/server/display/DisplayPowerController;->mColorFadeOffAnimator:Landroid/animation/ObjectAnimator;
:cond_131
iget-object v1, p0, Lcom/android/server/display/DisplayPowerController;->mScreenBrightnessRampAnimator:Lcom/android/server/display/RampAnimator;
if-eqz v1, :cond_141
iget-object v1, p0, Lcom/android/server/display/DisplayPowerController;->mPowerState:Lcom/android/server/display/DisplayPowerState;
if-ne v1, v4, :cond_15e
:cond_141
iget-object v1, p0, Lcom/android/server/display/DisplayPowerController;->mPowerState:Lcom/android/server/display/DisplayPowerState;
if-eq v1, v4, :cond_154
if-eqz v1, :cond_153
:cond_154
:goto_154
iget-object v1, p0, Lcom/android/server/display/DisplayPowerController;->mPowerState:Lcom/android/server/display/DisplayPowerState;
iget-object v0, p0, Lcom/android/server/display/DisplayPowerController;->mPowerState:Lcom/android/server/display/DisplayPowerState;
:cond_15e
:goto_15e
return-void
.end method
.method private initialize()V
.registers 7
iget-object v0, p0, Lcom/android/server/display/DisplayPowerController;->mContext:Landroid/content/Context;
new-instance v1, Lcom/android/server/display/DisplayPowerController$ScreenOffAnims;
iget-object v2, p0, Lcom/android/server/display/DisplayPowerController;->mHandler:Lcom/android/server/display/DisplayPowerController$DisplayControllerHandler;
const-string/jumbo v2, «tweaks_screen_off_animation»
iput v0, p0, Lcom/android/server/display/DisplayPowerController;->mScreenOffAnimation:I
new-instance v0, Lcom/android/server/display/DisplayPowerState;
iget-object v1, p0, Lcom/android/server/display/DisplayPowerController;->mBlanker:Lcom/android/server/display/DisplayBlanker;
iget-boolean v2, p0, Lcom/android/server/display/DisplayPowerController;->mColorFadeEnabled:Z
if-eqz v2, :cond_f
new-instance v2, Lcom/android/server/display/ColorFade;
:cond_f
const/4 v2, 0x0
:goto_10
invoke-direct , Lcom/android/server/display/DisplayPowerState;->(Lcom/android/server/display/DisplayBlanker;Lcom/android/server/display/ColorFade;)V
iget v2, p0, Lcom/android/server/display/DisplayPowerController;->mScreenOffAnimation:I
+
.
.
.
iput-object v0, p0, Lcom/android/server/display/DisplayPowerController;->mColorFadeOffAnimator:Landroid/animation/ObjectAnimator;
const-wide/16 v1, 0x190
+ invoke-virtual , Lcom/android/server/display/DisplayPowerController;->updateScreenOffAnimationDuration()V
.method static synthetic getPowerState(Lcom/android/server/display/DisplayPowerController;)Lcom/android/server/display/DisplayPowerState;
.registers 1
iget-object p0, p0, Lcom/android/server/display/DisplayPowerController;->mPowerState:Lcom/android/server/display/DisplayPowerState;
return-object p0
.end method
.method private getScreenAnimationModeForDisplayState(I)I
.registers 5
iget v0, p0, Lcom/android/server/display/DisplayPowerController;->mScreenOffAnimation:I
if-eq v0, v2, :cond_e
if-eq v0, v1, :cond_9
:cond_9
if-ne p1, v2, :cond_d
:cond_d
return v1
:cond_e
if-ne p1, v2, :cond_11
:cond_11
return v1
.end method
.method static synthetic getScreenOffAnims(Lcom/android/server/display/DisplayPowerController;)I
.registers 1
iget p0, p0, Lcom/android/server/display/DisplayPowerController;->mScreenOffAnimation:I
return p0
.end method
.method static synthetic putScreenOffAnims(Lcom/android/server/display/DisplayPowerController;I)I
.registers 2
iput p1, p0, Lcom/android/server/display/DisplayPowerController;->mScreenOffAnimation:I
return p1
.end method
.method public updateScreenOffAnimationDuration()V
.registers 4
iget v0, p0, Lcom/android/server/display/DisplayPowerController;->mScreenOffAnimation:I
if-eqz v0, :cond_7
const-wide/16 v1, 0x190
:cond_7
const-wide/16 v1, 0x1
:goto_9
iget-object v0, p0, Lcom/android/server/display/DisplayPowerController;->mColorFadeOffAnimator:Landroid/animation/ObjectAnimator;
DisplayPowerState.smali
services\smali\com\android\server\display\DisplayPowerState.smali
— .field private final mColorFade:Lcom/android/server/display/ColorFade;
+ .field private mColorFade:Lcom/android/server/display/ScreenStateAnimator;
— .method public constructor (Lcom/android/server/display/DisplayBlanker;Lcom/android/server/display/ColorFade;)V
+ .method public constructor (Lcom/android/server/display/DisplayBlanker;I)V
.
.
.
iput-object v0, p0, Lcom/android/server/display/DisplayPowerState;->mChoreographer:Landroid/view/Choreographer;
iput-object p1, p0, Lcom/android/server/display/DisplayPowerState;->mBlanker:Lcom/android/server/display/DisplayBlanker;
— iput-object p2, p0, Lcom/android/server/display/DisplayPowerState;->mColorFade:Lcom/android/server/display/ColorFade;
+ nvoke-virtual , Lcom/android/server/display/DisplayPowerState;->setScreenStateAnimator(I)V
new-instance v0, Lcom/android/server/display/DisplayPowerState$PhotonicModulator;
.method public dismissColorFade()V
.
— iget-object v0, p0, Lcom/android/server/display/DisplayPowerState;->mColorFade:Lcom/android/server/display/ColorFade;
if-eqz v0, :cond_11
invoke-virtual , Lcom/android/server/display/ColorFade;->dismiss()V —
+ iget-object v0, p0, Lcom/android/server/display/DisplayPowerState;->mColorFade:Lcom/android/server/display/ScreenStateAnimator;
if-eqz v0, :cond_11
invoke-interface , Lcom/android/server/display/ScreenStateAnimator;->dismiss()V +
Метод
.method public dismissColorFadeResources()V
Заменить на
.method public dismissColorFadeResources()V
.registers 2
iget-object v0, p0, Lcom/android/server/display/DisplayPowerState;->mColorFade:Lcom/android/server/display/ScreenStateAnimator;
if-eqz v0, :cond_7
:cond_7
return-void
.end method
.method public dump(Ljava/io/PrintWriter;)V
.
.
.
— iget-object v0, p0, Lcom/android/server/display/DisplayPowerState;->mColorFade:Lcom/android/server/display/ColorFade;
+ iget-object v0, p0, Lcom/android/server/display/DisplayPowerState;->mColorFade:Lcom/android/server/display/ScreenStateAnimator;
if-eqz v0, :cond_c8
— invoke-virtual , Lcom/android/server/display/ColorFade;->dump(Ljava/io/PrintWriter;)V
+ invoke-interface , Lcom/android/server/display/ScreenStateAnimator;->dump(Ljava/io/PrintWriter;)V
:cond_c8
return-void
.end method
.method public prepareColorFade(Landroid/content/Context;I)Z
.registers 6
— iget-object v0, p0, Lcom/android/server/display/DisplayPowerState;->mColorFade:Lcom/android/server/display/ColorFade;
+ iget-object v0, p0, Lcom/android/server/display/DisplayPowerState;->mColorFade:Lcom/android/server/display/ScreenStateAnimator;
if-eqz v0, :cond_15
— invoke-virtual , Lcom/android/server/display/ColorFade;->prepare(Landroid/content/Context;I)Z
+ invoke-interface , Lcom/android/server/display/ScreenStateAnimator;->prepare(Landroid/content/Context;I)Z
.method static synthetic access$902(Lcom/android/server/display/DisplayPowerState;)Lcom/android/server/display/ScreenStateAnimator;
.registers 2
iget-object v0, p0, Lcom/android/server/display/DisplayPowerState;->mColorFade:Lcom/android/server/display/ScreenStateAnimator;
return-object v0
.end method
.method public setScreenStateAnimator(I)V
.registers 3
iget-object v0, p0, Lcom/android/server/display/DisplayPowerState;->mColorFade:Lcom/android/server/display/ScreenStateAnimator;
if-eqz v0, :cond_7
:cond_7
const/4 v0, 0x0
if-nez p1, :cond_12
new-instance p1, Lcom/android/server/display/ColorFade;
iput-object p1, p0, Lcom/android/server/display/DisplayPowerState;->mColorFade:Lcom/android/server/display/ScreenStateAnimator;
:cond_12
new-instance p1, Lcom/android/server/display/ElectronBeam;
iput-object p1, p0, Lcom/android/server/display/DisplayPowerState;->mColorFade:Lcom/android/server/display/ScreenStateAnimator;
:goto_19
return-void
.end method
Автономные настройки
Сообщение отредактировал Арт2000 — 04.01.22, 12:16
Причина редактирования: Добавлено как дополнение
13.12.21, 00:38 | #2143
●
Постоянный
Реп: ( 11225 )
Смена иконок сети/вай-фай через автономные настройки.
- Версии Android:Android 11
- Прошивке:OnePlus 9R OxygenOS. Порт прошивки для Poco F3
Инструкция
Разбираем OPSystemUI.apk, папку из архива положить в res/
Смали в smali_classes3
drawable-sw360dp-xxxhdpi.rar ( 472.14 КБ )
TelephonyIcons.smali
OPSystemUI\smali\com\android\systemui\statusbar\policy\TelephonyIcons.smali
Ищем код
sget-object v0, Lcom/android/systemui/statusbar/policy/TelephonyIcons;->TELEPHONY_SIGNAL_STRENGTH_FOUR_BAR:[[I
:goto_0
sput-object v0, Lcom/android/systemui/statusbar/policy/TelephonyIcons;->TELEPHONY_SIGNAL_STRENGTH:[[I
Добавить помеченное +
sget-object v0, Lcom/android/systemui/statusbar/policy/TelephonyIcons;->TELEPHONY_SIGNAL_STRENGTH_FOUR_BAR:[[I
:goto_0
+ invoke-static , Lcom/android/systemui/statusbar/policy/TelephonyIcons;->getTelephonySignalIcon([[I)[[I
sput-object v0, Lcom/android/systemui/statusbar/policy/TelephonyIcons;->TELEPHONY_SIGNAL_STRENGTH:[[I
Добавить метод
.method private static getTelephonySignalIcon([[I)[[I
.locals 6
const-string/jumbo v0, «switch_signal»
packed-switch v0, :pswitch_data_0
:goto_0
return-object p0
:pswitch_0
const v1, 0x7f080fd9
const v2, 0x7f080fe8
const v3, 0x7f080ff7
const v4, 0x7f081006
const v5, 0x7f081015
:pswitch_1
const v1, 0x7f080fda
const v2, 0x7f080fe9
const v3, 0x7f080ff8
const v4, 0x7f081007
const v5, 0x7f081016
:pswitch_2
const v1, 0x7f080fdb
const v2, 0x7f080fea
const v3, 0x7f080ff9
const v4, 0x7f081008
const v5, 0x7f081017
:pswitch_3
const v1, 0x7f080fdc
const v2, 0x7f080feb
const v3, 0x7f080ffa
const v4, 0x7f081009
const v5, 0x7f081018
:pswitch_4
const v1, 0x7f080fdd
const v2, 0x7f080fec
const v3, 0x7f080ffb
const v4, 0x7f08100a
const v5, 0x7f081019
:pswitch_5
const v1, 0x7f080fde
const v2, 0x7f080fed
const v3, 0x7f080ffc
const v4, 0x7f08100b
const v5, 0x7f08101a
:pswitch_6
const v1, 0x7f080fdf
const v2, 0x7f080fee
const v3, 0x7f080ffd
const v4, 0x7f08100c
const v5, 0x7f08101b
:pswitch_7
const v1, 0x7f080fe0
const v2, 0x7f080fef
const v3, 0x7f080ffe
const v4, 0x7f08100d
const v5, 0x7f08101c
:pswitch_8
const v1, 0x7f080fd2
const v2, 0x7f080fe1
const v3, 0x7f080ff0
const v4, 0x7f080fff
const v5, 0x7f08100e
:pswitch_9
const v1, 0x7f080fd3
const v2, 0x7f080fe2
const v3, 0x7f080ff1
const v4, 0x7f081000
const v5, 0x7f08100f
:pswitch_a
const v1, 0x7f080fd4
const v2, 0x7f080fe3
const v3, 0x7f080ff2
const v4, 0x7f081001
const v5, 0x7f081010
:pswitch_b
const v1, 0x7f080fd5
const v2, 0x7f080fe4
const v3, 0x7f080ff3
const v4, 0x7f081002
const v5, 0x7f081011
:pswitch_c
const v1, 0x7f080fd6
const v2, 0x7f080fe5
const v3, 0x7f080ff4
const v4, 0x7f081003
const v5, 0x7f081012
:pswitch_d
const v1, 0x7f080fd7
const v2, 0x7f080fe6
const v3, 0x7f080ff5
const v4, 0x7f081004
const v5, 0x7f081013
:pswitch_e
const v1, 0x7f080fd8
const v2, 0x7f080fe7
const v3, 0x7f080ff6
const v4, 0x7f081005
const v5, 0x7f081014
:goto_1
move v0, v1
aput-object v0, p0, v1
aput-object v0, p0, v1
:pswitch_data_0
.packed-switch 0x2
:pswitch_0
:pswitch_1
:pswitch_2
:pswitch_3
:pswitch_4
:pswitch_5
:pswitch_6
:pswitch_7
:pswitch_8
:pswitch_9
:pswitch_a
:pswitch_b
:pswitch_c
:pswitch_d
:pswitch_e
.end packed-switch
.end method
WifiIcons.smali
OPSystemUI\smali\com\android\systemui\statusbar\policy\WifiIcons.smali
Ищем код
sget v2, Lcom/android/systemui/R$drawable;->op_q_stat_sys_wifi_signal_4_fully:I
sput-object v1, Lcom/android/systemui/statusbar/policy/WifiIcons;->WIFI_FULL_ICONS:[I
sget v2, Lcom/android/systemui/R$drawable;->op_q_stat_sys_wifi_signal_4_fully:I
sput-object v1, Lcom/android/systemui/statusbar/policy/WifiIcons;->WIFI_FULL_ICONS:[I
Добавить метод
.method private static getWifiIcons([I)[I
.locals 5
const-string/jumbo v0, «switch_wifi»
packed-switch v0, :pswitch_data_0
:goto_0
return-object p0
:pswitch_0
const v0, 0x7f081020
const v1, 0x7f08102b
const v2, 0x7f081036
const v3, 0x7f081041
const v4, 0x7f08104c
:pswitch_1
const v0, 0x7f081021
const v1, 0x7f08102c
const v2, 0x7f081037
const v3, 0x7f081042
const v4, 0x7f08104d
:pswitch_2
const v0, 0x7f081022
const v1, 0x7f08102d
const v2, 0x7f081038 # 1.8085922E38f
const v3, 0x7f081043
const v4, 0x7f08104e
:pswitch_3
const v0, 0x7f081023
const v1, 0x7f08102e
const v2, 0x7f081039
const v3, 0x7f081044
const v4, 0x7f08104f
:pswitch_4
const v0, 0x7f081024
const v1, 0x7f08102f
const v2, 0x7f08103a
const v3, 0x7f081045
const v4, 0x7f081050
:pswitch_5
const v0, 0x7f081025
const v1, 0x7f081030
const v2, 0x7f08103b
const v3, 0x7f081046
const v4, 0x7f081051
:pswitch_6
const v0, 0x7f081026
const v1, 0x7f081031
const v2, 0x7f08103c
const v3, 0x7f081047
const v4, 0x7f081052
:pswitch_7
const v0, 0x7f081027
const v1, 0x7f081032
const v2, 0x7f08103d
const v3, 0x7f081048
const v4, 0x7f081053
:pswitch_8
const v0, 0x7f08101d
const v1, 0x7f081028
const v2, 0x7f081033
const v3, 0x7f08103e
const v4, 0x7f081049
:pswitch_9
const v0, 0x7f08101e
const v1, 0x7f081029
const v2, 0x7f081034
const v3, 0x7f08103f
const v4, 0x7f08104a
:pswitch_a
const v0, 0x7f08101f
const v1, 0x7f08102a
const v2, 0x7f081035
const v3, 0x7f081040
const v4, 0x7f08104b
:pswitch_b
const v0, 0x7f080b51
const v1, 0x7f080b54
const v2, 0x7f080b57
const v3, 0x7f080b5a
const v4, 0x7f080e20
:pswitch_data_0
.packed-switch 0x2
:pswitch_0
:pswitch_1
:pswitch_2
:pswitch_3
:pswitch_4
:pswitch_5
:pswitch_6
:pswitch_7
:pswitch_8
:pswitch_9
:pswitch_a
:pswitch_b
.end packed-switch
.end method
Собрать, разобрать сисуи, заменить айди в добавленных методах. Мой паблик в архиве
Автономные настройки
Сообщение отредактировал Арт2000 — 04.01.22, 12:20
Причина редактирования: В каталоге
16.12.21, 01:20 | #2144
●
Постоянный
Реп: ( 5137 )
Отключаем проверку на предмет наличия наушников в радио для android 5.1 и 5.1.1 для процессоров Spreadtrum
Инструкция
Разбираем FMPlayer.apk, идем по пути smali\com\thunderst\radio\FMPlay.smali
Ищем метод: .method private isHeadsetExists()Z
Полностью меняем на:
.method private isHeadsetExists()Z
.locals 9
.prologue
const/4 v0, 0x1
return v0
.end method
Идем по пути smali\com\thunderst\radio\FMplayService.smali
Ищем метод .method private isHeadsetExists()Z
Полностью меняем на:
.method private isHeadsetExists()Z
.locals 9
.prologue
const/4 v0, 0x1
return v0
.end method
Дополнения
На этом все. Радио должно заработать без гарнитуры. Жаль что я удалил прошлый мануал для 4.4 андроид для Spreadtrum процессоров, и увы не помню что там изменял
Сообщение отредактировал Арт2000 — 19.04.22, 13:20
Причина редактирования: Дополнение
22.01.22, 07:56 | #2145
●
Постоянный
Реп: ( 1042 )
Отключение проверки подписи приложений Android 12 SDK31
Описание/Инструкция
Работаем с services.jar
По пути \services\smali_classes2\com\android\server\pm\PackageManagerServiceUtils.smali
находим и заменяем методы на
.method public static compareSignatures([Landroid/content/pm/Signature;[Landroid/content/pm/Signature;)I
registers 9
return v0
.end method
.method private static matchSignaturesCompat(Ljava/lang/String;Lcom/android/server/pm/PackageSignatures;Landroid/content/pm/PackageParser$SigningDetails;)Z
.registers 14
return v0
.end method
.method private static matchSignaturesRecover(Ljava/lang/String;Landroid/content/pm/PackageParser$SigningDetails;Landroid/content/pm/PackageParser$SigningDetails;I)Z
.registers 8
.param p3 # I
.annotation build Landroid/content/pm/PackageParser$SigningDetails$CertCapabilities;
.end annotation
.end param
return v0
.end method
Собрать service.jar и заменить в системе
Особая благодарность товарищу tselikov.oleg за тестирование
Сообщение отредактировал Арт2000 — 19.04.22, 13:18
Причина редактирования: В каталоге
24.01.22, 06:17 | #2146
●
Постоянный
Реп: ( 5137 )
Заставляем работать радио в режиме Flight Mode — он же режим полета
Инструкция
Разбираем FMPlayer.apk, идем по пути smali\com\thunderst\radio\FMPlay.smali
Ищем метод: .method public handleMessage(Landroid/os/Message;)V
и комментируем строки:
# .line 672
# iget-object v10, p0, Lcom/thunderst/radio/FMPlay$5;->this$0:Lcom/thunderst/radio/FMPlay;
# const-string v11, «airplane_mode_on»
Радио должно заработать в режиме полёта
Сообщение отредактировал Арт2000 — 19.04.22, 13:20
Причина редактирования: Добавлено как дополнение
14.03.22, 14:58 | #2147
●
Постоянный
Реп: ( 139 )
Замена Google WebView на AOSP WebView
- Версии Android: Android 7.1.1 — возможно выше, ниже
- Прошивке: AOSP с preinstalled GApps
Описание
Инструкция для тех, кто хочет заменить Google WebView (com.google.android.webview) на AOSP(Lineage) WebView, Bromite WebView (com.android.webview) и т.д. на прошивке, не поддерживающей их.
Инструкция
- Распаковываем framework-res.apk
- Переходим по пути /framework-res/res/xml/config_webview_packages.xml
- Будет что-то на подобии этого:
Результат такой:
Сообщение отредактировал Арт2000 — 19.04.22, 13:23
Причина редактирования: В каталоге
04.05.22, 20:46 | #2148
●
Постоянный
Реп: ( 5137 )
Убираем системные настройки отображения процентов батареи на андроид 4.4.x для процессоров MEDIATEK
Если кто делает стороннее отображение процентов заряда батареи например как тут Инструкции по редактированию системных ресурсов
То уже не нужно нуждаться например в родном отображении заряда батареи, просто удаляем их. Что нужно?
Инструкция
Декомпилируем Settings.apk, переходим в Settings\smali\com\mediatek\settings\fuelgauge и открываем PowerUsageExts.smali
Ищем метод .method public initPowerUsageExtItems()V и приводим к виду:
.method public initPowerUsageExtItems()V
.locals 4
.prologue
const/4 v0, 0x0

Сообщение отредактировал Арт2000 — 02.06.22, 13:57
Причина редактирования: В каталоге
07.05.22, 22:40 | #2149
●
Постоянный
Реп: ( 894 )
Уровень заряда Bluetooth-наушников в статусбаре
- Версии Android:Android 12.0
- Устройстве/Оболочке:Galaxy S21, OneUI 4.1
Описание/Инструкция

Описание
Добавляем иконку заряда Bluetooth-наушников в статусбар
(наушники должны поддерживать передачу информации о заряде)
Инструкция
Редактируем SystemUI.apk
- Добавляем GearUtils
- Копируем содержимое архива в разобранный SystemUISystemUI_Add_BT_Icons.zip ( 10.19 КБ )
.method public init()V
.method public init()V
. . . . .
const-string v1, «android.intent.action.DATE_CHANGED»
const-string v1, «android.bluetooth.device.action.BATTERY_LEVEL_CHANGED»
iget-object v1, p0, Lcom/android/systemui/statusbar/phone/PhoneStatusBarPolicy;->mBroadcastDispatcher:Lcom/android/systemui/broadcast/BroadcastDispatcher;
iget-object v2, p0, Lcom/android/systemui/statusbar/phone/PhoneStatusBarPolicy;->mIntentReceiver:Landroid/content/BroadcastReceiver;
.method private final updateBluetooth()V
.method private final updateBluetooth()V
.locals 7
iget-object v0, p0, Lcom/android/systemui/statusbar/phone/PhoneStatusBarPolicy;->mBluetooth:Lcom/android/systemui/statusbar/policy/BluetoothController;
iget-object v1, p0, Lcom/android/systemui/statusbar/phone/PhoneStatusBarPolicy;->mResources:Landroid/content/res/Resources;
sget v2, Lcom/android/systemui/R$string;->accessibility_quick_settings_bluetooth_on:I
sget v3, Lcom/android/systemui/R$drawable;->stat_sys_data_bluetooth_connected:I
if-eqz v0, :cond_1
iget-object v4, p0, Lcom/android/systemui/statusbar/phone/PhoneStatusBarPolicy;->mBluetooth:Lcom/android/systemui/statusbar/policy/BluetoothController;
if-eqz v4, :cond_0
iget-object v0, p0, Lcom/android/systemui/statusbar/phone/PhoneStatusBarPolicy;->mBluetooth:Lcom/android/systemui/statusbar/policy/BluetoothController;
if-eqz v1, :cond_bt0
:cond_bt0
invoke-interface , Ljava/util/List;->get(I)Ljava/lang/Object;
check-cast v0, Landroid/bluetooth/BluetoothDevice;
:goto_bt0
const/16 v1, 0x64
const-string v4, «drawable»
if-ne v0, v1, :cond_bt1
const-string v0, «stat_sys_data_bluetooth_connected_battery_9»
:cond_bt1
const/16 v1, 0x5a
if-lt v0, v1, :cond_bt2
const-string v0, «stat_sys_data_bluetooth_connected_battery_8»
:cond_bt2
const/16 v1, 0x50
if-lt v0, v1, :cond_bt3
const-string v0, «stat_sys_data_bluetooth_connected_battery_7»
:cond_bt3
const/16 v1, 0x46
if-lt v0, v1, :cond_bt4
const-string v0, «stat_sys_data_bluetooth_connected_battery_6»
:cond_bt4
const/16 v1, 0x3c
if-lt v0, v1, :cond_bt5
const-string v0, «stat_sys_data_bluetooth_connected_battery_5»
:cond_bt5
const/16 v1, 0x32
if-lt v0, v1, :cond_bt6
const-string v0, «stat_sys_data_bluetooth_connected_battery_4»
:cond_bt6
const/16 v1, 0x28
if-lt v0, v1, :cond_bt7
const-string v0, «stat_sys_data_bluetooth_connected_battery_3»
:cond_bt7
const/16 v1, 0x1e
if-lt v0, v1, :cond_bt8
const-string v0, «stat_sys_data_bluetooth_connected_battery_2»
:cond_bt8
const/16 v1, 0x14
if-lt v0, v1, :cond_bt9
const-string v0, «stat_sys_data_bluetooth_connected_battery_1»
:cond_bt9
const/16 v1, 0xa
if-lt v0, v1, :cond_bta
const-string v0, «stat_sys_data_bluetooth_connected_battery_0»
:cond_bta
:goto_bt1
iget-object v0, p0, Lcom/android/systemui/statusbar/phone/PhoneStatusBarPolicy;->mResources:Landroid/content/res/Resources;
sget v1, Lcom/android/systemui/R$string;->accessibility_bluetooth_connected:I
iget-object v1, p0, Lcom/android/systemui/statusbar/phone/PhoneStatusBarPolicy;->mBluetooth:Lcom/android/systemui/statusbar/policy/BluetoothController;
move-object v1, v0
:cond_1
move v0, v2
:cond_0
:goto_0
iget-object v4, p0, Lcom/android/systemui/statusbar/phone/PhoneStatusBarPolicy;->mIconController:Lcom/android/systemui/statusbar/phone/StatusBarIconController;
iget-object v5, p0, Lcom/android/systemui/statusbar/phone/PhoneStatusBarPolicy;->mSlotBluetoothConnected:Ljava/lang/String;
iget-object v1, p0, Lcom/android/systemui/statusbar/phone/PhoneStatusBarPolicy;->mIconController:Lcom/android/systemui/statusbar/phone/StatusBarIconController;
iget-object v3, p0, Lcom/android/systemui/statusbar/phone/PhoneStatusBarPolicy;->mSlotBluetoothConnected:Ljava/lang/String;
iget-object v0, p0, Lcom/android/systemui/statusbar/phone/PhoneStatusBarPolicy;->mIconController:Lcom/android/systemui/statusbar/phone/StatusBarIconController;
iget-object p0, p0, Lcom/android/systemui/statusbar/phone/PhoneStatusBarPolicy;->mSlotBluetooth:Ljava/lang/String;

Сообщение отредактировал Арт2000 — 02.06.22, 13:58
Причина редактирования: В каталоге
21.05.22, 21:04 | #2150
●
Постоянный
Реп: ( 171 )
Возвращаем скрытый пункт Экранное время в Настройках
- Версии Android: Android 9
- Оболочке/прошивке/устройстве: Miui/Global 11.0.11/Xiaomi Redmi note 8
Описание/Инструкция
Описание
Возвращаем скрытый пункт Экранное время в Настройках Xiaomi Redmi note 8
Инструкция
Распаковываем апк Настройки,идём по пути res/xml находим файл settings_headers.xml ,находим строчку и меняем android:id=»@id/screen_time» на свой придуманный любой id,далее прописываем придуманный нами id в файл values/id.xml,собираем апк(возможно способ варварский,но рабочий)

Сообщение отредактировал Арт2000 — 02.06.22, 14:00
Причина редактирования: В каталоге
23.05.22, 19:42 | #2151
●
Куратор
Реп: ( 6942 )
Анимация всплывающих (тост) уведомлений.
- Версии Android: Android 12
- Оболочке/прошивке/устройстве: Samsung S20+ OneUI-4.1
Суть модификации- добавляем в framework-res.apk свои анимации, описываем их в res/values/styles.xml, далее в framework.jar делаем переключатель для подстановки своей анимации вместо стандартной.
Управление переключением производится с помощью управляющего приложения (в приведенной инструкции — Ром Контрол типа Grx)..
Инструкция
1. Декомпилируем framework-res.apk и добавляем файлы из нижеприведенного архива — по пути res/anim/
Toast_Animation_Guide_23.05.2022.rar ( 10.77 КБ )
— В res/values/styles.xml добавляем в конце:
Рекомпилируем и опять декомпилируем framework-res.apk, чтобы получить из res/values/public.xml — id добавленных ресурсов.
2. Декомпилируем framework.jar
— в классе framework/smali/android/R$style.smali добавляем (id берем из декомпилированного framework-res.apk с добавленными ресурсами):
.class public final Landroid/R$style;
.super Ljava/lang/Object;
.source «R.java»
# annotations
.annotation system Ldalvik/annotation/EnclosingClass;
value = Landroid/R;
.end annotation
.annotation system Ldalvik/annotation/InnerClass;
accessFlags = 0x19
name = «style»
.end annotation
# static fields
.field public static final Animation:I = 0x1030000
.field public static final Animation_Activity:I = 0x1030001
.field public static final Animation_Dialog:I = 0x1030002
.field public static final Animation_InputMethod:I = 0x1030056
.field public static final Animation_Toast:I = 0x1030004
+++.field public static final Animation_Toast_SlideRight:I = 0x1030589
.field public static final Animation_Toast_SlideLeft:I = 0x103058a
.field public static final Animation_Toast_SlideRightLeft:I = 0x103058b
.field public static final Animation_Toast_SlideLeftRight:I = 0x103058c
.field public static final Animation_Toast_Xylon:I = 0x103058d
.field public static final Animation_Toast_Toko:I = 0x103058e
.field public static final Animation_Toast_Tn:I = 0x103058f
.field public static final Animation_Toast_Honami:I = 0x1030590
.field public static final Animation_Toast_Fade:I = 0x1030591
.field public static final Animation_Toast_FastFade:I = 0x1030592
.field public static final Animation_Toast_GrowFade:I = 0x1030593
.field public static final Animation_Toast_Translucent:I = 0x1030594
.field public static final Animation_Toast_Wlryss:I = 0x1030595
.field public static final Animation_Toast_Wlryss1:I = 0x1030596
.field public static final Animation_Toast_Wlryss2:I = 0x1030597
.field public static final Animation_Toast_Wlryss3:I = 0x1030598
.field public static final Animation_Toast_Wlryss4:I = 0x1030599
.field public static final Animation_Toast_Wlryss5:I = 0x103059a
.field public static final Animation_Toast_Wlryss6:I = 0x103059b
.field public static final Animation_Toast_Wlryss7:I = 0x103059c
.field public static final Animation_Toast_Wlryss8:I = 0x103059d+++
.field public static final Animation_Translucent:I = 0x1030003
.field public static final ButtonBar:I = 0x1030058
.field public static final DeviceDefault_ButtonBar:I = 0x10301cf
.
— в классе framework/smali_classes4/com/android/internal/R$style.smali добавляем строки:
.class public final Lcom/android/internal/R$style;
.super Ljava/lang/Object;
.source «R.java»
# annotations
.annotation system Ldalvik/annotation/EnclosingClass;
value = Lcom/android/internal/R;
.end annotation
.annotation system Ldalvik/annotation/InnerClass;
accessFlags = 0x19
name = «style»
.end annotation
# static fields
.field public static final ActiveWallpaperSettings:I = 0x10302e8
.field public static final Animation:I = 0x1030000
.field public static final Animation_Activity:I = 0x1030001
.field public static final Animation_DeviceDefault_Activity_Resolver:I = 0x10302f3
.field public static final Animation_Dialog:I = 0x1030002
.field public static final Animation_DropDownDown:I = 0x10302f9
.field public static final Animation_DropDownUp:I = 0x10302fa
.field public static final Animation_HoverPopup:I = 0x10302fe
.field public static final Animation_ImmersiveModeConfirmation:I = 0x10302ff
.field public static final Animation_InputMethod:I = 0x1030056
.field public static final Animation_InputMethodFancy:I = 0x1030300
.field public static final Animation_LockScreen:I = 0x1030301
.field public static final Animation_PopupWindow:I = 0x1030307
.field public static final Animation_RecentApplications:I = 0x1030309
.field public static final Animation_Toast:I = 0x1030004
+++.field public static final Animation_Toast_SlideRight:I = 0x1030589
.field public static final Animation_Toast_SlideLeft:I = 0x103058a
.field public static final Animation_Toast_SlideRightLeft:I = 0x103058b
.field public static final Animation_Toast_SlideLeftRight:I = 0x103058c
.field public static final Animation_Toast_Xylon:I = 0x103058d
.field public static final Animation_Toast_Toko:I = 0x103058e
.field public static final Animation_Toast_Tn:I = 0x103058f
.field public static final Animation_Toast_Honami:I = 0x1030590
.field public static final Animation_Toast_Fade:I = 0x1030591
.field public static final Animation_Toast_FastFade:I = 0x1030592
.field public static final Animation_Toast_GrowFade:I = 0x1030593
.field public static final Animation_Toast_Translucent:I = 0x1030594
.field public static final Animation_Toast_Wlryss:I = 0x1030595
.field public static final Animation_Toast_Wlryss1:I = 0x1030596
.field public static final Animation_Toast_Wlryss2:I = 0x1030597
.field public static final Animation_Toast_Wlryss3:I = 0x1030598
.field public static final Animation_Toast_Wlryss4:I = 0x1030599
.field public static final Animation_Toast_Wlryss5:I = 0x103059a
.field public static final Animation_Toast_Wlryss6:I = 0x103059b
.field public static final Animation_Toast_Wlryss7:I = 0x103059c
.field public static final Animation_Toast_Wlryss8:I = 0x103059d+++
.field public static final Animation_Tooltip:I = 0x103030e
.field public static final Animation_Translucent:I = 0x1030003
.
— в классе framework/smali_classes4/android/widget/ToastPresenter.smali в методе .method private adjustLayoutParams(Landroid/view/WindowManager$LayoutParams;Landroid/os/IBinder;IIIIFFZ)V
добавляем/удаляем строки:
.method private adjustLayoutParams(Landroid/view/WindowManager$LayoutParams;Landroid/os/IBinder;IIIIFFZ)V
.registers 15
iget-object v0, p0, Landroid/widget/ToastPresenter;->mResources:Landroid/content/res/Resources;
iput v1, p1, Landroid/view/WindowManager$LayoutParams;->gravity:I
and-int/lit8 v2, v1, 0x7
const/high16 v3, 0x3f800000 # 1.0f
if-ne v2, v4, :cond_19
iput v3, p1, Landroid/view/WindowManager$LayoutParams;->horizontalWeight:F
:cond_19
and-int/lit8 v2, v1, 0x70
const/16 v4, 0x70
if-ne v2, v4, :cond_21
iput v3, p1, Landroid/view/WindowManager$LayoutParams;->verticalWeight:F
:cond_21
iput p5, p1, Landroid/view/WindowManager$LayoutParams;->x:I
iput p6, p1, Landroid/view/WindowManager$LayoutParams;->y:I
iput p7, p1, Landroid/view/WindowManager$LayoutParams;->horizontalMargin:F
iput p8, p1, Landroid/view/WindowManager$LayoutParams;->verticalMargin:F
iget-object v2, p0, Landroid/widget/ToastPresenter;->mContext:Landroid/content/Context;
iput-object v2, p1, Landroid/view/WindowManager$LayoutParams;->packageName:Ljava/lang/String;
if-ne p3, v2, :cond_38
const-wide/16 v2, 0x1b58
:cond_38
const-wide/16 v2, 0xfa0
:goto_3a
iput-wide v2, p1, Landroid/view/WindowManager$LayoutParams;->hideTimeoutMilliseconds:J
iput-object p2, p1, Landroid/view/WindowManager$LayoutParams;->token:Landroid/os/IBinder;
if-eqz p9, :cond_4a
iget-object v2, p0, Landroid/widget/ToastPresenter;->mContext:Landroid/content/Context;
const-string/jumbo v4, «toast_animation»
packed-switch v1, :pswitch_data_180
iput v1, p1, Landroid/view/WindowManager$LayoutParams;->windowAnimations:I
iput v1, p1, Landroid/view/WindowManager$LayoutParams;->windowAnimations:I
iput v1, p1, Landroid/view/WindowManager$LayoutParams;->windowAnimations:I
iput v1, p1, Landroid/view/WindowManager$LayoutParams;->windowAnimations:I
iput v1, p1, Landroid/view/WindowManager$LayoutParams;->windowAnimations:I
iput v1, p1, Landroid/view/WindowManager$LayoutParams;->windowAnimations:I
iput v1, p1, Landroid/view/WindowManager$LayoutParams;->windowAnimations:I
iput v1, p1, Landroid/view/WindowManager$LayoutParams;->windowAnimations:I
iput v1, p1, Landroid/view/WindowManager$LayoutParams;->windowAnimations:I
iput v1, p1, Landroid/view/WindowManager$LayoutParams;->windowAnimations:I
iput v1, p1, Landroid/view/WindowManager$LayoutParams;->windowAnimations:I
iput v1, p1, Landroid/view/WindowManager$LayoutParams;->windowAnimations:I
iput v1, p1, Landroid/view/WindowManager$LayoutParams;->windowAnimations:I
iput v1, p1, Landroid/view/WindowManager$LayoutParams;->windowAnimations:I
iput v1, p1, Landroid/view/WindowManager$LayoutParams;->windowAnimations:I
iput v1, p1, Landroid/view/WindowManager$LayoutParams;->windowAnimations:I
iput v1, p1, Landroid/view/WindowManager$LayoutParams;->windowAnimations:I
iput v1, p1, Landroid/view/WindowManager$LayoutParams;->windowAnimations:I
iput v1, p1, Landroid/view/WindowManager$LayoutParams;->windowAnimations:I
iput v1, p1, Landroid/view/WindowManager$LayoutParams;->windowAnimations:I
iput v1, p1, Landroid/view/WindowManager$LayoutParams;->windowAnimations:I
iput v1, p1, Landroid/view/WindowManager$LayoutParams;->windowAnimations:I+++
. — ### Удалить отсюда
iget v2, p1, Landroid/view/WindowManager$LayoutParams;->windowAnimations:I
const v3, 0x1030004
if-ne v2, v3, :cond_4a
iput v2, p1, Landroid/view/WindowManager$LayoutParams;->windowAnimations:I
. — ### Удалить досюда
:cond_4a
+++ :goto_4a+++
return-void
+++ :pswitch_data_180
.packed-switch 0x0
:pswitch_ee ### Default Animation
:pswitch_e8 ### Animation.Toast.SlideRight»
:pswitch_e2 ### «Animation.Toast.SlideLeft»
:pswitch_dc ### «Animation.Toast.SlideRightLeft»
:pswitch_d6 ### «Animation.Toast.SlideLeftRight»
:pswitch_d0 ### «Animation.Toast.Xylon»
:pswitch_ca ### «Animation.Toast.Toco»
:pswitch_c4 ### «Animation.Toast.Tn»
:pswitch_be ### «Animation.Toast.Honami»
:pswitch_b7 ### «Animation.Toast.Fade»
:pswitch_b0 ### «Animation.Toast.FastFade»
:pswitch_a9 ### «Animation.Toast.GrowFade»
:pswitch_a2 ### «Animation.Toast.Translucent»
:pswitch_9b ### «Animation.Toast.Wlryss»
:pswitch_94 ### «Animation.Toast.Wlryss1»
:pswitch_8d ### «Animation.Toast.Wlryss2»
:pswitch_86 ### «Animation.Toast.Wlryss3»
:pswitch_7f ### «Animation.Toast.Wlryss4»
:pswitch_78 ### «Animation.Toast.Wlryss5»
:pswitch_71 ### «Animation.Toast.Wlryss6»
:pswitch_6a ### «Animation.Toast.Wlryss7»
:pswitch_63 ### «Animation.Toast.Wlryss8»
.end packed-switch+++
.end method
в методе .method private createLayoutParams()Landroid/view/WindowManager$LayoutParams; увеличиваем количество регистров на 2 и добавляем строки:
.method private createLayoutParams()Landroid/view/WindowManager$LayoutParams;
.registers 5 # 3 +2 registers
new-instance v0, Landroid/view/WindowManager$LayoutParams;
iput v1, v0, Landroid/view/WindowManager$LayoutParams;->height:I
iput v1, v0, Landroid/view/WindowManager$LayoutParams;->width:I
iput v1, v0, Landroid/view/WindowManager$LayoutParams;->format:I
iget-object v2, p0, Landroid/widget/ToastPresenter;->mContext:Landroid/content/Context;
const-string/jumbo v3, «toast_animation»
packed-switch v1, :pswitch_data_180
iput v1, v0, Landroid/view/WindowManager$LayoutParams;->windowAnimations:I
iput v1, v0, Landroid/view/WindowManager$LayoutParams;->windowAnimations:I
iput v1, v0, Landroid/view/WindowManager$LayoutParams;->windowAnimations:I
iput v1, v0, Landroid/view/WindowManager$LayoutParams;->windowAnimations:I
iput v1, v0, Landroid/view/WindowManager$LayoutParams;->windowAnimations:I
iput v1, v0, Landroid/view/WindowManager$LayoutParams;->windowAnimations:I
iput v1, v0, Landroid/view/WindowManager$LayoutParams;->windowAnimations:I
iput v1, v0, Landroid/view/WindowManager$LayoutParams;->windowAnimations:I
iput v1, v0, Landroid/view/WindowManager$LayoutParams;->windowAnimations:I
iput v1, v0, Landroid/view/WindowManager$LayoutParams;->windowAnimations:I
iput v1, v0, Landroid/view/WindowManager$LayoutParams;->windowAnimations:I
iput v1, v0, Landroid/view/WindowManager$LayoutParams;->windowAnimations:I
iput v1, v0, Landroid/view/WindowManager$LayoutParams;->windowAnimations:I
iput v1, v0, Landroid/view/WindowManager$LayoutParams;->windowAnimations:I
iput v1, v0, Landroid/view/WindowManager$LayoutParams;->windowAnimations:I
iput v1, v0, Landroid/view/WindowManager$LayoutParams;->windowAnimations:I
iput v1, v0, Landroid/view/WindowManager$LayoutParams;->windowAnimations:I
iput v1, v0, Landroid/view/WindowManager$LayoutParams;->windowAnimations:I
iput v1, v0, Landroid/view/WindowManager$LayoutParams;->windowAnimations:I
iput v1, v0, Landroid/view/WindowManager$LayoutParams;->windowAnimations:I
iput v1, v0, Landroid/view/WindowManager$LayoutParams;->windowAnimations:I
iput v1, v0, Landroid/view/WindowManager$LayoutParams;->windowAnimations:I
:goto_4a+++
. ### Удалить отсюда
const v1, 0x1030004
iput v1, v0, Landroid/view/WindowManager$LayoutParams;->windowAnimations:I
. ### Удалить досюда
const/16 v1, 0x7d5
iput v1, v0, Landroid/view/WindowManager$LayoutParams;->type:I
const-string v1, «Toast»
const/16 v1, 0x98
iput v1, v0, Landroid/view/WindowManager$LayoutParams;->flags:I
iget-object v1, p0, Landroid/widget/ToastPresenter;->mPackageName:Ljava/lang/String;
+++ :pswitch_data_180
.packed-switch 0x0
:pswitch_ee ### Default Animation
:pswitch_e8 ### Animation.Toast.SlideRight»
:pswitch_e2 ### «Animation.Toast.SlideLeft»
:pswitch_dc ### «Animation.Toast.SlideRightLeft»
:pswitch_d6 ### «Animation.Toast.SlideLeftRight»
:pswitch_d0 ### «Animation.Toast.Xylon»
:pswitch_ca ### «Animation.Toast.Toco»
:pswitch_c4 ### «Animation.Toast.Tn»
:pswitch_be ### «Animation.Toast.Honami»
:pswitch_b7 ### «Animation.Toast.Fade»
:pswitch_b0 ### «Animation.Toast.FastFade»
:pswitch_a9 ### «Animation.Toast.GrowFade»
:pswitch_a2 ### «Animation.Toast.Translucent»
:pswitch_9b ### «Animation.Toast.Wlryss»
:pswitch_94 ### «Animation.Toast.Wlryss1»
:pswitch_8d ### «Animation.Toast.Wlryss2»
:pswitch_86 ### «Animation.Toast.Wlryss3»
:pswitch_7f ### «Animation.Toast.Wlryss4»
:pswitch_78 ### «Animation.Toast.Wlryss5»
:pswitch_71 ### «Animation.Toast.Wlryss6»
:pswitch_6a ### «Animation.Toast.Wlryss7»
:pswitch_63 ### «Animation.Toast.Wlryss8»
.end packed-switch+++
.end method
3. В управляющее приложение (в моем случае Ром Контрол типа GRX — могут использоваться и Независимые настройки и прочее) добавляем в нужную xml:
RRO (Runtime Resource Overlay) in Android AOSP
Today I am going to discuss a very important android resource framework.
Run-time Resource Overlay as its name suggests, is resource overlay and it can be applied at run-time. I may guess not many of you know about it and google never advertises this AOSP resource framework. The android operating system has had this theming framework (RRO) built into AOSP for a few years now. With the help of RRO, we can quickly create themes that can change the look and feel of almost every app that’s installed on an Android device.
As for example — system user interface components, including navigation bar, status bar, notifications tray, and quick settings tray, themselves belong to an app, you can change their looks too. And the best part about it is that you don’t have to write any Java code whatsoever for this RRO.
What’s the catch, you ask? Well, this framework(RRO) can be used only by privileged apps i.e. apps that are installed in a location that can be accessed only by the root user, or by someone who’s (like us ) creating a custom ROM.
RRO work Mechanisms
- Android app’s business logic is written in Java or Kotlin and its user interface is primarily created using XML files.
- A well-written Android app will have separate XML resources that define its layouts, colors, strings, and attributes.
- The RRO framework, as its name suggests, lets us overlay those XML resources with your own custom XML resources.
- It’s not limited to just XML resources, It also allows you to change an app’s drawables and fonts.
RRO Project Contain
- An app that uses the RRO framework usually doesn’t contain any Java code.
- It is composed only of XML files and, if necessary, fonts and images.
- Like all Android apps, it must be valid and signed APK.
Customize the Build with RRO
By using RRO or say resource overlays, we can customize android os product at build time. So that same Android OS behave differently in a different device. Resource overlays specify resource files that are applied on top of the defaults. To use resource overlays, we have to modify the project buildfile to set PRODUCT_PACKAGE_OVERLAYS to a path relative to our top-level directory. The most commonly customized settings are contained in the file frameworks/base/core/res/res/config.xml. To set up a resource overlay on this file, add the overlay directory to the project buildfile, as follows:
PRODUCT_PACKAGE_OVERLAYS := device/DEVICE_IMPLEMENTER/DEVICE_NAME/overlay
Then, add an overlay file to the directory, for example:
Any strings or string arrays found in the overlay config.xml file replace those found in the original file.
Build a Product with overlay
for organizing the source files for our device(custom ROM), generally, we have to deal with makefile as for example
- device.mk
- device-vendor.mk
- AndroidProducts.mk
- BoardConfig.mk and
- vendorsetup.sh.
For more detail, we can take Android Developer site as reference.
Example project to modify Quick setting tray
Step 1. Create a new project
I am using Linux(Ubuntu) system and CLI is my favorite. So run the following command to create a new project
mkdir MyOverlays && cd MyOverlays
- manifest file must contain the package name of our application
- we are creating overlays for quick setting, so we must use com.android.systemui as the target package name
Step 2. Create a Theme
Actually we are creating an overlay for existing quick settings. Here is some point to keep in mind:-
- To overlay a resource of the target application, our application must have a resource with the same name.
- To change the colors of the target application, we have to overlay its colors.xml file with our own colors.xml file.
- We can keep only those details that we want to change
- In this example, we want to change the background color of the quick settings tray from the default blue-grey to deep orange.
- The value of the color is specified in the res/values/colors.xml file of the system UI app.
- you can take a look at the file on the official Android Git repository or androidxref
To change the color, we must now create a res/values/colors.xml file in our project.
mkdir -p res/values
Inside the colors.xml file, to change the background color of the tray, we must target a color named system_primary_color. Therefore, add the following XML to the file:
Our simple theme is ready! If you want to, you can add more tags to the file to change other colors of the system UI.
Step 3. Generate an APK
This is the last step, in this step we have to create .apk file. Android Studio automatically create .apk file for your application. But for our command line project we use AAPT(Android Asset Packaging Tool) which is a part of the Android SDK.
aapt package -M AndroidManifest.xml -S res/ \
In the above command, you can see that I’ve chosen to name the APK file myoverlays.apk.u. That’s because our APK is currently both unsigned and unaligned.
To sign our generated .apk, We use the jarsigner tool. For now, we are signing it with the default Android debug keystore. But for custom ROM development we use platform key for signing.
jarsigner -keystore ~/.android/debug.keystore \
Finally, we must align — and thus optimize — the APK using the zipalign tool. As inputs, the tool expects the names of the unaligned and aligned APKs, along with a number that specifies the alignment boundaries. As of 2017, the number can be nothing else but 4.
zipalign 4 myoverlays.apk.u myoverlays.apk
Step 4. Install the APK
- To install an APK that uses the RRO framework, we must simply place it inside the /system/vendor/overlay directory.
- The directory, by default, belongs to a read-only filesystem and is only accessible to the root user.
- If you are a custom ROM developer(), or have rooted your Android device, you should have no trouble installing the APK.
however, I’ll be showing you how to install the APK on an emulator. Start an emulator in the writable filesystem mode using the emulator command-line tool.
emulator -avd Nexus_5X_API_23 -writable-system
adb tool to gain root privileges on the emulator
adb root
adb remount
The /system/vendor/overlay directory doesn’t exist on the emulator. We must create it manually
mkdir -p /system/vendor/overlay
Finally, push the APK to the directory using adb
adb push myoverlays.apk /system/vendor/overlay
Wait for a few seconds for Android to detect and install the APK, and then restart the emulator for the theme to take effect. After the restart, if you pull down the quick settings tray, you should be able to see the theme in action. This is the way we can create a new resource overlay or edit an existing ones.
Thanks for the support!