Процесс загрузки ос android

Что такое Bootloader на Android

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

Содержание:

Bootloader: что это?

Начнем, так сказать, с азов. Bootloader Android — систем практически ничем не отличается от того, что имеется на любом компьютерном терминале, будь то PC или Mac. Говоря простым языком, Bootloader – это встроенное средство загрузки операционной системы.

Если привести в пример компьютерные терминалы с несколькими установленными «операционками» (скажем, Windows и Linux), загрузчик после включения стационарного блока или ноутбука предлагает юзеру вход в систему на выбор, а после подтверждения загружает ту или иную ОС.

Принципы загрузки ОС

Равно как и в стационарных системах, загрузчик Bootloader в мобильных девайсах обращается к инициализационным файлам по типу того, как это делает, например, Windows при загрузке параметров из файла boot.ini.

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

Bootloader: как разблокировать и зачем это нужно?

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

Считается, что в таком случае пользователь получает доступ к ядру системы, который по умолчанию невозможен. Как в такой ситуации описать Bootloader? Что это, станет понятно, если взглянуть на отсутствие так называемых прав суперюзера . Получается, что после снятия блокировки они вообще не нужны ни на каком уровне. А то ведь зачастую приходится устанавливать специальные прошивки и приложения. Если же кастомная прошивка , мягко говоря, «корявая», то и вся система может слететь.

Любой производитель мобильной техники предусматривает работу с таким компонентом, как Bootloader. Как разблокировать его? Обычно это делается при помощи специальных утилит, устанавливаемых на ПК при соединении с мобильным девайсом через USB-интерфейс. Заметьте, права суперпользователя в данном случае не требуются.

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

Как разблокировать Bootloader более подробно

Восстановление данных

С другой стороны, в своем стандартном режиме работы восстановление Bootloader после сброса настроек до заводских позволяет совершить просто элементарно. Для этого не потребуется даже hard reset .

Достаточно просто скинуть настройки на самом гаджете, а после перезагрузки система предложит выбрать вариант: либо использовать на устройстве новые настройки, либо восстановить параметры, программы и файлы, применяя для этого учетную запись сервисов Google. При этом придется ввести адрес почты Gmail с паролем, а также подключиться к сети Интернет, например, при имеющемся активном Wi-Fi-соединении.

Установка другой «операционки»

Если говорить о возможности инсталляции другой ОС, этот вопрос достаточно сложен, хотя и решаем. Дело в том, что некоторые производители утверждают, мол, что после «Андроида» на гаджет другая система не станет. Чистой воды рекламный ход, призванный разрекламировать инсталлированную систему.

А ведь китайцы на своих «левых» аппаратах HTC уже доказали, что на одном девайсе совершенно элементарно уживаются и Android, и Windows Phone. При этом такие модели поставляются в большинстве случаев с уже разблокированным загрузчиком Bootloader. Что это в данном случае? Это средство, позволяющее не только выбирать загружаемую ОС, но и устанавливать любую другую с изменением параметров на системном уровне.

Иными словами, пользователь может обойтись даже без каких бы то ни было прошивок или дополнительных программ для оптимизации работы установленной «операционки». Более того! Для этого не потребуются даже специализированные утилиты вроде оптимизаторов, которых сегодня развелось столько, что пользователь сам не понимает, что же выбрать из всего этого огромного количества программ и приложений.

На что стоит обратить внимание отдельно?

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

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

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

Напоследок остается добавить, что вопрос установки другой ОС на Android-девайс – тоже, в общем-то, достаточно спорный. Да, конечно, система встанет, что бы там производитель ни заявлял. Но вот как она будет работать – это уже другой вопрос, тем более что большинство юзеров обычно ставят какие-то облегченные версии, имеющие неизвестный источник происхождения. А зря. Тут, как говорится, таких дров наломать можно, что потом греха не оберешься. Да и сам производитель при таких изменениях по действующим международным нормам никакой ответственности за корректную работу мобильного девайса не несет. Поэтому решение о целесообразности и должен принимать сам обладатель гаджета. Но лучше с такими вещами не шутить.

Читайте также:  All about android hacking

Источник

Русские Блоги

Интерпретация ядра Android-процесс загрузки системы Android

предисловие

Когда вы долго нажимаете кнопку питания на мобильном телефоне, телефон Android загружается, так как происходит процесс загрузки системы Android? В этой статье будет представлен этот процесс. Проще говоря, процесс загрузки системы Android примерно такой: во-первых, система linux запустит программу linux, называемую zygote (ее можно назвать оплодотворенной яйцеклеткой, мать), эта программа на самом деле является ядром системы Android, когда запускается zygote. Установит сокет-сервер и загрузит большое количество классов и ресурсов. Затем zygote инкубирует первый процесс dalvik SystemServer, в SystemServer будет создан клиент сокета, а последующий AMS (ActivityManagerService) будет связываться с zygote через этого клиента, а zygote будет инкубировать новый процесс dalvik в соответствии с запросом и запускать новый. АПК также закрывает сокет подключения нового процесса. После инициализации SystemServer он запустит действие, расположенное в верхней части квилта.Так как только что была включена система, в квилте задачи нет активности, поэтому он отправит неявное намерение (категория: CATEGORY_HOME), которое является средством запуска, то есть системой Android. Настольная программа, после запуска средства запуска, мы можем запускать различные приложения через рабочий стол, мы можем обнаружить, что может быть несколько средств запуска, если сторонним приложениям нужно только добавить фильтр намерений, требуемый средством запуска. Следующее анализирует каждый процесс один за другим. (Примечание: этот анализ основан на исходном коде Android 4.3)

процесс запуска zygote

zygote — это программа для Linux, соответствующий исполняемый файл находится в / system / bin / app_process, который определен в /init.rc следующим образом

service zygote /system/bin/app_process -Xzygote /system/bin —zygote —start-system-server
class main
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 создает потоковый сокет (то есть с использованием протокола TCP) и прослушивает порт 660, а когда zygote перезапускается, ему нужно включить питание и перезапустить службы Media и netd. Давайте посмотрим на исходный код zygote, путь которого находится в frameworks \ base \ cmds \ app_process \ app_main.cpp:

Описание: Этот код runtime.start («com.android.internal.os.ZygoteInit», startSystemServer? «Start-system-server»: «») реализован в AndroidRuntime, который в конечном итоге вызовет основной метод ZygoteInit, см. env-> CallStaticVoidMethod (startClass, startMeth, strArray); здесь startClass — это com.android.internal.os.ZygoteInit, а startMeth — main, поэтому мы напрямую смотрим на основной метод ZygoteInit, путь кода: frameworks \ base \ core \ Java \ COM \ Android \ внутренний \ OS \ ZygoteInit.java:

Давайте посмотрим на метод runSelectLoop, чтобы увидеть, как он разветвляется на новый процесс:

Далее нам также нужно взглянуть на метод runOnce ZygoteConnection, чтобы увидеть, как генерируется процесс dalvik. Мы знаем, что каждый apk запускается в отдельном процессе dalvik, поэтому при запуске apk zygote будет выводиться Новый процесс, запустите этот apk в этом процессе. В ZygoteConnection новый процесс генерируется статическим методом forkAndSpecialize из Zygote:

pid = Zygote.forkAndSpecialize(parsedArgs.uid, parsedArgs.gid, parsedArgs.gids,
parsedArgs.debugFlags, rlimits, parsedArgs.mountExternal, parsedArgs.seInfo, parsedArgs.niceName);

Нам не нужно смотреть на специфику, новый процесс должен быть сгенерирован внутри с помощью функции fork () системы Linux. Когда генерируется новый процесс dalvik, вам нужно выполнить некоторую очистку. Поскольку новый процесс разветвляется программой zygote, дочерний процесс имеет копию zygote. Мы знаем, что zygote создал сокет при запуске. На этом сервере может быть только один сервер. Не должно быть дочерних процессов, заштрихованных zygote, поэтому после того, как дочерний процесс заштрихован, скопированный сервер сокетов также должен быть закрыт. Эти операции выполняются в методе handleChildProc:

В то же время некоторые классы и ресурсы будут предварительно загружены в ZygoteInit. Конкретный код находится в методе предварительной загрузки:

static void preload() <
preloadClasses();
preloadResources();
>

Создание SystemServer

SystemServer — это первый процесс dalvik, инкубированный с помощью zygote. Процесс инкубации был описан выше, но он немного отличается от обычного процесса. Обычный процесс запускается Zygote.forkAndSpecialize, а SystemServer запускается Zygote.forkSystemServer. Во-вторых, сокет-клиент создается внутри SystemServer. Что касается локального клиента сокета внутри SystemServer, как упоминалось ранее в этой статье, периферийные службы взаимодействуют с Zygote через SystemServer. Например, чтобы запустить apk, сначала AMS инициирует новый запрос на создание процесса, который будет вызываться в методе startProcessLocked. Метод запуска Process будет внутренне вызывать метод startViaZygote, а внутри startViaZygote будет создан локальный сокет и связь zygote. Мы должны знать, что AMS создается в процессе SystemServer, поэтому говорят, что он создает локальный сокет и связь zygote в SystemServer. Имеет смысл. Очень важная роль SystemServer заключается в создании различных сервисов, включая общий WindowManagerService, AlarmManagerService, ActivityManagerService и т. Д., А затем различные менеджеры верхнего уровня взаимодействуют через связыватель и службу. О процессе создания различными службами SystemServer и взаимодействия со связывателем Пожалуйста, обратитесь к разделу блога, который я написал ранее, и я не буду повторять его здесь:Переписка между различными службами Manager и Binder。

Запуск системного рабочего стола

Наконец, посмотрите, как настроен рабочий стол:

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

Читайте также:  Телевизор novex пульт андроид

Источник

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

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

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

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

Android — свободный и открытый проект. Большинство исходного кода (который можно найти на https://source.android.com) распространяется под свободной лицензией 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), а собственная минималистичная реализация под названием bionic, оптимизированная для встраиваемых (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:

Из других знакомых компонентов в 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 — в том, что приложения не контролируют напрямую процесс, в котором они запущены. Давайте поговорим об этом подробнее.

Читайте также:  Android studio закомментировать блок кода

Основная единица в 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 данных, реализована в библиотеке libbinder.

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

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

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

Stub работает наоборот: он принимает входящие вызовы через libbinder, десериализует аргументы, вызывает абстрактную реализацию метода, сериализует возвращаемое значение и передаёт его процессу-клиенту. Соответственно, для реализации сервиса программисту достаточно реализовать абстрактные методы в унаследованном от Stub классе.

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

Для того, чтобы разные процессы могли «найти» сервисы друг друга, в Android есть специальный сервис ServiceManager, который хранит, регистрирует и выдаёт токены всех остальных сервисов.

Binder широко используется в Android для реализации системных сервисов (например, пакетного менеджера и буфера обмена), но детали этого скрыты от разработчика приложений высокоуровневыми классами в Android Framework, такими как Activity, Intent и Context. Приложения могут также использовать Binder для предоставления друг другу собственных сервисов — например, приложение Google Play Services вообще не имеет собственного графического интерфейса для пользователя, но предоставляет разработчикам других приложений возможность пользоваться сервисами Google Play.

Подробнее про Binder можно узнать по этим ссылкам:

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

Источник

Оцените статью