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

Внутреннее устройство систем Android

Тема в разделе "Android", создана пользователем Кирилл, 5 июн 2014.

?

Необходимо ли нам изучать Android ?

  1. Да

    18 голосов
    75,0%
  2. Нет

    1 голосов
    4,2%
  3. Не знаю

    0 голосов
    0,0%
  4. Возможно...

    5 голосов
    20,8%
  1. Кирилл

    Кирилл Команда форума Администратор

    Сообщения:
    13.131
    Симпатии:
    5.532
    Привет!
    Так как раздела по мобильным системам у нас пока что не имеется,то я решил сделать несколько вводных публикаций здесь,так как понимание общего устройства систем android первый шаг в безопасный путь)

    А в будущем мы ,конечно же,будем и твикать свой андройды,и улучшать и просто изучать.

    Итак:


    Android изнутри или просто о сложном

    Введение
    Общаясь на форумах и являясь куратором нескольких тем, часто сталкиваюсь с полным непониманием новичков об устройстве андроида. «Ну, а зачем обычному пользователю знать это?» — скажете вы. И тут я с вами соглашусь, задав встречный вопрос: «А зачем тогда обычный пользователь лезет в дебри прошивок, root доступа и твиков системы, не понимая в этом ничего?». Именно это и натолкнуло меня на написание данной статьи, в которой я попытаюсь, обычным и понятным языком, донести сложные вещи.

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

    [​IMG]

    Содержание:
    1. Разделы внутренней памяти.
    2. Bootloader, recovery, adbи fastboot
    3. Внутренности системы.
    4. Root.

    1. Разделы внутренней памяти
    Внутренняя память устройства на андроиде разбита на несколько логических дисков (разделов).

    Приведу только основные:

    [​IMG]

    Рис.1


    Bootloader – здесь находится микропрограмма (загрузчик), позволяющая запускать операционную систему, рекавери и другие сервисные режимы.

    Recovery – как видно из названия, тут установлено инженерное меню восстановления или просто Рекавери.

    Boot – сердце Андроид ОС, тут находится ядро, драйвера и настройки управления процессором и памятью.

    System – системный раздел, в котором находятся все, необходимые для работы Android ОС, файлы, это как папка Windows на вашем диске С:\ (здесь и далее буду проводить ассоциацию с ОС Windows)

    Data – раздел для установки приложений и хранения их данных. (Programfiles)

    User – это всем известная sdcard или, проще говоря, место под пользовательские файлы (Мои документы).Здесь я вынужден сделать отступление, т.к. размещение данного раздела имеет несколько вариантов:

    • Раздел отсутствует во внутренней памяти, а вместо него используется внешний накопитель — самый популярный вариант. (рис.1)
    • В устройствах со встроенной памятью большого размера, данный раздел видится как sdcard, а внешняя карта памяти видится как sdcard2 или extsd(могут быть и другие варианты названия). Обычно, встречается на устройствах с Android 3.2. (Рис.2 Вариант 1)
    • Данный вариант пришел на смену предыдущему варианту, вместе с Андроид 4.0. Раздел Userзаменили папкой mediaна разделе Data, что позволило использовать всю доступную пользователю память для установки программ и хранения данных, а не то количество, что выделил нам производитель. Иными словами sdcardи dataявляются одним целым. (Рис.2 Вариант 2)
    [​IMG]


    Рис.2

    2. Bootloader, Recovery, adb и fastboot

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

    Начнем с Bootloader. Это загрузчик, который запускает Андроид, рекавери и т.п. Когда мы нажимаем кнопку включения, запускается загрузчик и, если нет дополнительных команд (зажатых клавиш), запускает загрузкуboot. Если же была зажата комбинация клавиш (у каждого устройства она своя) то запускает, в зависимости от команды, recovery, fastboot или apx. На рисунке ниже наглядно показано, что запускает Bootloader и как взаимосвязаны разделы.

    [​IMG]

    Рис.3

    Как видно из рисунка №3, раздел Recovery не влияет на загрузку Андроид ОС, но зачем же он тогда нужен? Давайте попробуем разобраться.

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

    Особо внимательные читатели могли заметить на Рис.3 некий Fastboot. Это интерфейс для работы напрямую с разделами внутренней памяти, при помощи командной строки. Через него можно прошить рекавери, ядро или новую версию прошивки, или же форматировать (удалить всю информацию) тот или иной раздел.

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

    3. Внутренности системы
    Разобравшись с теорией, давайте запустим Андроид ОС.

    Нажимаем кнопку питания — запускается Bootloader, который загружает Ядро (boot), оно, в свою очередь, запускает систему (System), ну, а она уже подгружает программы (data) и пользовательское пространство (user). (Рис.3)

    А теперь перейдем в корневой каталог и посмотрим на внутренности самой Android OS:

    [​IMG]

    (Рис.4)

    В этой схеме я привел, только необходимые для ознакомления, директории. На самом деле их гораздо больше и на обзор только одной папки Systemпонадобится целая статья.

    И так, папка data. Как можно догадаться из названия, она как-то связана с данными, но с какими? Да практически со всеми, это и данные о синхронизации и аккаунтах, пароли к точкам доступа wifi и настройки vpn, и так далее. Среди всего прочего тут можно обнаружить папки app, data и dalvik-cache– рассмотрим их назначение:

    • app– сюда устанавливаются программы и игры.
    • data– здесь хранятся данные приложений, их настройки, сэйвы игр и прочая информация.
    • dalvik-cache- программная область кэш-памяти для программы Dalvik. Dalvik это Java-виртуальная машина, которая является основой для работы программ, имеющих *.apk расширение. Для того, чтобы сделать запуск программ быстрее — создается их кэш.
    Папка System хранит в себе системные данные и все необходимое для работы ОС. Давайте рассмотрим некоторые из этих папок:

    • app– здесь находятся системные приложения (смс, телефон, календарь, настройки и т.п.), а так же приложения установленные производителем устройства (фирменные виджеты, живые обои и т.д.).
    • fonts– системные шрифты
    • media– содержит стандартные мелодии звонков, уведомлений, будильников и звуков интерфейса, а так же загрузочную анимацию (bootanimation)
    • build.prop– Этот файл упоминается, чуть ли не первым, в разговорах и статьях о тонкой настройке системы. В нем содержится огромное количество настроек, таких как плотность экрана, время задержки сенсора приближения, управление wifi, имя и производитель устройства и многие другие параметры.
    4. Root

    Знать что в какой папке это хорошо, но можно ли что-то с этим сделать?

    - Да! Но нужны права суперпользователя (root) или, если проводить аналогию с Windows, права Администратора. Изначально все устройства на Андроид идут без root прав для конечного пользователя, т.е. покупая девайс, мы не являемся в нем полноценными хозяевами. Это сделано как для защиты от вредоносных программ, так и от самого пользователя – ведь, в неумелых руках, полный доступ к системе может привести к «смерти» операционной системы и последующей необходимости в перепрошивке устройства.

    «Ну и в чем польза такой опасной штуки?» — спросите Вы.

    Сейчас расскажу:

    • Возможность делать резервные копии данных и восстанавливать их после прошивки или случайного удаления.
    • Тонкая настройка системы вручную или при помощи специальных программ.
    • Удаление системных приложений, мелодий, обоев и т.п.
    • Изменение внешнего вида ОС (например, отображение заряда батареи в процентах)
    • Добавление функционала (поддержка ad-hocсетей, к примеру)
    Данный список можно продолжать еще долго, но, думаю, данных примеров будет достаточно для представления о возможностях и широте применения root привилегий.

    - Это все здорово, но теперь любая программа сможет получить доступ к «сердцу» операционки и моим данным?

    - Нет. Вы сами решаете разрешить, тому или иному приложению, получить root доступ, или нет. Для этого существует программа Superuser или ее продвинутая сестра SuperSU. Без этой или подобной программы воспользоваться root не возможно.

    Эпилог

    Как видите, Андроид не такая уж и сложная штука. Надеюсь, после прочтения статьи, вы узнали что-то новое или получили ответ на давно интересовавший вопрос.

    Засим откланиваюсь, до встречи в комментариях. [​IMG]

     
    E100, OLENA777, -SEM- и 12 другим нравится это.
  2. Константиныч

    Константиныч Пользователь

    Сообщения:
    2
    Симпатии:
    12
    Даааа уж, совсем не сложная, чуть крыша не поехала)))) Ни чего не понял:Wacko::Blush2:
     
  3. cybercop

    cybercop Ассоциация VN

    Сообщения:
    314
    Симпатии:
    479
    Спасибо огромное
     
  4. ScriptMakeR

    ScriptMakeR Клуб переводчиков

    Сообщения:
    1.447
    Симпатии:
    509
    Весьма интересная интерпритация ознакомительной информации с OS Android. Только есть одно НО. Не стоит проводить аналогию с OS Windows, это только путает пользователей. OS Android изначально построена на OS Linux. Если иметь хотя бы базовые понятия об OS Linux, то и OS Android не покажется столь уж запутанной и непонятной.
     
    tzrb нравится это.
  5. Кирилл

    Кирилл Команда форума Администратор

    Сообщения:
    13.131
    Симпатии:
    5.532
    ScriptMakeR, ну так поделитесь с пользователями знаниями?:Acute:
     
  6. ScriptMakeR

    ScriptMakeR Клуб переводчиков

    Сообщения:
    1.447
    Симпатии:
    509
    Дык чем тут делиться то?
    Особыми познаниями я не владею, так, на уровне уверенного пользователя. Root, прошивка, некоторые твики и т.д.
    Мой прошлый пост был к тому, что изначально файловая система робота не такая, как в форточках. Лично мне для ее понимания помогло то, что одно время я пользовался OS Ubuntu. На русскоязычном сайте Ubuntu есть очень хорошая подборка статей. Проще начать понимать по аналогии с давно известным компьютером, в чем разница между форточками и линуксом, потом останется только освоится с особенностями самого робота.
    Писать мануалы на ровном месте я не умею, я практик, а не теоретик. А копипастить с другого сайта мне совесть не позволяет. Если правила форума позволяют, могу дать полезные ссылки на сторонних ресурсах. Либо могу по возможности ответить на интересующие вопросы.
    Вся прелесть андройда в его многообразии, нет однообразия яблока (да простят меня фанаты IOS). Одна и та же проблема на разных устройствах может решаться поразному, но простор для решения различных вопросов огромен.
    Андройд - ось для любителей ковырять, изучать, разбираться и править, обычному пользователю лучше просто поставить антивирус и пользоваться своим телефоном/планшетом, не устраивает - милости просим к яблоку.
    Что-то я увлекся.
    Лучше уж так. Будут вопросы - спрашивайте, чем смогу, тем помогу. Нужны будут инструкции - аналогично. Иначе меня унесет в полимику и разглагольствования.
     
  7. ScriptMakeR

    ScriptMakeR Клуб переводчиков

    Сообщения:
    1.447
    Симпатии:
    509
    Я так понял, ссылки на сторонние ресурсы тут не возбраняются.
    Вот Вам ссылка Файловая система Ubuntu
    Там подробно описана особенность файловой системы Linux, на которой основана OS Android. В сранении с компьютером проще понять особенность, чем сразу сравнивать привычную файловую систему с файловой системой робота.
    Основная особенность заключается в отсутствии привычных дисков, флешек и т.д. В андройде их просто искуственно выделили для удобства непривычных к этому пользователей. Тут все решает точка монтирования, причем оно может быть многократным, вложенным и самовложенным. В этом отношении наблюдается паразительная гибкость, в отличии от форточек.
     
    Последнее редактирование: 25 окт 2014
  8. Alien

    Alien Студенты 1 курс

    Сообщения:
    260
    Симпатии:
    12
    Получается Boot это как system32 ?
     
  9. ScriptMakeR

    ScriptMakeR Клуб переводчиков

    Сообщения:
    1.447
    Симпатии:
    509
    Alien,
    Нет. Я уже писал, что строить аналогии Android с Windows нельзя. Там совсем другая система.
    Щас попробую (да прощу я сам себя за копипасту) одну старую статью сюда закинуть.
     
  10. ScriptMakeR

    ScriptMakeR Клуб переводчиков

    Сообщения:
    1.447
    Симпатии:
    509
    Познавательно-практический экскурс в архитектуру Android.
    Тебя никогда не интересовало, как работают 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-памяти, так что для ее изменения перепрошивка загрузчика не нужна.

    loader-code.
    Часть кода загрузчика, определяющая таблицу разделов

    Особенно интересен раздел 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.

    ouya.
    Корневой раздел ТВ-приставки OUYA

    Шаг второй, альтернативный. Раздел 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 не исчезают после установки новой версии прошивки.

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

    Итак, получив управление, ядро подключает 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.
    Часть конфига init.rc из CyanogenMod

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

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

    fstab.
    Типичное содержимое файла fstab

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

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

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

    На определенном этапе загрузки init встретит в конце конфига примерно такой блок:
    Код (Text):
      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

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

    • Процесс запуска Android делится на две ключевые стадии: до Zygote и после. До старта Zygote система инициализирует низкоуровневые компоненты ОС. Это такие операции, как подключение (монтирование) файловых систем, запуск низкоуровневых служб (например rild, отвечающий за работу с GSM-модемом, SurfaceFlinger, управляющий тем, что изображено на экране, vold, управляющий подключенными файловыми системами). После запуска Zygote начинается инициализация исключительно Java-компонентов, которые составляют 80% операционной системы. Этим, в частности, пользуется известный фреймворк Xposed, который при установке подменяет app_process на собственную модифицированную версию, которая способна перехватывать вызовы любых Java-классов, подменяя их на любые другие. Именно поэтому у модулей Xposed такие широкие возможности по модификации внешнего вида и поведения Android. На самом деле они ничего не изменяют в системе, а просто заставляют ее использовать сторонние компоненты вместо своих.
    • Java-приложения никогда не запускаются «с нуля». Когда Zygote получает запрос на старт приложения от Activity Manager, он не запускает новую виртуальную машину, а просто форкается, то есть копирует самого себя и затем запускает поверх полученной копии виртуальной машины нужное приложение. Такой принцип работы позволяет, во-первых, свести расход памяти к минимуму, так как Linux при форке копирует память в режиме copy-on-write (новый процесс ссылается на память старого), а во-вторых, существенно ускорить запуск приложения: форк процесса происходит намного быстрее запуска новой виртуальной машины и загрузки нужных приложению Java-классов.
    • В Android повсеместно используются интенты. Для общения между собой компоненты Android никогда не применяют прямой вызов процедур и классов. Вместо этого используется система сообщений (интентов), которая, кроме высокого уровня безопасности, дает также множество других вкусностей, таких как, например, возможность вызвать приложение, ничего о нем не зная. Выше я уже писал, что для запуска рабочего стола системе достаточно послать интент Intent.CATEGORY_HOME, на который откликнется любое приложение, способное выполнять функцию лончера. Таким же образом работает кнопка «Поделиться», а также множество других компонентов системы.
    ps.
    Системные службы и потоки ядра

    Выводы

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

     
    orderman, E100 и Кирилл нравится это.
Загрузка...
Похожие темы - Внутреннее устройство систем
  1. Кирилл
    Ответов:
    9
    Просмотров:
    1.270
  2. cybercop
    Ответов:
    2
    Просмотров:
    1.208

Поделиться этой страницей

Поисковый запрос:

  1. устройство android