Найти тему
Всё о Raspberry Pi

Как устроен Android и как он появился

Оглавление

В этой статье я расскажу вам как устроена ОС от Google - Android.

Предыстория

Для начала узнаем, что это за зверь такой. Первая бета вышла в далёком 2007 году, а в 2008 уже первая стабильная версия! В первой версии функционал был очень ограничен и во многом зависел от того, что туда добавит сам производитель телефона.

Телефон на Android 1
Телефон на Android 1

В следующих версиях Android много менялось, некоторые функции убирались, повышалась безопасность и менялось внутреннее устройство системы.

1. Из чего сделан Android


kernel

Android основан на Ядре Linux, думаю ни для кого это не секрет. Ядро(kernel) отвечает за очень важную вещь - взаимодействие с компонентами телефона, такими как камера, Wi-Fi модуль, Динамики, экран и многое другое. Ядро отвечает за управление процессором и памятью.

HAL

На следующем уровне находится HAL - Hardware Abstraction Layer. HAL обеспечивает связь между драйверами и библиотеками. Состоит он из нескольких библиотечных модулей, каждый из которых реализует интерфейс для определенного аппаратного компонента (Bluetooth, Камера и т.д.). И когда к оборудованию устройства обращаются через API-интерфейс, загружается необходимый для его работы модуль.

ART

Уровнем выше находится ART - Android RunTime. Основным языком для Android выбрали Java, но для того, чтобы программа работала на Java необходима виртуальная машина ‒ Java Virtual Machine. В Android используется виртуальная машина Android Runtime (ART). Эта машина специально оптимизирована для работы на мобильных устройствах: с нехваткой памяти, с постоянной выгрузкой и загрузкой приложений и т.д. В версиях Android ниже 5.0 Lollipop, использовалась виртуальная машина Dalvik - старая реализация виртуальной машины для Android.

Native C/C++ Libraries

Находится на том же уровне, что и ART. Набор библиотек, написанных на языках C или C++ и используемых различными компонентами ОС.

Примеры библиотек:

  • WebKit - представляет из себя движок веб-браузера и другие связанные с ним функции.
  • Media Framework предоставляет медиа кодеки, позволяющие записывать и воспроизводить различные медиа-форматы.
  • OpenGL - используется для отображения 2D и 3D графики.
  • SQLite - движок базы данных, используемый в Android для хранения данных.

Java API Framework

Находится на следующей ступени. Java API Framework это набор API, написанный на языке Java и предоставляющий разработчикам доступ ко всем функциям ОС Android. Эти API-интерфейсы образуют строительные блоки, необходимые для создания приложений, упрощая повторное использование основных, модульных, системных компонентов и сервисов, вот небольшая их часть для примера:

  • Activity Manager - управляет жизненным циклом приложения и обеспечивает общий навигационный стек обратных вызовов.
  • Window Manager - управляет окнами и является абстракцией библиотеки Surface Manager.
  • Content Providers - позволяет приложению получать доступ к данным из других приложений или обмениваться собственными данными, т.е. предоставляет механизм для обмена данными между приложениями.
  • View System - содержит строительные блоки для создания пользовательского интерфейса приложения (списки, тексты, кнопки итд.), а также управляет событиями элементов пользовательского интерфейса.
  • Package Manager - управляет различными видами информации, связанными с пакетами приложений, которые в настоящее время установлены на устройстве.
  • Telephony Manager - позволяет приложению использовать возможности телефонии.
  • Resource Manager - обеспечивает доступ к таким ресурсам, как локализованные строки, растровые изображения, графика и макеты.
  • Location Manager - возможность определения местоположения.
  • Notification Manager - отображение уведомлений в строке состояния.

System Apps

Верхний уровень в архитектуре Android, который включает в себя ряд системных (предустановленных) приложений и тонну других приложений, которые можно скачать с Google Play.

Системные приложения на всех устройствах разные, но все они являются предустановленными производителями устройства (приложение для SMS-сообщений, календарь, карты, браузер, контакты итд.).

Этот уровень использует все уровни ниже (если смотреть на схему) для правильного функционирования приложений.

-2

2. Загрузчик

Загрузчик очень важная часть системы - он отвечает за запуск системы. Есть 4 статуса загрузчика:

  • green state - загрузчик заблокирован, используется embedded root of trust, т.е. публичный ключ avb поставляется в аппаратном TEE. Целостность ядра и системы не нарушена. Никаких сообщений пользователю не показывается. Система загружается. Так происходит всегда когда мы пользуемся обычным, не модифицированным устройством.
  • yellow state - загрузчик заблокирован, но вместо аппаратно хранимого ключа от производителя устройства используется user-settable root of trust, т.е. ключи avb генерируются и используются на этапе сборки системы а затем публичный ключ зашивается в специальный раздел вместе с прошивкой системы. Целостность ядра и системы не нарушена. Пользователю на 10 секунд показывается большой желтый предупреждающий знак и сообщается что устройство загружает стороннюю операционную систему. После этого система загружается.
  • orange state - загрузчик разблокирован, root of trust игнорируется. Целостность ядра и системы не проверяется. Пользователю на 10 секунд показывается большой оранжевый предупреждающий знак и сообщается что целостность разделов устройства не проверяется, и система может быть модифицирована. После этого система загружается. Так происходит на устройствах с установленными root-правами или альтернативной сборкой ОС
  • red state - загрузчик заблокирован, используется любой root of trust, целостность системы нарушена при заблокированном загрузчике, либо система повреждена. Пользователю показывается сообщение о том, что система повреждена. Система не загружается.

Например при разблокировке загрузчика состояние сразу меняется на Orange State, при этом даже если система будет повреждена или её вообще не будет, телефон всё ещё будет пытаться включиться, так как отключены все проверки целостности.

Логическим следствием перехода в "оранжевое состояние" и отключения avb является возможность загружать образы с ядром не подписанные производителем устройства. Среди любителей модифицировать android самым популярным проектом такого рода является "Team Win Recovery Project" или просто TWRP. TWRP позволяет делать с устройством практически всё, в частности монтировать и модифицировать любые разделы не загружаясь в саму систему непосредственно.

3. Шифрование

Ранее при шифровании шифровались все разделы, что хоть и защищало пользовательские данные, но доставляло массу проблем. Например нужно было сначала загружаться в одну систему, для расшифровки и последующего запуска во вторую(основную) - это даже звучит неудобно. Так что в новых версиях Android шифрует только раздел /data, в котором хранятся пользовательские данные, по этому Android без проблем загружается в систему, но перед тем как вы впервые введёте пароль Android находится в состоянии BFU (before first unlock) – до первого ввода кода разблокировки. В таком состоянии /data выглядит так:

drwxrwxr-x 2 media_rw media_rw 4096 2021-01-29 10:43 3aIg6706qnt+JRerXQc,9B
drwxrwxr-x 2 media_rw media_rw 4096 2021-01-29 10:43 5RxSnwRfzXH5JsgykyuneB
drwxrwxr-x 2 media_rw media_rw 4096 2021-01-29 10:43 9QCg2626EAEHNRc,IpjzjC
drwxrwxr-x 2 media_rw media_rw 4096 2021-01-29 10:43 XLrhnulSzxYVPwgkHhs8YC
drwxrwxr-x 2 media_rw media_rw 4096 2021-01-29 10:45 ZC6kM5uXi6,coHL+OYgLCB
drwxrwxr-x 2 media_rw media_rw 4096 2021-01-29 10:43 kJJ0DN8Tmhcs7hicwcEZ3A
drwxrwxr-x 2 media_rw media_rw 4096 2021-01-29 10:43 mPaCm6PJHF9,MyimVTRozC
drwxrwxr-x 3 media_rw media_rw 4096 2021-01-29 10:43 qIkgta78EOvsfnjupFXQ+C
drwxrwxr-x 2 media_rw media_rw 4096 2021-01-29 10:43 uAP,C13tjXpxdP8PWVeMRD
drwxrwxr-x 2 media_rw media_rw 4096 2021-01-29 10:43 v33cOjp,wu+hlgBIWnQdjB
drwxrwxr-x 2 media_rw media_rw 4096 2021-01-29 10:43 xxjD9tk7bDh9XZUzoDwMbB

После ввода пароля ваше хранилище станет таким:

drwxrwxr-x 2 media_rw media_rw 4096 2021-01-29 10:43 Alarms
drwxrwxr-x 3 media_rw media_rw 4096 2021-01-29 10:43 Android
drwxrwxr-x 2 media_rw media_rw 4096 2021-01-29 10:43 DCIM
drwxrwxr-x 2 media_rw media_rw 4096 2021-01-29 10:43 Download
drwxrwxr-x 2 media_rw media_rw 4096 2021-01-29 10:43 Movies
drwxrwxr-x 2 media_rw media_rw 4096 2021-01-29 10:43 Music
drwxrwxr-x 2 media_rw media_rw 4096 2021-01-29 10:43 Notifications
drwxrwxr-x 2 media_rw media_rw 4096 2021-01-29 10:43 Pictures
drwxrwxr-x 2 media_rw media_rw 4096 2021-01-29 10:43 Podcasts
drwxrwxr-x 2 media_rw media_rw 4096 2021-01-29 10:43 Ringtones
drwxrwxr-x 2 media_rw media_rw 4096 2021-01-29 10:45 bluetooth

SElinux

SELinux (Security Enhanced Linux). Android использует Security-Enhanced Linux (SELinux) для обеспечения обязательного контроля доступа (MAC) ко всем процессам, даже к процессам, запущенным с привилегиями root/суперпользователя (возможности Linux).
Существует 2 режима SElinux:

  • enforcing – все действия описываемые политиками логируются и принудительно следуют правилам, т.е. если действие явно не разрешено, то оно не будет выполнено
  • permissive – все действия описываемые политиками логируются но не следуют правилам принудительно, т.е. даже если действие явно не разрешено, оно будет выполнено.

В нормально работающей системе android версии от 5.0 SELinux всегда будет в режиме enforcing. Если по каким-то причинам он будет переведён в режим permissive, то пользователю ещё до ввода кода разблокировки покажут большое страшное уведомление об этом и о том что его система небезопасна. Если какая-либо программа попытается перевести SELinux в permissive режим,
то SElinux выдаст пользователю факт модификации его устройства, и может предпочесть уничтожить данные.

Root

Root пользователь - пользователь с правами суперпользователя. Такой пользователь по умолчанию недоступен в Android. Имея Root пользователь может менять файлы системы, монтировать и записывать разделы прямо из системы и т.д. Это одновременно и полезная вещь, и очень опасная. Так к примеру если вы зайдёте в любое банковское приложение с root, то скорее всего оно откажется работать, почему так? Потому что любое другое вредоносное приложение использующее root спокойно сможет "угнать" ваш банковский аккаунт.

В ранних версиях Android для установки root-прав достаточно было перемонтировать раздел system в режим чтения-записи и скопировать туда исполняемый файл su. Затем появилась необходимость думать также и о политиках SELinux, и об AVB.

"Легальные" root-права

Существует абсолютно легальный способ получения прав суперпользователя в системе, без регистрации и СМС. Всё что для этого требуется, это собрать и установить на устройство нерелизную сборку системы. Наличие root-доступа на ней логично обосновано, и используется разработчиками android для диагностики проблем и сбора информации о системе на устройстве, отладке системных компонентов и т.д. Подробнее о видах сборки можно почитать тут. Если вкратце, существуют варианты сборки eng, userdebug и user.

  • user – это релизный вариант сборки для выпуска в продажу. Ограничения системы действуют по полной.
  • userdebug – это "почти-релизная" сборка. Большинство ограничений также действуют. От user варианта отличается только тем, что в ней присутствует отладочная информация и легально разрешён root-доступ.
  • eng – это полностью отладочный вариант сборки, помимо легального root-доступа и отладочной информации в такой сборке присутствуют дополнительные инструменты для диагностики, поиска проблем, профилирования и отладки прямо на устройстве.

Узнать тип сборки на устройстве можно запросив соответствующее свойство командой: getprop ro.build.type На отладочных типах сборок свойство ro.build.type не будет равно user, и свойство ro.debuggable будет установлено в 1.

На отладочных типах сборок отсутствует исполняемый файл su, а получение легального root-доступа на них осуществляется с помощью перезапуска демона adbd с помощью команды adb root. Технически это реализовано в виде простого условия в коде adb. При запуске демон adb всегда стартует от root, но в определённый момент опускает свои привилегии до shell. На нерелизных сборках получив команду adb root он не понижает свои привилегии до shell, а пользователь получает возможность полноценно работать от пользователя root. Специально для того, чтобы adb мог таким образом предоставить полноценный доступ к системе существует специальный контекст u:r:su:s0, который собирается и включается в политики если сборка не является релизной. Он до конца разрешает процессу adb всё что в обычном случае было бы запрещено SELinux.

ADB

ADB - Android Debug Bridge. Используется для отладки, установки и удаления приложений, разблокировки загрузчика, прошивки разделов и много другое. Очень функциональный и полезный инструмент, напоминает SSH.


"Нелегальные" root-права

Для этого есть множество вариантов, но 1 из самых популярных - Magisk. Так же есть SuperSU и KernelSU, но SuperSU устаревший, а KernelSU хоть и гораздо более функционален и менее заметен, но требует модификацию ядра и поддерживается не всеми типами ядер. Magisk - сокращение от Magic Mask. Назван так, потому что создаёт "волшебные зеркала", тем самым разрешая доступ к root только тем приложениям, которым разрешит сам пользователь. Получает Root путём модификации boot.img.

Разница кастомных и стоковых прошивок

Наверняка вы замечали, что некоторые компоненты телефона не работали при установке кастомной прошивки? Дело в том, что хоть исходный код Android открыт, но драйвера делает сам производитель и никому не открывает их исходный код, по этому сборщику системы приходится делать свои драйвера или искать готовые, но драйвера не всегда есть, например на моём Xiaomi не работает датчик приближения телефона к уху на Project Elexir, хотя на родной прошивке всё прекрасно работает, всё из-за отсутствия необходимых драйверов.

Драйвера

Драйвер - небольшая прослойка между системой и железом телефона. позволяет системе и приложениям взаимодействовать с железом телефона.

Завершение

Спасибо за прочтение статьи, надеюсь вам понравилось. Я расказал не обо всём, если захотите - сделаю 2 часть где подробнее расскажу про наиболее важные компоненты системы.