App init android что это

Как работает SystemUI в Android

В этой статье я разберу архитектуру и принцип работы основного приложения 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, в разных режимах интерфейс имеет свою вариацию.

Читайте также:  Usb модем для android планшет


Я уже говорила о том, что сервисы 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.

Читайте также:  Sonic sega all stars android

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

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

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

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

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

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

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

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

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

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

Источник

Настройка и твики init.d

Определенные скрипты-твики для init.d способны увеличить комфорт работы с устройством и настроить его под свои нужды. В данном материале мы разберем основные из них.

Для работы твиков нужно, чтобы Android-устройство поддерживало init.d, а также установленный BusyBox. Естественно, для всего этого потребуется Root-доступ.

Поддержку init.d можно эмулировать с помощью Script Manager или mcTweaker, активировав соответствующие пункты в данных программах. Стоит отметить, что в mcTweaker уже реализовано множество твиков для Android-устройств. В кастомных прошивках многие из скриптов-твиков могут быть предустановленны, так же как и BusyBox. Напомним, что любые манипуляции с системными файлами нужно проделывать с осторожностью. Не забывайте делать резервные копии – это гарантия, что вы в любой момент сможете «откатить» любые изменения.

Созданные скрипты-твики помещаем в папку system/etc/init.d. Для добавления, удаления или редактирования твиков удобно использовать Root Explorer.

Если папки init.d у вас нет, то, скорее всего, скрипты работать не будут. Любой скрипт начинается со строчки:

После чего вставляется, собственно, код твика, например вот так:

echo «500» > /proc/sys/vm/dirty_expire_centisecs

echo «1000» > /proc/sys/vm/dirty_writeback_centisecs

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

Твики для улучшения стабильности и скорости вашего интернет соединения:

echo «0» > /proc/sys/net/ipv4/tcp_timestamps;

echo «1» > /proc/sys/net/ipv4/tcp_tw_reuse;

echo «1» > /proc/sys/net/ipv4/tcp_sack;

echo «1» > /proc/sys/net/ipv4/tcp_tw_recycle;

echo «1» > /proc/sys/net/ipv4/tcp_window_scaling;

echo «5» > /proc/sys/net/ipv4/tcp_keepalive_probes;

echo «30» > /proc/sys/net/ipv4/tcp_keepalive_intvl;

echo «30» > /proc/sys/net/ipv4/tcp_fin_timeout;

echo «404480» > /proc/sys/net/core/wmem_max;

echo «404480» > /proc/sys/net/core/rmem_max;

echo «256960» > /proc/sys/net/core/rmem_default;

echo «256960» > /proc/sys/net/core/wmem_default;

echo «4096, 16384, 404480» > /proc/sys/net/ipv4/tcp_wmem;

echo «4096, 87380, 404480» > /proc/sys/net/ipv4/tcp_rmem;

Скрипты для улучшения производительности и лучшего использования памяти виртуальной машиной:

Читайте также:  The elder scrolls для андроида

echo «4096» > /proc/sys/vm/min_free_kbytes

echo «0» > /proc/sys/vm/oom_kill_allocating_task;

echo «0» > /proc/sys/vm/panic_on_oom;

echo «0» > /proc/sys/vm/laptop_mode;

echo «0» > /proc/sys/vm/swappiness

echo «50» > /proc/sys/vm/vfs_cache_pressure

echo «90» > /proc/sys/vm/dirty_ratio

echo «70» > /proc/sys/vm/dirty_background_ratio

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

echo «8» > /proc/sys/vm/page-cluster;

echo «64000» > /proc/sys/kernel/msgmni;

echo «64000» > /proc/sys/kernel/msgmax;

echo «10» > /proc/sys/fs/lease-break-time;

echo «500, 512000, 64, 2048» > /proc/sys/kernel/sem;

Скрипты, которые позволяют увеличить время автономной работы:

echo «500» > /proc/sys/vm/dirty_expire_centisecs

echo «1000» > /proc/sys/vm/dirty_writeback_centisecs

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

echo «2048» > /sys/devices/virtual/bdi/179:0/read_ahead_kb;

Скрипт для дефрагментации файлов без данных:

Скрипт для отключения записи лог-файлов:

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

echo «2048, 3072, 6144, 15360, 17920, 20480» > /sys/module/lowmemorykiller/parameters/minfree

Скрипт-твинк для управления кэшем:

for j in $LOOP $RAM

echo «0» > $j/queue/rotational;

echo «2048» > $j/queue/read_ahead_kb;

Твики, которые способны в некоторых случаях улучшить производительность центрального процессора вашего устройства:

SAMPLING_RATE=$(busybox expr `cat /sys/devices/system/cpu/cpu0/cpufreq/cpuinfo_transition_latency` * 750 / 1000)

echo 95 > /sys/devices/system/cpu/cpufreq/ondemand/up_threshold

echo $SAMPLING_RATE > /sys/devices/system/cpu/cpu0/cpufreq/ondemand/sampling_rate

Скрипт, переносящий dalvik-кэш в раздел cache, что несколько разгружает раздел data:

CACHESIZE=$(df -k /cache | tail -n1 | tr -s ` ` | cut -d ` ` -f2)

if [ $CACHESIZE -gt 80000 ]

echo «Large cache detected, moving dalvik-cache to /cache»

if [ ! -d /cache/dalvik-cache ]

busybox rm -rf /cache/dalvik-cache /data/dalvik-cache

mkdir /cache/dalvik-cache /data/dalvik-cache

busybox chown 1000:1000 /cache/dalvik-cache

busybox chmod 0771 /cache/dalvik-cache

# bind mount dalvik-cache so we can still boot without the sdcard

busybox mount -o bind /cache/dalvik-cache /data/dalvik-cache

busybox chown 1000:1000 /data/dalvik-cache

busybox chmod 0771 /data/dalvik-cache

echo «Small cache detected, dalvik-cache will remain on /data»

Скрипт для удаления всякого «мусора» с накопителя, вроде временных файлов:

#remove cache, tmp, and unused files

rm -f /data/dalvik-cache/*.apk

rm -f /data/dalvik-cache/*.tmp

if [ -e /data/system/userbehavior.db ]

rm -f /data/system/userbehavior.db

if [ -d /data/system/usagestats ]

chmod 400 /data/system/usagestats

if [ -d /data/system/appusagestats ]

chmod 400 /data/system/appusagestats

#remove main log

Следующие твики переназначают приоритеты стандартных процессов в системе. Это позволяет несколько увеличить плавность и комфорт работы с пользовательским интерфейсом. Перед использованием данных скриптов лучше на всякий случай проверить названия соответствующих процессов именно в вашем устройстве:

renice -20 `pidof com.android.phone`

renice -19 `pidof com.android.inputmethod.latin`

renice -19 `pidof com.swype.android.inputmethod`

renice -17 `pidof com.android.systemui`

renice -9 `pidof com.android.settings`

renice -9 `pidof com.android.vending`

renice -6 `pidof com.sec.android.app.camera`

renice -6 `pidof com.sec.android.app.fm`

renice -6 `pidof com.google.android.apps.maps`

renice -4 `pidof com.google.android.apps.googlevoice`

renice -3 `pidof android.process.media`

В целом, ничего страшного в использовании скриптов-твиков нет, главное, как всегда, делать резервные копии всех изменяемых файлов и системы в целом.

Источник

Оцените статью