Определите на каком уровне архитектуры android находится структура приложения application framework
Платформа Android объединяет операционную систему, построенную на основе ядра ОС Linux, промежуточное программное обеспечение и встроенные мобильные приложения. Разработка и развитие мобильной платформы Android выполняется в рамках проекта AOSP (Android Open Source Project) под управлением OHA (Open Handset Alliance), руководит всем процессом поисковый гигант Google.
Android поддерживает фоновое выполнение задач; предоставляет богатую библиотеку элементов пользовательского интерфейса; поддерживает 2D и 3D графику, используя OpenGL стандарт; поддерживает доступ к файловой системе и встроенной базе данных SQLite.
С точки зрения архитектуры, система Android представляет собой полный программный стек, в котором можно выделить следующие уровни:
- Базовый уровень (Linux Kernel) - уровень абстракции между аппаратным уровнем и программным стеком;
- Набор библиотек и среда исполнения (Libraries & Android Runtime) обеспечивает важнейший базовый функционал для приложений, содержит виртуальную машину Dalvik и базовые библиотеки Java необходимые для запуска Android приложений;
- Уровень каркаса приложений (Application Framework) обеспечивает разработчикам доступ к API, предоставляемым компонентами системы уровня библиотек;
- Уровень приложений (Applications) - набор предустановленных базовых приложений.
Наглядное изображение архитектуры на рисунке 1.1.
Рассмотрим компоненты платформы более подробно.
В основании компонентной иерархии лежит ядро ОС Linux 2.6 (несколько урезанное), служит промежуточным уровнем между аппаратным и программным обеспечением, обеспечивает функционирование системы, предоставляет системные службы ядра: управление памятью, энергосистемой и процессами, обеспечение безопасности, работа с сетью и драйверами.
Уровнем выше располагается набор библиотек и среда исполнения. Библиотеки реализуют следующие функции:
- предоставляют реализованные алгоритмы для вышележащих уровней;
- обеспечивает поддержку файловых форматов;
- осуществляет кодирование и декодирование информации (например, мультимедийные кодеки);
- выполняет отрисовку графики и т.д.
Библиотеки реализованы на С/С++ и скомпилированы под конкретное аппаратное обеспечение устройства, вместе с которым они и поставляются производителем в предустановленном виде.
Рассмотрим некоторые библиотеки:
Среда исполнения включает в себя библиотеки ядра, обеспечивающие большую часть низкоуровневой функциональности, доступной библиотекам ядра языка Java, и виртуальную машину Dalvik, позволяющую запускать приложения. Каждое приложение запускается в своем экземпляре виртуальной машины, тем самым обеспечивается изоляция работающих приложений от ОС и друг от друга. Для исполнения на виртуальной машине Dalvik Java-классы компилируются в исполняемые файлы с расширением .dex с помощью инструмента dx, входящего в состав Android SDK. DEX (Dalvik EXecutable) - формат исполняемых файлов для виртуальной машины Dalvik, оптимизированный для использования минимального объема памяти. При использовании IDE Eclipse и плагина ADT (Android Development Tools) компиляция классов Java в формат .dex происходит автоматически.
Архитектура Android Runtime такова, что работа программ осуществляется строго в рамках окружения виртуальной машины, что позволяет защитить ядро ОС от возможного вреда со стороны других ее составляющих. Поэтому код с ошибками или вредоносное ПО не смогут испортить Android и устройство на его базе, когда сработают.
На еще более высоком уровне располагается каркас приложений (Application Framework), архитектура которого позволяет любому приложению использовать уже реализованные возможности других приложений, к которым разрешен доступ. В состав каркаса входят следующие компоненты:
- богатый и расширяемый набор представлений (Views), который может быть использован для создания визуальных компонентов приложений, например, списков, текстовых полей, таблиц, кнопок или даже встроенного web-браузера;
- контент-провайдеры (Content Providers), управляющие данными, которые одни приложения открывают для других, чтобы те могли их использовать для своей работы;
- менеджер ресурсов (Resource Manager), обеспечивающий доступ к ресурсам без функциональности (не несущим кода), например, к строковым данным, графике, файлам и другим;
- менеджер оповещений (Notification Manager), позволяющий приложениям отображать собственные уведомления для пользователя в строке состояния;
- менеджер действий (Activity Manager), управляющий жизненными циклами приложений, сохраняющий историю работы с действиями, предоставляющий систему навигации по действиям;
- менеджер местоположения (Location Manager), позволяющий приложениям периодически получать обновленные данные о текущем географическом положении устройства.
Application Framework предоставляет в распоряжение приложений в ОС Android вспомогательный функционал, благодаря чему реализуется принцип многократного использования компонентов приложений и ОС. Естественно, в рамках политики безопасности.
И, наконец, самый высокий, самый близкий к пользователю уровень приложений. Именно на этом уровне пользователь взаимодействует со своим устройством, управляемым ОС Android. Здесь представлен набор базовых приложений, который предустановлен на ОС Android. Например, браузер, почтовый клиент, программа для отправки SMS, карты, календарь, менеджер контактов и др. Список интегрированных приложений может меняться в зависимости от модели устройства и версии Android. К этому уровню также относятся все пользовательские приложения.
Разработчик обычно взаимодействует с двумя верхними уровнями архитектуры Android для создания новых приложений. Библиотеки, система исполнения и ядро Linux скрыты за каркасом приложений.
Для пополнения коллекции приложений своего мобильного устройства пользователь может воспользоваться приложением Google Play, которое позволяет покупать и устанавливать приложения с сервиса Google Play. Разработчики, в свою очередь, могут выкладывать свои приложения в этот сервис, Google Play отслеживает появление обновлений приложения, сообщает пользователям этого приложения об обновлении и предлагает установить его. Также Google Play предоставляет разработчикам доступ к услугам и библиотекам, например, доступ к использованию и отображению Google Maps.
Для установки приложения на устройствах с ОС Android создается файл с расширением *.apk (Android package), который содержит исполняемые файлы, а также вспомогательные компоненты, например, файлы с данными и файлы ресурсов. После установки на устройство каждое приложение "живет" в своем собственном изолированном экземпляре виртуальной машины Dalvik.
Классический рисунок представляющий архитектуру ОС Android:
Если кому-то сложно с английским, то на всякий случай то же самое по на русском:
Сразу приведу оригинальное видео с канала Android Developers на Youtube, где все авторитетно рассказывается и показывается, правда на враждебном нам буржуйском языке. Я использовал это видео, чтобы описать некоторые пункты архитектуры, описания которых не нашел в сети на русском языке.
Если представить компонентную модель Android в виде некоторой иерархии, то в самом низу, как самая фундаментальная и базовая составляющая, будет располагаться ядро операционной системы (Linux Kernel).
Часто компонентную модель ещё называют программным стеком. Действительно, это определение тут уместно, потому что речь идет о наборе программных продуктов, которые работают вместе для получения итогового результата. Действия в этой модели выполняются последовательно, и уровни иерархии также последовательно взаимодействуют между собой.
LINUX KERNEL (ЯДРО ЛИНУКС)
Как известно, Андроид основан на несколько урезанном ядре ОС Linux и поэтому на этом уровне мы можем видеть именно его (версии 2.6.x). Оно обеспечивает функционирование системы и отвечает за безопасность, управление памятью, энергосистемой и процессами, а также предоставляет сетевой стек и модель драйверов. Ядро также действует как уровень абстракции между аппаратным обеспечением и программным стеком.
APPLICATIONS (ПРИЛОЖЕНИЯ)
На вершине программного стека Android лежит уровень приложений (Applications). Сюда относится набор базовых приложений, который предустановлен на ОС Android. Например, в него входят браузер, почтовый клиент, программа для отправки SMS, карты, календарь, менеджер контактов и многие другие. Список интегрированных приложений может меняться в зависимости от модели устройства и версии Android. И помимо этого базового набора к уровню приложений относятся в принципе все приложения под платформу Android, в том числе и установленные пользователем.
Считается, что приложения под Android пишутся на языке Java, но нужно отметить, что существует возможность разрабатывать программы и на C/C++ (с помощью Native Development Kit), и на Basic (с помощью Simple) и с использованием других языков. Также можно создавать собственные программы с помощью конструкторов приложений, таких как App Inventor. Словом, возможностей тут много.
Думаю, что каждому начинающему разработчику тяжело понять как Android устроен и в принципе из чего он состоит. В этой статье я постараюсь наиболее детально и понятно расписать как система Android спроектирована.
Начнем со схемы, на которой визуально отображены все основные компоненты архитектуры, а ниже детально (насколько это возможно) рассмотрим каждый из них.
Linux Kernel
Данный уровень является базовым в архитектуре Android, так как вся система Android построена на ядре Linux с некоторыми архитектурными изменениями.
Основные задачи, выполняемые ядром.
Ядро содержит в себе драйверы, необходимые для взаимодействия с оборудованием. Например, возьмем Bluetooth. В наше время сложно найти устройство, которое бы не включало в себя эту функцию. Поэтому ядро должно включать драйвер для работы с ним. На схеме выше как раз таки перечислены все драйверы, входящие в ядро Linux, поэтому не будем перечислять их все по отдельности.
Power Management - это своего рода система управления питанием. Она предоставляет различные средства, с помощью которых приложение может реагировать на режимы питания устройства, а также поддерживать необходимые компоненты устройства активными. Например, при чтении книги нам было бы удобно, если бы экран оставался постоянно активным. Или когда мы включаем музыку и она продолжает проигрываться в фоне при отключенном экране.
Помимо вышеперечисленного, ядро Linux обеспечивает управление памятью и процессом.
Управление памятью.
При запуске различных приложений ядро гарантирует, что пространство памяти, которое они используют, не конфликтует и не перезаписывает друг друга. Также оно проверяет, что все приложения получают достаточный объем памяти для своей работы, и в то же время следит, чтобы ни одно приложение не занимало слишком много места.
Управление процессом.
Каждое приложение в Android работает в отдельном процессе. Ядро же отвечает за управление этими процессами, а именно за создание, приостановку, остановку, или завершение процессов, за одновременное выполнение нескольких процессов, обмен данными между процессами, запуск процессов в фоновом режиме. Помимо этого ядро распределяет работу между процессорами устройства, что максимизирует производительность устройств с несколькими ядрами.
Hardware Abstraction Layer (HAL)
HAL обеспечивает связь между драйверами и библиотеками. Состоит он из нескольких библиотечных модулей, каждый из которых реализует интерфейс для определенного аппаратного компонента (Bluetooth, Камера итд.). И когда к оборудованию устройства обращаются через API-интерфейс, загружается необходимый для его работы модуль.
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.
Этот уровень использует все уровни ниже (если смотреть на схему) для правильного функционирования приложений.
Полезные ссылки
Официальная документация.
Hardware Abstraction Layer (HAL) на wiki.
Android Runtime на wiki.
Архитектура системы Android, описанная в этой статье, относится к иерархическим отношениям внутри всей системы ниже уровня приложения. Четырехуровневая архитектура, о которой не очень много говорят: уровень приложения, структура, среда выполнения и среда, ядро Linux, но более подробно разделяет внутренние вызовы процессов системы.
1. Архитектура
Схема архитектуры системы Android:
Архитектура системы Android разделена на 5 уровней, расположенных сверху вниз:
- Фреймворк приложения
- Уровень взаимодействия процессов (Binder IPC)
- Уровень системных служб (Системные службы Android)
- Уровень аппаратной абстракции (HAL)
- Ядро Linux
1.1 Платформа приложений (Application Framework)
Платформа приложений, наиболее часто используемая разработчиками приложений. Разработчикам оборудования нужно только понять, что эти API-интерфейсы являются отображениями интерфейсов уровня HAL.
1.2 Уровень взаимодействия процесса (Binder IPC)
Binder Inter-Process Communication (IPC), механизм межпроцессного взаимодействия, позволяет платформе вызывать коды системных служб Android через границы процессов, что позволяет API платформы взаимодействовать с системными службами Android. Для разработчиков этот механизм общения скрыт.
1.3 Уровень системных служб (системные службы Android)
Функция состоит в том, чтобы связываться с системными службами через API-интерфейсы инфраструктуры для получения доступа к базовому оборудованию. Службы являются модульными, с основными компонентами, такими как диспетчер окон, служба поиска или диспетчер уведомлений. Android включает в себя два типа служб: системные службы (например, диспетчер окон, диспетчер уведомлений) и мультимедийные службы (включая службы мультимедиа для воспроизведения и записи).
1.4 Уровень аппаратной абстракции (HAL)
Уровень абстракции оборудования (HAL) определяет стандартный интерфейс для реализации поставщиков оборудования.HAL позволяет реализовать функции, не затрагивая и не модифицируя систему верхнего уровня. Реализация HAL упаковывается в файл модуля (.so) и при необходимости загружается в систему Android.
Компоненты уровня аппаратной абстракции
Стандартная структура HALХарактеристики каждого конкретного аппаратного интерфейса HAL определены в hardware/libhardware/include/hardware/hardware.h , Это гарантирует, что HAL имеет предсказуемую структуру. Этот интерфейс позволяет системе Android загружать правильную версию соответствующего модуля HAL. Интерфейс HAL состоит из двух общих компонентов: модулей и устройств.
Модуль HALРеализация HAL используется для создания файла модуля (.so) и динамического связывания с системой через Android в подходящее время. Вы можете создать для каждой реализации HAL Android.mk File и укажите файл исходного кода, чтобы внедрить его в систему. Вообще говоря, ваши разделяемые библиотеки должны быть названы в формате, который отвечает требованиям, чтобы их можно было найти и правильно загрузить. Режим именования <module_type>:<device_name> .
1.5 Ядро Linux (ядро Linux)
Разработка драйвера устройства аналогична разработке типичного драйвера устройства Linux. Android использует ядро Linux, а также некоторые специальные функции, такие как блокировки пробуждения, драйвер Binder IPC и другие важные функции для мобильных встраиваемых платформ. Эти дополнения в основном используются для системных функций и не повлияют на разработку драйвера.
Два, настоящий бой
Что касается архитектуры Android, то благодаря приведенному выше объяснению она все еще остается относительно абстрактной.В дальнейшем для иллюстрации будет использоваться конкретный модуль Audio. Сначала покажите схему архитектуры аудио:
Application framework, Платформа приложения включает код приложения, который использует API android.media для взаимодействия с аудиооборудованием. Внутри этот код вызывает соответствующий класс JNI для доступа к собственному коду, который взаимодействует с аудиооборудованием.
JNI, Код JNI связан с android.media для вызова собственного кода для доступа к аудиооборудованию. Код JNI находится frameworks/base/core/jni/ с frameworks/base/media/jni .
Native framework, Собственная инфраструктура предоставляет собственный каркас, эквивалентный пакету android.media, и вызывает прокси-сервер IPC для доступа к специфическим для звука службам медиасервера. Собственный код фреймворка находится по адресу frameworks/av/media/libmedia .
Binder IPC, Агент IPC может обмениваться данными между процессами, агент находится frameworks/av/media/libmedia , И начнем с буквы «Я».
Media server, Медиа-сервис включает аудио-сервис, который представляет собой код, который действительно взаимодействует с уровнем реализации HAL. Код медиасервера находится по адресу frameworks/av/services/audioflinger .
HAL, HAL определяет стандартный интерфейс для вызовов аудиоуслуг, функции, которые аудиооборудование должно правильно реализовывать. Интерфейс звукового уровня HAL расположен по адресу hardware/libhardware/include/hardware .Чтобы увидеть больше hardware/audio.h .
Kernel driver, Аудиодрайвер - это взаимодействие с оборудованием и реализацией HAL. Вы можете использовать звуковую архитектуру Linux (ALSA), звуковую систему разработки (OSS) или специальный драйвер (HAL не имеет ничего общего с драйвером).
Три, резюме
Благодаря процессу прочесывания от верхнего уровня к нижнему уровню системы Android я надеюсь получить полное представление об исходном коде andorid и получить более четкое представление о вызовах модулей.
Читайте также: