Думаю, что каждому начинающему разработчику тяжело понять как Android устроен и в принципе из чего он состоит. В этой статье я постараюсь наиболее детально и понятно расписать как система Android спроектирована.
Начнем со схемы, на которой визуально отображены все основные компоненты архитектуры, а ниже детально (насколько это возможно) рассмотрим каждый из них.
Linux Kernel
Данный уровень является базовым в архитектуре Android, так как вся система Android построена на ядре Linux с некоторыми архитектурными изменениями.
Основные задачи, выполняемые ядром.
Ядро содержит в себе драйверы, необходимые для взаимодействия с оборудованием. Например, возьмем Bluetooth. В наше время сложно найти устройство, которое бы не включало в себя эту функцию. Поэтому ядро должно включать драйвер для работы с ним. На схеме выше как раз таки перечислены все драйверы, входящие в ядро Linux, поэтому не будем перечислять их все по отдельности.
Power Management - это своего рода система управления питанием. Она предоставляет различные средства, с помощью которых приложение может реагировать на режимы питания устройства, а также поддерживать необходимые компоненты устройства активными. Например, при чтении книги нам было бы удобно, если бы экран оставался постоянно активным. Или когда мы включаем музыку и она продолжает проигрываться в фоне при отключенном экране.
Помимо вышеперечисленного, ядро Linux обеспечивает управление памятью и процессом.
Управление памятью.
При запуске различных приложений ядро гарантирует, что пространство памяти, которое они используют, не конфликтует и не перезаписывает друг друга. Также оно проверяет, что все приложения получают достаточный объем памяти для своей работы, и в то же время следит, чтобы ни одно приложение не занимало слишком много места.
Управление процессом.
Каждое приложение в Android работает в отдельном процессе. Ядро же отвечает за управление этими процессами, а именно за создание, приостановку, остановку, или завершение процессов, за одновременное выполнение нескольких процессов, обмен данными между процессами, запуск процессов в фоновом режиме. Помимо этого ядро распределяет работу между процессорами устройства, что максимизирует производительность устройств с несколькими ядрами.
Hardware Abstraction Layer (HAL)
HAL обеспечивает связь между драйверами и библиотеками. Состоит он из нескольких библиотечных модулей, каждый из которых реализует интерфейс для определенного аппаратного компонента (Bluetooth, Камера итд.). И когда к оборудованию устройства обращаются через API-интерфейс, загружается необходимый для его работы модуль.
Если объяснять на пальцах, то когда от приложения поступает какое-либо сообщение, HAL его обрабатывает таким образом, чтобы оно стало понятным для драйверов. И наоборот.
Android Runtime (ART)
Основным языком Android был выбран Java, поскольку это один из самых популярных языков программирования. Для Java существует много наработок и специалистов, а написанные на нем программы переносимы между операционными системами.
Но для того, чтобы программа работала на Java необходима виртуальная машина ‒ Java Virtual Machine. В Android используется виртуальная машина Android Runtime (ART). Эта машина специально оптимизирована для работы на мобильных устройствах: с нехваткой памяти, с постоянной выгрузкой и загрузкой приложений и т.д. В версиях Android ниже 5.0 Lollipop, использовалась виртуальная машина Dalvik - старая реализация виртуальной машины для Android.
В ART, как и в Dalvik, используется свой формат байт-кода ‒ DEX (Dalvik executable). При сборке приложения исходные файлы сначала компилируются в файлы типа class
обычным компилятором, а затем конвертируются специальной утилитой в DEX
.
И Dalvik, и ART оптимизируют выполняемый код, используя механизм компиляции just-in-time (JIT) - компиляция происходит во время выполнения приложения, что позволяет оптимизировать код для выполнения на конкретном устройстве. При этом байт-код приложения можно переносить на другие устройства.
ART может компилировать байт-код заранее, а не во время выполнения, используя ahead-of-time (AOT). Система сама решает, когда и какие приложения необходимо скомпилировать. Например, когда устройство не загружено и подключено к зарядке. При этом ART учитывает информацию о приложении, собранную во время предыдущих запусков, что дает дополнительную оптимизацию.
Native C/C++ Libraries
Набор библиотек, написанных на языках C или C++ и используемых различными компонентами ОС.
Примеры библиотек:
- WebKit - представляет из себя движок веб-браузера и другие связанные с ним функции.
- Media Framework предоставляет медиа кодеки, позволяющие записывать и воспроизводить различные медиа-форматы.
- OpenGL - используется для отображения 2D и 3D графики.
- SQLite - движок базы данных, используемый в Android для хранения данных.
Java API Framework (Application 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-сообщений, календарь, карты, браузер, контакты итд.).
Этот уровень использует все уровни ниже (если смотреть на схему) для правильного функционирования приложений.
Полезные ссылки
Официальная документация.
Hardware Abstraction Layer (HAL) на wiki.
Android Runtime на wiki.