Веб-разработка, WordPress, мобильные устройства…

"Я знаю, что ничего не знаю. но другие не знают и этого. " Сократ

Простое редактирование системного приложения SystemUI.apk и его безопасная установка в телефон на примере ZTE Blade AF3

Очень часто при покупке нового телефона через некоторое время начинает что-то не устраивать в оформлении рабочего стола. Так случилось и у меня. Поводом для раздражения стали иконки сети в статус-баре.

И попытки их изменить при помощи модулей Xposed FrameworkGravity Box и Xstana результатов не приносили. Оставалось одно — править иконки в SystemUI.apk вручную. Под собрал нужную информацию и оказалось что для замены иконок в системном приложении всего то нужен архиватор (системные приложения не надо подписывать после изменений) и я воспользовался самым распространенным — WinRAR-ом. Открыл приложение и извлек папку res/drawable-hdpi из архива на рабочий стол компьютера. Здесь находились искомые иконки сети stat_sys_signal… . С помощью Adobe Photoshop CS6 отредактировал их, хотя можно было бы поменять, подобрав из подходящего приложения (того же Gravity Box). Но тогда надо было бы все равно подгонять размер и переименовывать. Закончив редактирование иконок замену проводил также в WinRAR, добавив нужные иконки в архив, применив при этом режим без сжатия.

Далее скопировал измененный файл на sd-карту и попробовал его установить методом перемещения файловым менеджером с рут-доступом к системе — ES Проводником. Для чего сначала поместил файл в каталог — /system и выставил ему разрешения — rw-r-r. Затем выделил файл и в контекстном меню выбрал — Переместить, указав каталог — /system/priv-app. Появилось окно и я подтвердил — Переписать. Операция как бы закончилась успешно но после перезагрузки ничего не изменилось. Пришлось искать другой способ заменить стандартное приложение SystemUI.apk на модифицированное. В Сети нашел скрипт и хотя он был предназначен для другого приложения я его немного переписал, подправил и переименовал в resysui.sh, применительно к своему случаю. Для его использования пришлось установить Busybox, а Терминал у меня уже был установлен. Также на телефоне должен быть Root. Далее поместил модифицированный SystemUI.apk и скрипт — resysui.sh в корневой каталог sd-карты. Запустил Терминал и ввел первую команду —

Появится окно с предложением предоставить рут-доступ. Подтвердил и ввел такую команду:

sh / sdcard/resysui.sh

В Терминале отобразился процесс исполнения команды и через секунду другую смартфон перезагрузился. После перезагрузки увидел что иконки сети в статус-баре изменились на мои, что в конечном итоге и требовалось.

В последствии я изменил стандартные наэкранные иконки для навигационного бара на иконки в стиле — Lollipop, а как сделать, чтобы они отображались — это совсем простая история… С помощью ES Проводником открыл файл build.prop находящийся в каталоге — /system и в самом низу добавил строку — qemu.hw.mainkeys=0, сохранил изменения и перезагрузил телефон. Появились наэкранные кнопки такого вида…

В этой статье я разберу архитектуру и принцип работы основного приложения Android — SystemUI. Меня заинтересовала эта тема, потому что мне интересно, как устроена система, которой пользуется такое огромное количество пользователей и для которой ежедневно выкатываются тысячи приложений в Google Play или просто на просторы интернета. Помимо этого меня интересует вопрос информационной безопасности Android и создаваемых под него приложений.

В системе Android, SystemUI — это приложение, путь к исходному коду которого находится в platform_frameworks_base/packages/SystemUI/, на девайсе оно находится в system/priv-app/-SystemUI.

priv-app — это каталог, где хранятся привилегированные приложения. К слову, по пути system/app лежат предустановленные приложения, а обычные приложения, которые мы устанавливаем на свой девайс самостоятельно, хранятся в data/app.

Тут сразу возникает вопрос: почему нельзя засунуть все предустановленные и привилегированные приложения в один каталог, зачем нужно это разделение?

Дело в том, что некоторые приложения более системные, чем другие:) И это разделение необходимо для того чтобы уменьшить покрытие эксплойтами системных приложений, для получения доступа к защищенным операциям. Можно создавать приложение, которое будет иметь специальный ApplicationInfo.FLAG_SYSTEM и в системе получит больше прав, однако apk файл с таким разрешением будет помещен в раздел system.

Итак, SystemUI — это apk-файл, который по сути своей обычное приложение. Однако, если посмотреть на сложное устройство SystemUI, перестает казаться, что это всего лишь простое приложение, верно?

Данное приложение выполняет весьма важные функции:

Запуск SystemUI

Как я и говорила выше, SystemUI не похож на обычное приложение, так что его запуск не сопровождается запуском активности, как это происходит у большинства приложений. SystemUI — это глобальный пользовательский интерфейс, который запускается во время процесса загрузки системы и не может быть завершен.

Если мы залезем в SystemServer, который является одним из двух столпов в мире Android (второй — Zygote, но об этом я расскажу как-нибудь в другой раз), то мы можешь найти место, где стартует SystemUI при загрузке системы.

Тут мы видим как запускается сервис SystemUI с помощью непубличного API startServiceAsUser. Если бы вы захотели использовать это, то вам пришлось бы обратиться к рефлексии. Но если вы решите использовать reflection API в Android — подумайте несколько раз, стоит ли это того. Подумайте раз сто:)

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

Метод start() вызывается для запуска каждой службы, которые перечислены ниже.

Регулирование громкости

Мы регулярно пользуемся кнопками громкости на своих устройствах, но не задумываемся какие процессы должны произойти в системе для того чтобы мы могли прибавить или убавить звук. Операция кажется довольно простой на словах, но если заглянуть в VolumeUI, который находится в подпапке SystenUI/volume, в разных режимах интерфейс имеет свою вариацию.


Я уже говорила о том, что сервисы SystemUI запускаются методом start(). Если мы посмотрим на класс VolumeUI, то он тоже наследуется от SystemUI.

Тут мы видим что с помощью mEnabled мы определяем, следует ли нам показывать панель с настройкой звука. И судя по VolumeDialogComponent, VolumeUI отображает звуковую панель в виде диалога. Но все действия относительно нажатия на клавиши громкости обрабатываются в PhoneWindow.

Насколько мы видим, KEYCODE_VOLUME_UP (+) не обрабатывается и перейдет в обработку KEYCODE_VOLUME_DOWN (-). И в обоих событиях, как в onKeyDown, так и в onKeyUp вызывается метод dispatchVolumeButtonEventAsSystemService.

Итак, тут у нас вызывается метод adjustVolume, для того чтобы мы могли проверить наш direction, которому будет присвоен параметр события.

В итоге когда мы доберемся до AudioService, где будет вызван sendVolumeUpdate, где помимо вызова метода postVolumeChanged, будет установлен интерфейс HDMI.

RingtonePlayer

RingtonePlayer в Android выполняет роль проигрывателя. Он так же наследуется от SystemUI и в методе start() мы видим:

Здесь у нас устанавливается mCallback, который по сути является экземпляром IRingtonePlayer.

В итоге можно управлять RingtonePlayerService с помощью Binder для воспроизведения звуковых файлов.

PowerUI

PowerUI отвечает за управление питанием и уведомлениями. Аналогично наследуется от SystemUI и имеет метод start().

Как мы видим из приведенного выше кода, происодит подписка на изменения Settings.Global.LOW_POWER_MODE_TRIGGER_LEVEL, а после — вызов mReceiver.init().

Тут регистрируется широковещательный приемник, с помощью которого происходит отслеживание изменений.

Задачи

Recents — это основная и часто используемая функция в мобильных устройствах на базе Android.

Главные функции:

  • Отображение всех задач
  • Переключение между задачами
  • Удаление задач

Помимо этого Recents так же наследуется от SystemUI. В RecentsActivity происходит создание и обновление последних задач, чтобы мы могли увидеть их на нашем экране.


А в с помощью RecentTaskInfo мы можем получить информацию о конкретной задаче.

Вообще, запущенные задачи можно вынести в отдельную тему. Я изучила ее со всех сторон, так как хотела размывать экран приложения перед переходом приложения в background, чтобы в RecentsTask отображалась нечитаемая версия снапшота. Однако, проблема заключается в том, что снапшот приложения берется раньше, чем вызывается onPause(). Эту проблему можно решить несколькими способами. Либо выставлять флаг, чтобы система просто скрывала содержимое экрана с помощью

О чем я говорила в предыдущей статье, посвященной как раз снапшотам.

Можно вообще сделать так, чтобы конкретная activity приложения не отображалось в задачах, проставив в манифесте

Либо можно воспользоваться хитростью с помощью

Можно задать основной активности выше приведенный флаг excludeFromRecents = true, для того чтобы ее экран отсутствовал в запущенных задачах, но во время загрузки приложения запустить отдельную задачу, которая будет показывать либо размытый скриншот с основной активности, либо любое другое изображение. Более подробно, как это можно сделать описано в официальной документации на примере Google Drive.

Экран блокировки

Keyguard уже посложнее всех вышеприведенных модулей. Он представляет из себя сервис, который запускается в SystemUI, а управляется при помощи KeyguardViewMediator.

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

Панель уведомлений

SystemBars имеет довольно сложное устройство и структуру. Его работа разделяется на два этапа:

  1. Инициализация SystemBars
  2. Отображение уведомлений

Если посмотреть на запуск SystemBars

То мы видим ссылку на ресурс из которого читается имя класса и создается его экземпляр.

Таким образом мы видим что тут вызывается StatusBar, который будет работать с выводом уведомлений и UI.

Я думаю никто и не сомневался в том, что Android устроен очень сложно и заключает в себе много хитростей, которые описаны в огромном количестве строчек кода. SystemUI является одной из самых важных частей этой системы и мне понравилось изучать ее. Из-за того что материала на эту тему очень мало, если вы заметите какие-либо ошибки, прошу исправить меня.

Всякая всячина, которую дядюшка Раджа находит в интернете и хочет поделиться с читателями.

Об авторе

Архив блога

  • ►2020 (1)
  • ►января (1)
  • ►2019 (12)
  • ►декабря (2)
  • ►октября (2)
  • ►сентября (2)
  • ►августа (1)
  • ►июня (2)
  • ►мая (1)
  • ►марта (1)
  • ►января (1)
  • ►2018 (15)
  • ►декабря (2)
  • ►ноября (1)
  • ►октября (2)
  • ►сентября (1)
  • ►июля (1)
  • ►июня (1)
  • ►мая (2)
  • ►апреля (3)
  • ►февраля (1)
  • ►января (1)
  • ►2017 (20)
  • ►декабря (1)
  • ►ноября (2)
  • ►октября (1)
  • ►сентября (3)
  • ►августа (3)
  • ►июня (1)
  • ►мая (1)
  • ►апреля (1)
  • ►марта (1)
  • ►февраля (4)
  • ►января (2)
  • ►2016 (15)
  • ►декабря (4)
  • ►октября (1)
  • ►августа (1)
  • ►июля (2)
  • ►июня (1)
  • ►апреля (3)
  • ►февраля (1)
  • ►января (2)
  • ►2015 (10)
  • ►декабря (1)
  • ►ноября (2)
  • ►сентября (1)
  • ►августа (2)
  • ►июля (1)
  • ►июня (2)
  • ►апреля (1)
  • ►2014 (16)
  • ►декабря (1)
  • ►ноября (3)
  • ►октября (1)
  • ►сентября (1)
  • ►августа (2)
  • ►июля (2)
  • ►мая (1)
  • ►апреля (1)
  • ►февраля (4)
  • ►2013 (11)
  • ►декабря (2)
  • ►октября (2)
  • ►августа (1)
  • ►июля (1)
  • ►июня (1)
  • ►апреля (1)
  • ►марта (1)
  • ►января (2)
  • ▼2012 (24)
  • ►декабря (1)
  • ►ноября (2)
  • ►октября (1)
  • ►сентября (1)
  • ►июля (1)
  • ►июня (4)
  • ►мая (2)
  • ►апреля (2)
  • ►марта (6)
  • ▼февраля (2)
  • Ручной запуск обновления Adobe Flash Player.
  • Как заменять системные APK-файлы на Andro > ►января (2)
  • ►2011 (14)
  • ►декабря (2)
  • ►октября (2)
  • ►сентября (2)
  • ►августа (5)
  • ►июля (2)
  • ►февраля (1)
  • ►2010 (29)
  • ►декабря (1)
  • ►июня (1)
  • ►мая (3)
  • ►апреля (10)
  • ►марта (7)
  • ►февраля (4)
  • ►января (3)
  • ►2009 (38)
  • ►декабря (6)
  • ►ноября (4)
  • ►октября (4)
  • ►сентября (8)
  • ►августа (2)
  • ►июля (2)
  • ►мая (2)
  • ►апреля (1)
  • ►марта (5)
  • ►февраля (2)
  • ►января (2)
  • ►2008 (50)
  • ►декабря (4)
  • ►ноября (6)
  • ►октября (7)
  • ►сентября (15)
  • ►августа (14)
  • ►июля (1)
  • ►июня (2)
  • ►мая (1)

Мой блог смотрят

понедельник, 13 февраля 2012 г.

Как заменять системные APK-файлы на Andro >

Это опять я и мои инструкции для чайников и кофейников с картинками.

Android — это маленький Linux. В нём надо соблюдать ряд правил при замене файлов, чтобы телефон не превратился в кирпич, оживить который поможет только полная перепрошивка с потерей всех данных из внутренней памяти устройства. Внутренние разделы отформатированы в файловую систему отличную от FAT32 на флешках. В свойствах файла кроме всего прочего хранятся разрешения для разных групп пользователей (хозяин файла, группа хозяина файла, остальные пользователи). При операции с системными файлами их надо сохранять, потому что при загрузке система просто может не суметь получить к ним доступ и не загрузиться нормально.
Начнем с инструментария.

  • Менеджер файлов, который умеет работать с root-правами и разрешениями файлов. Лучше всего подойдет Root Explorer (Вы же его купили, да?)
  • Сам модифицированный файл, который мы хотим положить наместо системного (ссылка в конце статьи).

Для начала нужно найти и сохранить резервную копию заменяемого файла.
Для этого запускаем Root Explorer и переходим в каталог " /system/app " и в списке находим нужный файл.

Теперь используем одну из удобных функций Root Explorer. Сделаем долгий тап по нужному файлу, чтобы вызвать контекстное меню

И щелкаем по пункту "Zip this file", чтобы сохранить файл в zip-архиве на SD-карте. После архивации получим такое сообщение:

Нажимаем кнопкй "Stay", чтобы остаться в папке и сделать еще кое-что.

Теперь всё готово для замены файла.
Я уже говорил про права доступа у каждого файла. Чтобы их воссоздать на новом файле, надо сначала посмотреть их у старого. Они представлены рядом символов " rwxrwxrwx ". 1-я триада — права владельца, 2-я — группы владельца, 3-я — всех остальных пользователей. У нашего файла права "rw-r—r—".

Теперь переходим на SD-карту, находим там модифицированный файл и из его контекстного меню выбираем пункт "Copy", но не торопимся выбирать сразу папку " /system/app ", потому что мы тут же повредим систему. Вместо этого копируем файл в специальную папку для временных файлов " /data/local/tmp ", чтобы привести файл в вид, который примет система.
Для начала вызовем контекстное меню файла и выберем пункт "Rename" и введем имя файла " SystemUI.apk ". Именно так, потому что в Linux регистр букв в имени имеет значение, т.е. " systemui.apk " и " SystemUI.apk " — это разные файлы.
Далее надо изменить права на файл, потому что сейчас они почти наверняка выставлены неправильно. Для этого опять вызываем контекстное меню файла долгим тапом и выбираем пункт "Permissions". Для нашего значени "rw-r—r—" флажки надо расставить так:

Нажимаем "OK" и снова вызываем контекстное меню. Теперь надо изменить владельца и группу для этого приложения. Для этого выбираем пункт "Изменить владельца". Появится окно с информацией о текущем владельце файла.
Тут надо сделать маленькое отступление.
В папке " /system/app " всеми файлами владеет пользователь "root" (u >/system/framework " властвует пользователь "system" (g (g > Исходя из вышесказанного, выставляем нужные значения и нажимаем "OK".
И в третий раз вызываем контекстное меню для файла и в нем выбираем пункт "Copy" и в диалоге копирования переходим в папку " /system/app ". Теперь смело нажимаем "Paste" и читаем дальше внимательно.
Практически сразу система сообщит, что процесс строки состояния внезапно завершился, и предложит его запустить. Всё попытки будут неудачными. Между появлениями окон надо успеть сделать ряд действий. Перед нажатием кнопки надо вызвать меню выключения аппарата, оно окажется под предупреждением. Теперь надо расположить палец примерно в левой стороне кнопки. Теперь надо очень быстро щелкнуть три раза пальцем, что успеть закрыть предупреждение, выбрать пункт выключения и подтвердить свои намерения.
Теперь ждем выключения телефона, заново его запускаем и наслаждаемся результатом или не наслаждаемся и ищем ошибки.

И обещанный архив с модифицированным файлом. http://radjah.ucoz.ru/rar/systemui.zip (324 килобайт)

Товарищ Sashoooq подсказал более безопасный вариант установки подобных модификаций.После копирования файла в " /data/local/tmp " и изменения прав у него скопировать его в папку " /system/framework " и перезагрузить телефон. В итоге оригинальный файл останется лежать на своём месте, а система будет загружать модифицированный.Такой способ не является безопасным для apk-файлов, которые уже лежат в этой папке. А лежат там очень вайжные для работы и стабильности системы файлы (" framework-res.apk " и некоторые файлы от производителя).

Статься написана специально для форума 4PDA.