Как устроен Android? Как устроена операционная система андроид

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

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

Основные характеристики

Андроид работает на операционной системе Linux (для простоты понимания, большинство компьютеров – Windows). Файловая структура представлена в виде одного «дерева», из-за чего не всегда получается просто и быстро узнать расположение определенного файла/папки/приложения.

Нужно понимать, что система является чувствительной к регистру. К примеру, на компьютере нельзя создать такие папки с одним названием (написанным разными буквами – заглавными, строчными) в корневом каталоге, так как система их воспримет в качестве одинаковых. Говоря об андроиде, то тут все по-другому. Мобильная система считает их разными.

В случае если планшет или смартфон имеет Root-доступ, то осуществляется возможность поиска папок, которые не отображены на обычном гаджете (как пример – Secure, где остаются данные о приложениях, перенесенных в флэш-карту). Многие из пользователей думают, что она бесполезна и сразу удаляют, чтобы очистить как можно больше памяти, из-за чего невозможно запустить приложение.

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

Установочные файлы: передача другим устройствам

В некоторых случаях может возникнуть необходимости передачи установочного файла с одного устройство на другое. Чаще всего, это происходит тогда, когда нет времени на поиски в Google Play. Для этого следует найти данный файл (расширение.apk), после чего передать при помощи Bluetooth.

В этой серии статей я расскажу о внутреннем устройстве Android  -  о процессе загрузки, о содержимом файловой системы, о Binder и Android Runtime, о том, из чего состоят, как устанавливаются, запускаются, работают и взаимодействуют между собой приложения, об Android Framework, и о том, как в Android обеспечивается безопасность.


Статьи серии:

  • Как работает Android, часть 1

Немного фактов

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


Android  -  свободный и открытый проект. Большинство исходного кода (который можно найти на ) распространяется под свободной лицензией Apache 2.0.


Компания Android Inc. была основана в 2003 году и в 2005 году куплена Google. Публичная бета Android вышла в 2007 году, а первая стабильная версия -  в 2008, с тех пор мажорные релизы выходят примерно раз в год. Последняя на момент написания стабильная версия Android  -  7.1.2 Nougat.


Android is Linux

По поводу такой формулировки было много споров, так что сразу поясню, что именно я имею в виду под этой фразой: Android основан на ядре Linux, но значительно отличается от большинства других Linux-систем.


Среди исходной команды разработчиков Android был Robert Love, один из самых известных разработчиков ядра Linux, да и сейчас компания Google остаётся одним из самых активных контрибьюторов в ядро, поэтому неудивительно, что Android построен на основе Linux.


Как и в других Linux-системах, ядро Linux обеспечивает такие низкоуровневые вещи, как управление памятью, защиту данных, поддержку мультипроцессности и многопоточности. Но  -  за несколькими исключениями  -  вы не найдёте в Android других привычных компонентов GNU/Linux-систем: здесь нет ничего от проекта GNU, не используется X.Org, ни даже systemd. Все эти компоненты заменены аналогами, более приспособленными для использования в условиях ограниченной памяти, низкой скорости процессора и минимального потребления энергии  - таким образом, Android больше похож на встраиваемую (embedded) Linux-систему, чем на GNU/Linux.


Другая причина того, что в Android не используется софт от GNU  -  известная политика «no GPL in userspace»:


We are sometimes asked why Apache Software License 2.0 is the preferred license for Android. For userspace (that is, non-kernel) software, we do in fact prefer ASL 2.0 (and similar licenses like BSD, MIT, etc.) over other licenses such as LGPL.

Android is about freedom and choice. The purpose of Android is promote openness in the mobile world, and we don’t believe it’s possible to predict or dictate all the uses to which people will want to put our software. So, while we encourage everyone to make devices that are open and modifiable, we don’t believe it is our place to force them to do so. Using LGPL libraries would often force them to do just that.

Само ядро Linux в Android тоже немного модифицировано: было добавлено несколько небольших компонентов, в том числе ashmem (anonymous shared memory), Binder driver (часть большого и важного фреймворка Binder, о котором я расскажу ниже), wakelocks (управление спящим режимом) и low memory killer. Исходно они представляли собой патчи к ядру, но их код был довольно быстро добавлен назад в upstream-ядро. Тем не менее, вы не найдёте их в «обычном линуксе»: большинство других дистрибутивов отключают эти компоненты при сборке.


В качестве libc (стандартной библиотеки языка C) в Android используется не GNU C library (glibc), а собственная минималистичная реализация под названием , оптимизированная для встраиваемых (embedded) систем  -  она значительно быстрее, меньше и менее требовательна к памяти, чем glibc, которая обросла множеством слоёв совместимости.


В Android есть оболочка командной строки (shell) и множество стандартных для Unix-подобных систем команд/программ. Во встраиваемых системах для этого обычно используется пакет Busybox , реализующий функциональность многих команд в одном исполняемом файле; в Android используется его аналог под названием Toybox . Как и в «обычных» дистрибутивах Linux (и в отличие от встраиваемых систем), основным способом взаимодействия с системой является графический интерфейс, а не командная строка. Тем не менее, «добраться» до командной строки очень просто  -  достаточно запустить приложение-эмулятор терминала. По умолчанию он обычно не установлен, но его легко, например, скачать из Play Store (Terminal Emulator for Android , Material Terminal , Termux). Во многих «продвинутых» дистрибутивах Android  -  таких, как LineageOS (бывший CyanogenMod)  -  эмулятор терминала предустановлен.



Второй вариант  -  подключиться к Android-устройству с компьютера через Android Debug Bridge (adb). Это очень похоже на подключение через SSH:


user@desktop-linux$ adb shell android$ uname Linux

Из других знакомых компонентов в Android используются библиотека FreeType (для отображения текста), графические API OpenGL ES , EGL и Vulkan , а также легковесная СУБД SQLite .


Кроме того, раньше для реализации WebView использовался браузерный движок WebKit , но начиная с версии 7.0 вместо этого используется установленное приложение Chrome (или другое; список приложений, которым разрешено выступать в качестве WebView provider, конфигурируется на этапе компиляции системы). Внутри себя Chrome тоже использует основанный на WebKit движок Blink , но в отличие от системной библиотеки, Chrome обновляется через Play Store  -  таким образом, все приложения, использующие WebView, автоматически получают последние улучшения и исправления уязвимостей.


It’s all about apps

Как легко заметить, использование Android принципиально отличается от использования «обычного Linux» -  вам не нужно открывать и закрывать приложения, вы просто переключаетесь между ними, как будто все приложения запущены всегда. Действительно, одна из уникальных особенностей Android - в том, что приложения не контролируют напрямую процесс, в котором они запущены. Давайте поговорим об этом подробнее.


Основная единица в Unix-подобных системах  -  процесс. И низкоуровневые системные сервисы, и отдельные команды в shell’е, и графические приложения  -  это процессы. В большинстве случаев процесс представляет собой чёрный ящик для остальной системы  -  другие компоненты системы не знают и не заботятся о его состоянии. Процесс начинает выполняться с вызова функции main() (на самом деле _start), и дальше реализует какую-то свою логику, взаимодействуя с остальной системой через системные вызовы и простейшее межпроцессное общение (IPC).


Поскольку Android тоже Unix-подобен, всё это верно и для него, но в то время как низкоуровневые части  -  на уровне Unix  -  оперируют понятием процесса, на более высоком уровне  -  уровне Android Framework  -  основной единицей является приложение . Приложение  -  не чёрный ящик: оно состоит из отдельных компонентов, хорошо известных остальной системе.


У приложений Android нет функции main() , нет одной точки входа. Вообще, Android максимально абстрагирует понятие приложение запущено как от пользователя, так и от разработчика. Конечно, процесс приложения нужно запускать и останавливать, но Android делает это автоматически (подробнее я расскажу об этом в следующих статьях). Разработчику предлагается реализовать несколько отдельных компонентов, каждый из которых обладает своим собственным жизненным циклом.


In Android, however, we explicitly decided we were not going to have a main() function, because we needed to give the platform more control over how an app runs. In particular, we wanted to build a system where the user never needed to think about starting and stopping apps, but rather the system took care of this for them… so the system had to have some more information about what is going on inside of each app, and be able to launch apps in various well-defined ways whenever it is needed even if it currently isn’t running.

Для реализации такой системы нужно, чтобы приложения имели возможность общатся друг с другом и с системными сервисами  -  другими словами, нужен очень продвинутый и быстрый механизм IPC.


Этот механизм  -  Binder.

Binder

Binder  -  это платформа для быстрого, удобного и объектно-ориентированного межпроцессного взаимодействия.


Разработка Binder началась в Be Inc. (для BeOS), затем он был портирован на Linux и открыт. Основной разработчик Binder, Dianne Hackborn, была и остаётся одним из основных разработчиков Android. За время разработки Android Binder был полностью переписан.


Binder работает не поверх System V IPC (которое даже не поддерживается в bionic), а использует свой небольшой модуль ядра, взаимодействие с которым из userspace происходит через системные вызовы (в основном ioctl) на «виртуальном устройстве» /dev/binder . Со стороны userspace низкоуровневая работа с Binder, в том числе взаимодействие с /dev/binder и marshalling/unmarshalling данных, реализована в библиотеке .


Низкоуровневые части Binder оперируют в терминах объектов, которые могут пересылаться между процессами. При этом используется подсчёт ссылок (reference-counting) для автоматического освобождения неиспользуемых общих ресурсов и уведомление о завершении удалённого процесса (link-to-death) для освобождения ресурсов внутри процесса.


Высокоуровневые части Binder работают в терминах интерфейсов, сервисов и прокси-объектов. Описание интерфейса, предоставляемого программой другим программам, записывается на специальном языке AIDL (Android Interface Definition Language), внешне очень похожем на объявление интерфейсов в Java. По этому описанию автоматически генерируется настоящий Java-интерфейс, который потом может использоваться и клиентами, и самим сервисом. Кроме того, по.aidl -файлу автоматически генерируются два специальных класса: Proxy (для использования со стороны клиента) и Stub (со стороны сервиса), реализующие этот интерфейс.


Для Java-кода в процессе-клиенте прокси-объект выглядит как обычный Java-объект, который реализует наш интерфейс, и этот код может просто вызывать его методы. При этом сгенерированная реализация прокси-объекта автоматически сериализует переданные аргументы, общается с процессом-сервисом через libbinder, десериализует переданный назад результат вызова и возвращает его из Java-метода.

Тебя никогда не интересовало, как работают fastboot или ADB? Или почему смартфон под управлением Android практически невозможно превратить в кирпич? Или, может быть, ты давно хотел узнать, где кроется магия фреймворка Xposed и зачем нужны загрузочные скрипты /system/etc/init.d? А как насчет консоли восстановления (recovery)? Это часть Android или вещь в себе и почему для установки сторонней прошивки обычный рекавери не подходит? Ответы на все эти и многие другие вопросы ты найдешь в данной статье.

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

Узнать о скрытых возможностях программных систем можно, поняв принцип их работы. В некоторых случаях сделать это затруднительно, так как код системы может быть закрыт, но в случае Android мы можем изучить всю систему вдоль и поперек. В этой статье я не буду рассказывать обо всех нюансах работы Android и остановлюсь только на том, как происходит запуск ОС и какие события имеют место быть в промежутке между нажатием кнопки питания и появлением рабочего стола.

Попутно я буду пояснять, что мы можем изменить в этой цепочке событий и как разработчики кастомных прошивок используют эти возможности для реализации таких вещей, как тюнинг параметров ОС, расширение пространства для хранения приложений, подключение swap, различных кастомизаций и многого другого. Всю эту информацию можно использовать для создания собственных прошивок и реализации различных хаков и модификаций.

Шаг первый. ABOOT и таблица разделов

Все начинается с первичного загрузчика. После включения питания система исполняет код загрузчика, записанного в постоянную память устройства. Затем он передает управление загрузчику aboot со встроенной поддержкой протокола fastboot, но производитель мобильного чипа или смартфона/планшета имеет право выбрать и любой другой загрузчик на его вкус. Например, компания Rockchip использует собственный, несовместимый с fastboot загрузчик, для перепрограммирования и управления которым приходится использовать проприетарные инструменты.

Протокол fastboot, в свою очередь, представляет собой систему управления загрузчиком с ПК, которая позволяет выполнять такие действия, как разлочка загрузчика, прошивка нового ядра и recovery, установка прошивки и многие другие. Смысл существования fastboot в том, чтобы иметь возможность восстановить смартфон в начальное состояние в ситуации, когда все остальные средства не работают. Fastboot останется на месте, даже если в результате экспериментов ты сотрешь со смартфона все разделы NAND-памяти, содержащие Android и recovery.

Получив управление, aboot проверяет таблицу разделов и передает управление ядру, прошитому в раздел с именем boot, после чего ядро извлекает в память RAM-образ из того же раздела и начинает загрузку либо Android, либо консоли восстановления. NAND-память в Android-устройствах поделена на шесть условно обязательных разделов:

  • boot - содержит ядро и RAM-диск, обычно имеет размер в районе 16 Мб;
  • recovery - консоль восстановления, состоит из ядра, набора консольных приложений и файла настроек, размер 16 Мб;
  • system - содержит Android, в современных девайсах имеет размер не менее 1 Гб;
  • cache - предназначен для хранения кешированных данных, также используется для сохранения прошивки в ходе OTA-обновления и поэтому имеет размер, сходный с размерами раздела system;
  • userdata - содержит настройки, приложения и данные пользователя, ему отводится все оставшееся пространство NAND-памяти;
  • misc - содержит флаг, определяющий, в каком режиме должна грузиться система: Android или recovery.

Кроме них, также могут существовать и другие разделы, однако общая разметка определяется еще на этапе проектирования смартфона и в случае aboot зашивается в код загрузчика. Это значит, что: 1) таблицу разделов нельзя убить, так как ее всегда можно восстановить с помощью команды fastboot oem format; 2) для изменения таблицы разделов придется разлочить и перепрошить загрузчик с новыми параметрами. Из этого правила, однако, бывают исключения. Например, загрузчик того же Rockchip хранит информацию о разделах в первом блоке NAND-памяти, так что для ее изменения перепрошивка загрузчика не нужна.

Особенно интересен раздел misc. Существует предположение, что изначально он был создан для хранения различных настроек независимо от основной системы, но в данный момент используется только для одной цели: указать загрузчику, из какого раздела нужно грузить систему - boot или recovery. Эту возможность, в частности, использует приложение ROM Manager для автоматической перезагрузки системы в recovery с автоматической же установкой прошивки. На ее же основе построен механизм двойной загрузки Ubuntu Touch, которая прошивает загрузчик Ubuntu в recovery и позволяет управлять тем, какую систему грузить в следующий раз. Стер раздел misc - загружается Android, заполнил данными - загружается recovery… то есть Ubuntu Touch.

Шаг второй. Раздел boot

Если в разделе misc не стоит флаг загрузки в recovery, aboot передает управление коду, расположенному в разделе boot. Это не что иное, как ядро Linux; оно находится в начале раздела, а сразу за ним следует упакованный с помощью архиваторов cpio и gzip образ RAM-диска, содержащий необходимые для работы Android каталоги, систему инициализации init и другие инструменты. Никакой файловой системы на разделе boot нет, ядро и RAM-диск просто следуют друг за другом. Содержимое RAM-диска такое:

  • data - каталог для монтирования одноименного раздела;
  • dev - файлы устройств;
  • proc - сюда монтируется procfs;
  • res - набор изображений для charger (см. ниже);
  • sbin - набор подсобных утилит и демонов (adbd, например);
  • sys - сюда монтируется sysfs;
  • system - каталог для монтирования системного раздела;
  • charger - приложение для отображения процесса зарядки;
  • build.prop - системные настройки;
  • init - система инициализации;
  • init.rc - настройки системы инициализации;
  • ueventd.rc - настройки демона uventd, входящего в состав init.

Это, если можно так выразиться, скелет системы: набор каталогов для подключения файловых систем из разделов NAND-памяти и система инициализации, которая займется всей остальной работой по загрузке системы. Центральный элемент здесь - приложение init и его конфиг init.rc, о которых во всех подробностях я расскажу позже. А пока хочу обратить внимание на файлы charger и ueventd.rc, а также каталоги sbin, proc и sys.

Файл charger - это небольшое приложение, единственная задача которого - вывести на экран значок батареи. Он не имеет никакого отношения к Android и используется тогда, когда устройство подключается к заряднику в выключенном состоянии. В этом случае загрузки Android не происходит, а система просто загружает ядро, подключает RAM-диск и запускает charger. Последний выводит на экран иконку батареи, изображение которой во всех возможных состояниях хранится в обычных PNG-файлах внутри каталога res.

Файл ueventd.rc представляет собой конфиг, определяющий, какие файлы устройств в каталоге sys должны быть созданы на этапе загрузки системы. В основанных на ядре Linux системах доступ к железу осуществляется через специальные файлы внутри каталога dev, а за их создание в Android отвечает демон ueventd, являющийся частью init. В нормальной ситуации он работает в автоматическом режиме, принимая команды на создание файлов от ядра, но некоторые файлы необходимо создавать самостоятельно. Они перечислены в ueventd.rc.

Каталог sbin в стоковом Android обычно не содержит ничего, кроме adbd, то есть демона ADB, который отвечает за отладку системы с ПК. Он запускается на раннем этапе загрузки ОС и позволяет выявить возможные проблемы на этапе инициализации ОС. В кастомных прошивках в этом каталоге можно найти кучу других файлов, например mke2fs, которая может потребоваться, если разделы необходимо переформатировать в ext3/4. Также модеры часто помещают туда BusyBox, с помощью которого можно вызвать сотни Linux-команд.

Каталог proc для Linux стандартен, на следующих этапах загрузки init подключит к нему procfs, виртуальную файловую систему, которая предоставляет доступ к информации обо всех процессах системы. К каталогу sys система подключит sysfs, открывающую доступ к информации о железе и его настройкам. С помощью sysfs можно, например, отправить устройство в сон или изменить используемый алгоритм энергосбережения.

Файл build.prop предназначен для хранения низкоуровневых настроек Android. Позже система обнулит эти настройки и перезапишет их значениями из недоступного пока файла system/build.prop.


Выносы из текста

  • Fastboot останется на месте, даже если в результате экспериментов ты сотрешь со смартфона содержимое всех разделов NAND-памяти
  • Раздел recovery полностью самодостаточен и содержит миниатюрную операционную систему, которая никак не связана с Android
  • Слегка изменив файл fstab, мы можем заставить init загрузить систему с карты памяти

Шаг второй, альтернативный. Раздел recovery

В том случае, если флаг загрузки recovery в разделе misc установлен или пользователь включил смартфон с зажатой клавишей уменьшения громкости, aboot передаст управление коду, расположенному в начале раздела recovery. Как и раздел boot, он содержит ядро и RAM-диск, который распаковывается в память и становится корнем файловой системы. Однако содержимое RAM-диска здесь несколько другое.

В отличие от раздела boot, выступающего в роли переходного звена между разными этапами загрузки ОС, раздел recovery полностью самодостаточен и содержит миниатюрную операционную систему, которая никак не связана с Android. У recovery свое ядро, свой набор приложений (команд) и свой интерфейс, позволяющий пользователю активировать служебные функции.

В стандартном (стоковом) recovery таких функций обычно всего три: установка подписанных ключом производителя смартфона прошивок, вайп и перезагрузка. В модифицированных сторонних recovery, таких как ClockworkMod и TWRP, функций гораздо больше. Они умеют форматировать файловые системы, устанавливать прошивки, подписанные любыми ключами (читай: кастомные), монтировать файловые системы на других разделах (в целях отладки ОС) и включают в себя поддержку скриптов, которая позволяет автоматизировать процесс прошивки и многие другие функции.

С помощью скриптов, например, можно сделать так, чтобы после загрузки recovery автоматически нашел на карте памяти нужные прошивки, установил их и перезагрузился в Android. Эта возможность используется инструментами ROM Manager, auto-flasher, а также механизмом автоматического обновления CyanogenMod и других прошивок.

Кастомные рекавери также поддерживают скрипты бэкапа, располагающиеся в каталоге /system/addon.d/. Перед прошивкой recovery проверяет наличие скриптов и выполняет их перед тем, как произвести прошивку. Благодаря таким скриптам gapps не исчезают после установки новой версии прошивки.

Команды fastboot

Чтобы получить доступ к fastboot, необходимо установить Android SDK, подключить смартфон к ПК с помощью кабеля и включить его, зажав обе кнопки громкости. После этого следует перейти в подкаталог platform-tools внутри SDK и запустить команду

Fastboot devices

На экран будет выведено имя устройства. Другие доступные команды:

  • fatsboot oem unlock - разлочка загрузчика на нексусах;
  • update файл.zip - установка прошивки;
  • flash boot boot.img - прошивка образа boot-раздела;
  • flash recovery recovery.img - прошивка образа раздела recovery;
  • flash system system.img - прошивка образа системы;
  • oem format - восстановление разрушенной таблицы разделов;

Шаг третий. Инициализация

Итак, получив управление, ядро подключает RAM-диск и по окончании инициализации всех своих подсистем и драйверов запускает процесс init, с которого начинается инициализация Android. Как я уже говорил, у init есть конфигурационный файл init.rc, из которого процесс узнает о том, что конкретно он должен сделать, чтобы поднять систему. В современных смартфонах этот конфиг имеет внушительную длину в несколько сот строк и к тому же снабжен прицепом из нескольких дочерних конфигов, которые подключаются к основному с помощью директивы import. Тем не менее его формат достаточно простой и по сути представляет собой набор команд, разделенных на блоки.

Каждый блок определяет стадию загрузки или, выражаясь языком разработчиков Android, действие. Блоки отделены друг от друга директивой on, за которой следует имя действия, например on early-init или on post-fs. Блок команд будет выполнен только в том случае, если сработает одноименный триггер. По мере загрузки init будет по очереди активировать триггеры early-init, init, early-fs, fs, post-fs, early-boot и boot, запуская таким образом соответствующие блоки команд.


Если конфигурационный файл тянет за собой еще несколько конфигов, перечисленных в начале (а это почти всегда так), то одноименные блоки команд внутри них будут объединены с основным конфигом, так что при срабатывании триггера init выполнит команды из соответствующих блоков всех файлов. Это сделано для удобства формирования конфигурационных файлов для нескольких устройств, когда основной конфиг содержит общие для всех девайсов команды, а специфичные для каждого устройства записываются в отдельные файлы.

Наиболее примечательный из дополнительных конфигов носит имя initrc.имя_устройства.rc, где имя устройства определяется автоматически на основе содержимого системной переменной ro.hardware. Это платформенно-зависимый конфигурационный файл, который содержит блоки команд, специфичные для конкретного устройства. Кроме команд, отвечающих за тюнинг ядра, он также содержит примерно такую команду:

Mount_all ./fstab.имя_устройства

Она означает, что теперь init должен подключить все файловые системы, перечисленные в файле./fstab.имя_устройства, который имеет следующую структуру:

Имя_устройства_(раздела) точка_монтирования файловая_система опции_фс прочие опции

Обычно в нем содержатся инструкции по подключению файловых систем из внутренних NAND-разделов к каталогам /system (ОС), /data (настройки приложений) и /cache (кешированные данные). Однако слегка изменив этот файл, мы можем заставить init загрузить систему с карты памяти. Для этого достаточно разбить карту памяти на три 4 раздела: 1 Гб / ext4, 2 Гб / ext4, 1 Гб / ext4 и оставшееся пространство fat32. Далее необходимо определить имена разделов карты памяти в каталоге /dev (для разных устройств они отличаются) и заменить ими оригинальные имена устройств в файле fstab.


В конце блока boot init, скорее всего, встретит команду class_start default, которая сообщит, что далее следует запустить все перечисленные в конфиге службы, имеющие отношение к классу default. Описание служб начинается с директивы service, за которой следует имя службы и команда, которая должна быть выполнена для ее запуска. В отличие от команд, перечисленных в блоках, службы должны работать все время, поэтому на протяжении всей жизни смартфона init будет висеть в фоне и следить за этим.

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

Команды init.rc

Процесс init имеет встроенный набор команд, многие из которых повторяют стандартный набор команд Linux. Наиболее примечательные из них:

  • exec /путь/до/команды - запустить внешнюю команду;
  • ifup интерфейс - поднять сетевой интерфейс;
  • class_start имя_класса - запустить службы, относящиеся к указанному классу;
  • class_stop имя_класса - остановить службы;
  • insmod /путь/до/модуля - загрузить модуль ядра;
  • mount ФС устройство каталог - подключить файловую систему;
  • setprop имя значение - установить системную переменную;
  • start имя_службы - запустить указанную службу;
  • trigger имя - включить триггер (выполнить указанный блок команд);
  • write /путь/до/файла строка - записать строку в файл.

Шаг четвертый. Zygote и app_process

На определенном этапе загрузки init встретит в конце конфига примерно такой блок:

Service zygote /system/bin/app_process -Xzygote /system/bin --zygote --start-system-server class default socket zygote stream 660 root system onrestart write /sys/android_power/request_state wake onrestart write /sys/power/state on onrestart restart media onrestart restart netd

Это описание службы Zygote, ключевого компонента любой Android-системы, который ответственен за инициализацию, старт системных служб, запуск и остановку пользовательских приложений и многие другие задачи. Zygote запускается с помощью небольшого приложения /system/bin/app_process, что очень хорошо видно на приведенном выше куске конфига. Задача app_proccess - запустить виртуальную машину Dalvik, код которой располагается в разделяемой библиотеке /system/lib/libandroid_runtime.so, а затем поверх нее запустить Zygote.

Когда все это будет сделано и Zygote получит управление, он начинает формирование среды исполнения Java-приложений с помощью загрузки всех Java-классов фреймворка (сейчас их более 2000). Затем он запускает system_server, включающий в себя большинство высокоуровневых (написанных на Java) системных сервисов, в том числе Window Manager, Status Bar, Package Manager и, что самое важное, Activity Manager, который в будущем будет ответственен за получение сигналов о старте и завершении приложений.

После этого Zygote открывает сокет /dev/socket/zygote и уходит в сон, ожидая данные. В это время запущенный ранее Activity Manager посылает широковещательный интент Intent.CATEGORY_HOME, чтобы найти приложение, отвечающее за формирование рабочего стола, и отдает его имя Zygote через сокет. Последний, в свою очередь, форкается и запускает приложение поверх виртуальной машины. Вуаля, у нас на экране появляется рабочий стол, найденный Activity Manager и запущенный Zygote, и статусная строка, запущенная system_server в рамках службы Status Bar. После тапа по иконке рабочий стол пошлет интент с именем этого приложения, его примет Activity Manager и передаст команду на старт приложения демону Zygote

INFO

В терминологии Linux RAM-диск - это своего рода виртуальный жесткий диск, существующий только в оперативной памяти. На раннем этапе загрузки ядро извлекает содержимое диска из образа и подключает его как корневую файловую систему (rootfs).

В процессе загрузки Android отображает три разных загрузочных экрана: первый появляется сразу после нажатия кнопки питания и прошит в ядро Linux, второй отображается на ранних этапах инициализации и записан в файл /initlogo.rle (сегодня почти не используется), последний запускается с помощью приложения bootanimation и содержится в файле /system/media/bootanimation.zip.

Кроме стандартных триггеров, init позволяет определять собственные триггеры, которые могут срабатывать от самых разных событий: подключения устройства к USB, изменения состояния смартфона или изменения состояния системных переменных.

Кроме всего прочего, Activity Manager также занимается убийством фоновых приложений при нехватке памяти. Значения порогов свободной памяти содержатся в файле /sys/module/lowmemorykiller/parameters/minfree.

Все это может выглядеть несколько непонятно, но самое главное - запомнить три простые вещи:

Во многом Android сильно отличается от других ОС, и с наскоку в нем не разобраться. Однако, если понять, как все работает, открываются просто безграничные возможности. В отличие от iOS и Windows Phone, операционка от гугла имеет очень гибкую архитектуру, которая позволяет серьезно менять ее поведение без необходимости писать код. В большинстве случаев достаточно подправить нужные конфиги и скрипты.

Предположим, что вам повезло и Дед Мороз положил под елку новомодный гаджет. Большой популярностью в последнее время пользуются смартфоны, букридеры и планшеты на Раскрыть потенциал такого подарка поможет начинающим владельцам "умных" устройств гид Вестей.Хайтек.

Что это? Android — это программа, при помощи которой вы управляете своим устройством. Ее история началась в 2005 году, когда Google купила одноименную компанию-разработчика и начала развивать платформу. В сентябре 2008-го была выпущена первая стабильная версия Android — 1.0 (под кодовым названием Apple Pie). За последующие четыре года вышло 14 "изданий" ОС. Релиз самой последней на сегодняшней день версии — 4.1/4.2 (Jelly Bean) — состоялся в июне 2012-го.

Android, которая получает поддержку от крупнейшей в мире поисковой системы, быстро стала самой популярной мобильной ОС в мире. Ее успеху во многом способствовала открытость исходного кода и политика Google, которая разрешает производителям бесплатно устанавливать Android на свою продукцию. "Робота" предпочитают такие крупные компании, как HTC, Samsung, Sony и Motorola.

— Если нужно срочно пополнить баланс телефона или Интернета, оплатить услуги ЖКХ, купить билет или просто перевести деньги. К вашим услугам — десятки приложений от крупных платежных систем и банков. В Google Play, например, есть "Яндекс.Деньги", Webmoney, QIWI, "Альфа-Банк", "Русский Стандарт", "ТКС Банк" или Home Credit Bank.

— Сориентироваться на местности или построить маршрут для поездки на автомобиле помогут

Разве это не здорово, когда научная фантастика становится научным фактом? Наверняка вы помните о крутом устройстве связи, которым обладал капитан Кирк из Стартрека, и я уверен, что вы даже желали быть обладателем этого чуда. Напомню, капитан Кирк и экипаж под названием «Энтерпрайз» могли общаться на расстоянии с помощью этих устройств персональной связи.
Теперь, когда мы живём в эпоху электроники и всего умного, в 21 веке, наши «коммуникаторы» кладут на лопатки устройства из Стартрека. Мы не только можем говорить друг с другом посредством нынешних смартфонов, но и читать сообщения, слушать музыкальный контент, играть в крутые трёхмерные игры, работать с документами, фотографировать, проверять электронную почту, находить рестораны, работать в Интернете, смотреть кино - всё это в одном устройстве. Залезешь под кат - узнаешь всё самое интересное!

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

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

  • Управление персональной информацией, включая заметки, календарь и списки дел
  • Передача медиаконтента посредством беспроводных интерфейсов Wi-Fi, Bluetooth, NFC
  • Связь с ноутбуком и персональными компьютерами
  • Синхронизация данных с приложениями
  • Многофункциональные приложения: статистика работы процессорных ядер, подробный прогноз погоды, чтение актуальных новостей, переводчики, электронная почта, мессенджеры, видеоигры наконец
  • Сканирование документов, QR-кодов и штрих-кодов
  • Замена кошелька. Смартфон может хранить информацию о кредитных картах
  • Оплата счетов и услуг. Такие приложения, как WebMoney, PayPal или CardStar помогут вам
  • Создание сети Wi-Fi, которую смогут использовать одновременно несколько устройств. Это означает, что вы можете получить доступ ко всемирной паутине с планшета iPad или ноутбука без использования маршрутизатора или другого периферийного устройства
Хотя сотовые телефоны и имеют общие черты с портативными компьютерами, пейджерами и другими устройствами, они имеют ряд особенностей, которые делают их развитие должным образом уникальным.
  • Когда вы делаете звонок по мобильному телефону, вы хотите в то же время иметь доступ к другим функциям (вроде адресной книги или календаря)
  • Сотовые телефоны должны быть «всегда на» как стандартный стационарный телефон, но достаточно эффективными, чтобы работать в автономном режиме столько, сколько это возможно
  • Они должны быть максимально функциональными
  • В то время как компьютер имеет вполне стандартные методы ввода данных - почти все они оснащаются клавиатурами и мышами - телефон может иметь цифровую клавиатуру, модифицированную раскладку клавиатуры, сенсорный экран или некоторые комбинации перечисленного
Сегодня каждый человек имеет смартфон, ну или по крайней мере мечтает о нём. На самом же деле, по оценкам насчиталось порядка 1.4 миллиарда используемых смартфонов в мире по состоянию на декабрь 2013 года. Люди постоянно используют их во многих сферах жизнедеятельности: звонки, фотографии, серфинг в Интернете и множество других вещей, включая покупки автомобилей - капитан Кирк будет ревновать.

По своей сути, смартфоны и все сотовые телефоны в этом отношении являются мини-радио, так как передают и принимают радиосигналы. Сотовые сети делятся на конкретные области, называемые клетками. Каждая ячейка имеет антенну, которая принимает сигналы сотового телефона. Антенна передает сигналы так же, как радиостанции, и ваш телефон подхватывает эти сигналы так же, как это делает радио.

Смартфоны используют сетевую технологию для отправки и получения данных (телефонные звонки, просмотр веб-страниц, передача файлов). Разработчики классифицируют эту технологию в поколениях. Вы помните первое поколение? Она включала в себя аналоговые технологии мобильного телефона. Однако, как сотовые технологии прогрессировали, протоколы стали более совершенными. В 2014 году сотовые телефоны находятся в мире четвёртого поколения сетей или 4G. В настоящее время многие производители оснащают смартфоны поддержкой сетей четвёртого поколения, но есть и такие компании, как Samsung, например, которые разрабатывают пятое поколение, то есть 5G, которая, если недавние испытания верны, позволит вам скачать весь фильм менее чем за секунду.

Аппаратное и программное обеспечения

Большинство смартфонов работает благодаря процессорам (как работает процессор читайте в статье " ". Наряду с процессорами смартфоны имеют компьютерные чипы, которые обеспечивают им функциональность. Телефоны с камерами имеют датчики изображения с высоким разрешением, как и цифровые камеры. Другие микросхемы поддерживают более сложные функции, такие как работа в Интернете, обмен мультимедийными файлами или воспроизведение музыки, не значительно сажая при этом аккумулятор устройства. Некоторые производители разрабатывают чипы, объединяющие сразу несколько функций, чтобы помочь снизить общую стоимость.

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

  • Ядро - система управления процессами и драйверами аппаратных средств
  • Промежуточное программное обеспечение - библиотеки программного обеспечения, которые позволяют смартфону обзаводиться приложениями (безопасность, веб-браузер, передача сообщений)
  • Среда исполнения приложений (Application Execution Environment, AEE) - интерфейсы прикладного программирования, которые позволяют разработчикам создавать свои собственные программы
  • Структура пользовательского интерфейса (Framework UI) - графика и макеты, отображаемые на экране
  • Пакет приложений - основные приложения для доступа к повседневным задачам, будь то открытие меню, календарь, сообщения, почтовый ящик, калькулятор и другие

Операционные системы

Наиболее важным программным обеспечением в любом смартфоне является его операционная система (ОС). Операционная система управляет аппаратными и программными ресурсами смартфонов. Некоторые платформы охватывают вес спектр программного стека. Другие же могут включать более низкие уровни (как правило, ядро и слои промежуточного программного обеспечения) и полагаются на дополнительные программные платформы, чтобы служить основой пользовательского интерфейса. Далее я расскажу о самых популярных операционных системах. Сразу отмечу: я не стану писать о том, что все и так без меня прекрасно знают, но парочку предложений таки напишу.

Android . Предназначена в первую очередь для сенсорных мобильных устройств. Разработана компанией Google, изначально была создана компанией Android Inc. Большинство людей считают операционную систему Android революционной технологией, потому что она имеет открытый исходный код и позволяет писать людям программные коды и приложения, что означает зелёный робот постоянно развивается. Операционная система Android может работать сразу с несколькими приложениями - это многозадачность. В настоящее время магазин приложений, используемый в Android и называемый Google Play, насчитывает более миллиона различных приложений.

iOS . Компания Apple, как снова же многие считают, всегда была революционной и создавала соответствующие продукты - простые и логичные. Рекламируемая производителем как самая передовая мобильная операционная система, iOS поддерживает большое количество функций. По состоянию на момент публикации данной статьи, iOS 7 способна автоматически обновлять приложения и обзавелась подобным главному конкуренту в лице зелёного робота центром управления, который даёт пользователям доступ к наиболее часто используемым функциям. Плоский, минималистичный и яркий дизайн новой версии операционной системы от Apple многие обругали, но свыклись.

Windows Phone . Рецензенты говорят, что данная операционная система так же проста в плане использования, как и Android. Её главным достижением являются живые тайлы, которые запрограммированы как плитки разных размеров. С помощью них пользователь может легко получать доступ к нужной и актуальной информации. Windows Phone 8 хорошо работает в связке с другими продуктами Microsoft, в том числе и такие приложения, как Office и Exchange. Для тех, кто много звонит, постоянно зависает в социальных сетях и использует текстовые сообщения, детище софтверного тек-гиганта из Редмонда удовлетворит данные потребности.

Ubuntu Touch . На первый взгляд, по мнению экспертов, Ubuntu Touch может показаться обычной операционной системой, но это не так. Эксперты говорят, что Ubuntu Touch - одна из самых простых операционных систем для использования. Она не использует аппаратные кнопки навигации, потому как основана на жестах подобно другому продукту - Sailfish OS. Разработанная компанией Canonical, Ubuntu Touch позволяет пользователям разблокировать смартфон простым жестом. Вы можете провести пальцев вниз от верхнего края, чтобы получить доступ к основной информации - дате, времени, сообщениям (из различных приложений: Skype и Facebook) и беспроводным сетям. Кроме того, обладатели смартфонов под управлением данной ОС смогут без проблем обмениваться фотографиями. Каждая сделанная фотография автоматически загружается в личное облако, что делает её доступной на всех устройствах, в том числе и под управлением iOS, Android и Windows Phone.

Гибкие интерфейсы

Основная ассоциация со смартфонами - многофункциональность. Смартфоны, как правило, способны делать одновременно несколько задач - с помощью многозадачности, да. Пользователь может смотреть фильм, позвонить другу, а затем вернуться к просмотру - всё это без закрытия каждого из используемых приложений. Или он или она может пролистывать цифровой календарь и список дел, не прерывая голосовой вызов. Все данные, хранящиеся на устройстве, можно синхронизировать с внешними приложениями или манипулировать ими с помощью сторонних приложений во многих отношениях. Вот несколько интерфейсов, которые поддерживают сегодняшние смартфоны.

Bluetooth
Эта функция, использующая беспроводные сети, обеспечивает обмен информацией между различными мобильными устройствами. Главная задача синего зуба - передача данных без помощи проводов и обеспечение экономичной и дешёвой радиосвязи. Среди поддерживающих данную технологию устройств стоит отметить следующие: принтеры, сканеры, устройства ввода, компьютеры и гарнитуры. Некоторые версии Bluetooth позволяют только связать одно устройство за раз, а другие способны связать одновременно несколько устройств. Чтобы узнать больше, ознакомьтесь с соответствующей из колонки «Как это работает».

Синхронизация данных
Телефон, который отслеживает вашу личную информацию: встречи, списки дел, адреса и номера телефонов, должен быть в состоянии общаться со всеми устройствами, которые вы используете, чтобы отслеживать всё вышеперечисленное. Существуют сотни возможных платформ и приложений, которые могут использовать всё это постоянно. Если вы хотите сохранить все эти данные, они должны синхронизироваться на вашем устройстве.

Open Mobile Alliance (OMA) является совместной организацией с одной миссией. Они сформировали рабочую группу синхронизации данных, которая продолжает свою работу, начатую в рамках инициативы SyncML. SyncML - проект на открытых стандартах, направленный на ликвидацию неприятностей и заботясь о том, чтобы пользовательская информация и данные синхронизировались между собой и наоборот. Проект разработан таким образом, чтобы любой вид данных мог быть синхронизирован с любым применением аппаратных средств через любую сеть, при условии, что они все запрограммированы по стандартам OMA. Это включает в себя синхронизацию веб, Bluetooth, а также почтовых протоколов и TCP/IP сетей.

SyncML позволяет синхронизировать данные с телефона на устройство под управлением операционных систем Windows, Mac, Linux с помощью Bluetooth, инфракрасного порта (ИК-порт, IrDA), HTTP или с помощью кабеля USB. Если желаете получить дополнительную информацию, вам стоит посетить веб-сайт Open Mobile Alliance.

Java
Смартфон, который совместим с языком программирования Java позволяет пользователю загружать и запускать приложения Java и MIDlets. Мидлетс-приложения используют подмножество Java и специально запрограммированы для работы на беспроводных устройствах. Мидлетс включают в себя дополнения, игры, приложения и утилиты.

С тех пор миллионы разработчиков Java во всём мире и инструменты разработки Java находятся в свободном и открытом доступе, благодаря чему пользователи смартфонов могут устанавливать тысячи сторонних приложений на свои устройства. Из-за того, как архитектура большинства мобильных операционных систем устроена, эти приложения могут получать доступ и использовать все данные, хранящиеся на мобильном устройстве пользователя.

Будущее смартфонов


С такими скоростями передачи данных, что можно скачать фильм за секунду, и нынешними технологиями, небо - это предел того, что смартфоны ещё могут сделать. Возможно, самой захватывающей вещью о технологиях смартфоностроения является то, что данная область всё ещё широко открытая. Это идея, которая, вероятно, не нашла своего идеального, реального мира реализации. Каждая новая волна смартфонов приносит с собой новые проекты и новые интерфейсные идеи. Никакой разработчик или производитель ещё не придумали идеальную прекрасную форму, размер или метод ввода. Следующий «киллер-смартфон» должен быть похожим на стандартный телефон, планшетный персональный компьютер, шоколадный батончик или ещё что-нибудь - то, чего ещё никто не придумал.

Пожалуй, самым сложным фактором для будущего является обеспечение безопасности. Смартфоны могут быть уязвимы к нарушениям безопасности. Например, атака под названием Evil Twin (Злой Близнец), в процессе которой хакер устанавливает сервисный идентификатор сервиса, создавая легитимную точку доступа или сеть и одновременно блокируя трафик на реальном сервере. Когда пользователь подключается к серверу хакера, информация может быть попросту перехвачена и безопасность данных будет находится под угрозой. С другой же стороны, некоторые критики утверждают, что производители антивирусного программного обеспечения значительно преувеличивают риски, вред и объём телефонных вирусов, чтобы помочь таким образом самим же себе в продаже фирменных продуктов.

Невероятное разнообразие в смартфоне аппаратных, программных и сетевых протоколов ингибируют практические, широкие меры безопасности. Большинство соображений безопасности или сосредотачивается на особых операционных системах или больше имеет отношение к пользовательскому поведению, чем сетевая безопасность. На сегодня всё, дамы и господа. Надеюсь, вам было дичайше интересно и вы узнали много нового.