Что такое bootloader на андроид
Перейти к содержимому

Что такое bootloader на андроид

  • автор:

Что такое загрузчик в Android и как его разблокировать

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

Что такое загрузчик в Android

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

Почему загрузчик заблокирован

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

Bootloader устанавливается производителем смартфонов. В случае, если он заблокирован, он позволит запустить только авторизованную версию операционной системы с соответствующей электронной подписью.

Как разблокировать загрузчик

Загрузчик на Google Pixel

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

Иногда производители сами позволяют разблокировать загрузчик (а зачем тогда блокировали, спрашивается?). Например, Sony недавно опубликовала инструкцию, где настоятельно рекомендуют воспользоваться для этих целей специальной утилитой, которая возьмет всю черновую работу на себя. От владельца потребуется лишь IMEI и действующий адрес электронной почты. После того как программа проверит введенные данные, вам будет предоставлен уникальный код, введя который в специальном поле, устройство будет разблокировано.

А Huawei в прошлом году запретила разблокировку загрузчика фирменных устройств, чтобы… потом снова разрешить ее. Правда, обратиться за разблокировкой могут только активные участники сообщества разработчиков, представленные на площадке XDA.

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

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

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

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

Содержание:

Bootloader: что это?

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Reboot to Bootloader – что это такое Android

Доброго времени суток! Немногие пользователи операционной системы Андроид знают, что в их устройствах присутствует возможность перезагрузки с последующим входом в меню «Бутлоадер». Это очень полезный функционал, доступный не на всех аппаратах, но узнать о нём стоит. Reboot to Bootloader – что это такое Android, как пользоваться – узнаете из данной публикации.

Бутлоадер в Recovery

Назначение Бутлоадер

Если описать функционал вкратце, то это некое подобие BIOS на компьютере. То есть. Это своего рода промежуточное состояние, оболочка перед запуском полноценной версии системы. Предназначен для получения доступа к режиму восстановления с последующей загрузкой нормального режима работы ОС. Это бывает полезно, когда Андроид по каким-то причинам был заблокирован или слетела прошивка. Выполнив команду «Reboot to Bootloader» (RtB), Вы сможете попасть в меню, где будут доступны действия по обновлению ПО, снятию блокировки.

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

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

Стоит отметить, что опция «Reboot to Bootloader» доступна не для каждой модели, и внешний вид меню может существенно отличаться.

Варианты перезагрузки в программе Ребут меню

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

Наверно, Вы уже запутались в теории и хотели бы перейти к практической части. Сейчас всё будет!

Автор рекомендует:

Основы использования Reboot to bootloader

Что это значит – я рассказал выше. А теперь – важные рекомендации:

  • Все, что Вы делаете в Бутлоадер (главном загрузчике Андроид) – выполняйте на свой страх и риск. Я не несу никакой ответственности за проблемы, возникающие в процессе манипуляций. Вероятность выхода устройства из строя достаточно высока, если произвести некорректные операции;
  • Риск потери данных тоже немаленький. Желательно заблаговременно создавать резервные копии на сторонних носителях. Иначе можно при попытке разблокировать телефон с помощью RtB потерять важную информацию.

Запуск оболочки следует выполнять, когда смартфон выключен. Далее одновременно зажимаем и удерживаем две клавиши – Power (Питание, Вкл/Откл) и Громкость вниз. Для Самсунг кнопка управления звуком может быть заменена на Home.

Кнопки активации Recovery

Таким образом, мы оказываемся в меню Рекавери, откуда и переходим в RtB:

Reboot Bootloader в Recovery

Данный способ работает практически на любых моделях, независимо от производителя (вот только внешний вид может отличаться. На скриншоте выше – пример на HTC).

Есть и второй вариант. Если у Вас разблокирован режим разработчика (Developer Mode), то можно при включенном аппарате открыть «Расширенные настройки» — «Для разработчиков» и активировать «Заводскую разблокировку» (актуально для Android 5 и выше):

Разблокировка Android

Затем зажимаем кнопку питания, выбираем «Перезагрузку» и должны появится режимы, среди которых есть и Бутлоадер.

Обратите внимание, что в этой статье я не углублялся в особенности прошивки и продвинутого применения описываемого функционала. Дело в том, что каждая ситуация индивидуальна, и советовать что-то одно – это неправильный подход. Я поведал Reboot to Bootloader – что это такое Android, а если захотите узнать конкретно по своему смартфону (как, что делается), то рекомендую посетить самый авторитетный форум 4PDA.

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

Всем привет! Мы нашли время продолжить серию статей про внутреннее устройство Android. В этой статье я расскажу о процессе загрузки Android, о содержимом файловой системы, о том, как хранятся данные пользователя и приложений, о root-доступе, о переносимости сборок Android и о проблеме фрагментации.

Пакеты

Как я уже говорил раньше, архитектура Android построена вокруг приложений. Именно приложения играют ключевую роль в устройстве многих частей системы, именно для гармоничного взаимодействия приложений выстроена модель activity и intent’ов, именно на изоляции приложений основана модель безопасности Android. И если оркестрированием взаимодействия компонентов приложений занимается activity manager, то за установку, обновление и управление правами приложений отвечает package manager (пакетный менеджер — в shell его можно вызвать командой pm ).

Как подсказывает само название «пакетный менеджер», на этом уровне приложения часто называются пакетами. Пакеты распространяются в формате APK (Android package) — специальных zip-архивов. У каждого пакета есть имя (также известное как application ID), которое уникально идентифицирует это приложение (но не его конкретную версию — наоборот, имена разных версий пакета должны совпадать, иначе они будут считаться отдельными пакетами). Имена пакетов принято записывать в нотации обратного DNS-имени — например, приложение YouTube использует имя пакета com.google.android.youtube . Часто имя пакета совпадает с пространством имён, использующимся в его Java-коде, но Android этого не требует (к тому же, APK-файлы приложений обычно включают и сторонние библиотеки, пространство имён которых, естественно, не имеет вообще ничего общего с именами пакетов, которые их используют).

Каждый APK при сборке должен быть подписан разработчиком с использованием цифровой подписи. Android проверяет наличие этой подписи при установке приложения, а при обновлении уже установленного приложения дополнительно сравнивает публичные ключи, которыми подписаны старая и новая версия; они должны совпадать, что гарантирует, что новая версия была создана тем же разработчиком, что и старая. (Если бы этой проверки не было, злоумышленник мог бы создать пакет с таким же именем, как и у существующего приложения, убедить пользователя установить его, «обновляя» приложение, и получить доступ к данным этого приложения.)

Само обновление пакета представляет собой установку его новой версии вместо старой с сохранением данных и полученных от пользователя разрешений. Можно и «откатывать» (downgrade) приложения до более старых версий, но при этом по умолчанию Android стирает сохранённые новой версией данные, поскольку старая версия может быть не способна работать с форматами данных, которые использует новая версия.

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

Хотя обычно одному пакету соответствует один файл APK, Android поддерживает пакеты, состоящие из нескольких APK (это называется раздельными APK, или split APK). Это лежит в основе таких «магических» возможностей Android, как динамическая загрузка дополнительных модулей приложения (dynamic feature modules) и Instant Run в Android Studio (автоматическое обновление кода запущенного приложения без его полной переустановки и, во многих случаях, даже без перезапуска).

Файловая система

Устройство файловой системы — один из самых важных и интересных вопросов в архитектуре операционной системы, и устройство файловой системы в Android — не исключение.

Интерес представляет, во-первых, то, какие файловые системы используются, то есть в каком именно формате содержимое файлов сохраняется на условный диск (в случае Android это обычно flash-память и SD-карты) и как обеспечивается поддержка этого формата со стороны ядра системы. Ядро Linux, используемое в Android, в той или иной степени поддерживает большое количество самых разных файловых систем — от используемых в Windows FAT и NTFS и используемых в Darwin печально известной HFS+ и современной APFS — до сетевой 9pfs из Plan 9. Есть и много «родных» для Linux файловых систем — например, Btrfs и семейство ext.

Стандартом де-факто для Linux уже долгое время является ext4, используемая по умолчанию большинством популярных дистрибутивов Linux. Поэтому нет ничего неожиданного в том, что именно она и используется в Android. В некоторых сборках (и некоторыми энтузиастами) также используется F2FS (Flash-Friendly File System), оптимизированная специально для flash-памяти (впрочем, с её преимуществами всё не так однозначно).

Во-вторых, интерес представляет так называемый filesystem layout — расположение системных и пользовательских папок и файлов в файловой системе. Filesystem layout в «обычном Linux» заслуживает более подробного описания (которое можно найти, например, по этой ссылке); я упомяну здесь только несколько наиболее важных директорий:

  • /home хранит домашние папки пользователей; здесь же, в различных скрытых папках ( .var , .cache , .config и других), программы хранят свои настройки, данные и кэш, специфичные для пользователя,
  • /boot хранит ядро Linux и образ initramfs (специальной загрузочной файловой системы),
  • /usr (логичнее было бы назвать /system ) хранит основную часть собственно системы, в том числе библиотеки, исполняемые файлы, конфигурационные файлы, а также ресурсы — темы для интерфейса, значки, содержимое системного мануала и т.п.,
  • /etc (логичнее было бы назвать /config ) хранит общесистемные настройки,
  • /dev хранит файлы устройств и другие специальные файлы (например, сокет /dev/log ),
  • /var хранит изменяемые данные — логи, системный кэш, содержимое баз данных и т.п.

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

  • /data хранит изменяемые данные,
  • ядро и образ initramfs хранятся на отдельном разделе (partition) flash-памяти, который не монтируется в основную файловую систему,
  • /system соответствует /usr и хранит систему,
  • /vendor — аналог /system , предназначенный для файлов, специфичных для этой сборки Android, а не входящих в «стандартный» Android,
  • /dev , как и в «обычном Linux», хранит файлы устройств и другие специальные файлы.

Наиболее интересные из этих директорий — /data и /system . Содержимое /system описывает систему и содержит большинство составляющих её файлов. /system располагается на отдельном разделе flash-памяти, который по умолчанию монтируется в режиме read-only; обычно данные на нём изменяются только при обновлении системы. /data также располагается на отдельном разделе и описывает изменяемое состояние конкретного устройства, в том числе пользовательские настройки, установленные приложения и их данные, кэши и т.п. Очистка всех пользовательских данных, так называемый factory reset, при такой схеме заключается просто в очистке содержимого раздела data; нетронутая система остаётся установлена в разделе system.

Приложения — а именно, их APK, файлы odex (скомпилированный ahead-of-time Java-код) и ELF-библиотеки — устанавливаются в /system/app (для приложений, поставляемых с системой) или в /data/app (для установленных пользователем приложений). Каждому предустановленному приложению при создании сборки Android выделяется папка с именем вида /system/app/Terminal , а для устанавливаемых пользователем приложений при установке создаются папки, имена которых начинаются с их имени пакета. Например, приложение YouTube сохраняется в папку с названием вроде /data/app/com.google.android.youtube-bkJAtUtbTuzvAioW-LEStg==/ .

Суффикс в названии папок приложений — 16 случайных байт, закодированных в Base64. Использование такого суффикса не позволяет другим приложениям «угадать» путь к приложению, о существовании которого им знать не следует. В принципе, список установленных на устройстве приложений и путей к ним не является секретом — его можно получить через стандартные API — но в некоторых случаях (а именно, для Instant apps) на доступ к этим данным накладываются ограничения.

Этот суффикс служит и другой цели. Каждый раз при обновлении приложения новая APK устанавливается в папку с новым суффиксом, после чего старая папка удаляется. До версии 8.0 Oreo в этом и состояло назначение суффиксов, и вместо случайных байт поочерёдно использовались -1 и -2 (например, /data/app/com.google.android.youtube-2 для YouTube).

Полный путь к папке приложения в /system/app или /data/app можно получить с помощью стандартного API или команды pm path org.example.packagename , которая выводит пути всех APK-файлов приложения.

Поскольку предустановленные приложения хранятся в разделе system (содержимое которого, напомню, изменяется только при обновлении системы), их невозможно удалить (вместо этого Android предоставляет возможность их «отключить»). Тем не менее, поддерживается обновление предустановленных приложений — при этом для новой версии создаётся папка в /data/app , а поставляемая с системой версия остаётся в /system/app . В этом случае у пользователя появляется возможность «удалить обновления» такого приложения, вернувшись к версии из /system/app .

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

Для хранения изменяемых данных каждому приложению выделяется папка в /data/data (например, /data/data/com.google.android.youtube для YouTube). Доступ к этой папке есть только у самого приложения — то есть только у UID, под которым запускается это приложение (если приложение использует несколько UID, или несколько приложений используют общий UID, всё может быть сложнее). В этой папке приложения сохраняют настройки, кэш (в подпапках shared_prefs и cache соответственно) и любые другие нужные им данные:

Система знает о существовании папки cache и может очищать её самостоятельно при нехватке места. При удалении приложения вся папка этого приложения полностью удаляется, и приложение не оставляет за собой следов. Альтернативно, и то, и другое пользователь может явно сделать в настройках:

Это выделяемое каждому приложению хранилище данных называется внутренним хранилищем (internal storage).

Кроме того, в Android есть и другой тип хранилища — так называемое внешнее хранилище (external storage — это название отражает изначальную задумку о том, что внешнее хранилище должно было располагаться на вставляемой в телефон внешней SD-карте). По сути, внешнее хранилище играет роль домашней папки пользователя — именно там располагаются такие папки, как Documents, Download, Music и Pictures, именно внешнее хранилище открывают файловые менеджеры в качестве папки по умолчанию, именно к содержимому внешнего хранилища Android позволяет получить доступ компьютеру при подключении по кабелю.

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

Многие приложения предпочитают сохранять и некоторые из своих внутренних файлов, имеющие большой размер (например, кэш загруженных изображений и аудиофайлов) во внешнем хранилище. Для этого Android выделяет приложениям во внешнем хранилище папки с названиями вида Android/data/com.google.android.youtube . Самому приложению для доступа к такой папке не требуется разрешение на доступ ко всему внешнему хранилищу (поскольку в качестве владельца этой папки устанавливается его UID), но к этой папке может получить доступ любое другое приложение, имеющее такое разрешение, поэтому её, действительно, стоит использовать только для хранения публичных и некритичных данных. При удалении приложения система удалит и его специальную папку во внешнем хранилище; но файлы, созданные приложениями во внешнем хранилище вне их специальной папки считаются принадлежащими пользователю и остаются на месте после удаления создавшего их приложения.

Как я упомянул выше, исходно предполагалось, что внешнее хранилище действительно будет располагаться на внешней SD-карте, поскольку в то время объём SD-карт значительно превышал объём встраиваемой в телефоны памяти (в том же самом HTC Dream её было лишь 256 мегабайта, из которых на раздел data выделялось порядка 90 мегабайт). С тех пор многие условия изменились; в современных телефонах часто нет слота для SD-карты, зато устанавливается огромное по мобильным меркам количество встроенной памяти (например, в Samsung Galaxy Note 9 её может быть до 512 гигабайт).

Поэтому в современном Android практически всегда и внутреннее, и внешнее хранилища располагаются во встроенной памяти. Настоящий путь, по которому располагается внешнее хранилище в файловой системе, имеет форму /data/media/0 (для каждого пользователя устройства создаётся отдельное внешнее хранилище, и число в пути соответствует номеру пользователя). В целях совместимости до внешнего хранилища также можно добраться по путям /sdcard , /mnt/sdcard , /storage/self/primary , /storage/emulated/0 , нескольким путям, начинающимся с /mnt/runtime/ , и некоторым другим.

С другой стороны, у многих устройств всё-таки есть слот для SD-карты. Вставленную в Android-устройство SD-карту можно использовать как обычный внешний диск (не превращая её во внутреннее или внешнее хранилище системы) — сохранять на неё файлы, открывать хранящиеся на ней файлы, использовать её для перенесения файлов на другие устройства и т.п. Кроме того, Android позволяет «заимствовать» SD-карту и разместить внутреннее и внешнее хранилище на ней (это называется заимствованным хранилищем — adopted storage). При этом система переформатирует SD-карту и шифрует её содержимое — хранящиеся на ней данные невозможно прочесть, подключив её к другому устройству.

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

Загрузка

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

Именно на защиту от программных атак ориентирована модель ограничения прав пользователей в Unix (и основанная на ней технология app sandbox в Android); само по себе ограничение прав в Unix никак не защищает систему от пользователя, пробравшегося в серверную и получившего физический доступ к компьютеру. И если серьёзные многопользовательские сервера можно и нужно охранять от неавторизованного физического доступа, к персональным компьютерам — а тем более мобильным устройствам — такой подход просто неприменим.

Пытаться улучшать ситуацию с защитой от злоумышленника, получившего физический доступ к устройству, можно по двум направлениям:

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

Именно с этими двумя направлениями защиты связана модель безопасной загрузки в Android.

Verified Boot

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

Прежде всего, Android-устройства, в отличие от «десктопных» компьютеров, обычно не позволяют пользователю (или злоумышленнику) произвести загрузку со внешнего носителя; вместо этого сразу запускается установленный на устройстве bootloader (загрузчик). Bootloader — это относительно простая программа, в задачи которой (при загрузке в обыкновенном режиме) входят:

  • инициализация и настройка Trusted Execution Environment (например, ARM TrustZone),
  • нахождение разделов встроенной памяти, в которых хранятся образы ядра Linux и initramfs,
  • проверка их целостности и неприкосновенности (integrity) — в противном случае загрузка прерывается с сообщением об ошибке — путём верификации цифровой подписи производителя,
  • загрузка ядра и initramfs в память и передача управления ядру.

Flashing, unlocking, fastboot и recovery

Кроме того, bootloader поддерживает дополнительную функциональность для обновления и переустановки системы.

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

Это делается путём использования второй «фичи» bootloader’а, направленной на обновление и переустановку системы — поддержки перезаписи (flashing) содержимого и структуры разделов по командам с подсоединённого по кабелю компьютера. Для этого bootloader способен загружаться в ещё один специальный режим, который называют fastboot mode (или иногда просто bootloader mode), поскольку обычно для общения между компьютером и bootloader’ом в этом режиме используется протокол fastboot (и соответствующий ему инструмент fastboot из Android SDK со стороны компьютера).

Некоторые реализации bootloader’а используют другие протоколы. В основном это касается устройств, выпускаемых компанией Samsung, где специальная реализация bootloader’a (Loke) общается с компьютером по собственному проприетарному протоколу (Odin). Для работы с Odin со стороны компьютера можно использовать либо реализацию от самих Samsung (которая тоже называется Odin), либо свободную реализацию под названием Heimdall.

Конкретные детали зависят от реализации bootloader’а (то есть различаются в зависимости от производителя устройства), но во многих случаях установка recovery и сборок Android, подписанных ключом производителя устройства, просто работает без дополнительных сложностей:

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

Кроме того, многие устройства поддерживают разблокировку bootloader’а (unlocking the bootloader, также известную как OEM unlock) — отключение проверки bootloader’ом подписи системы и recovery, что позволяет устанавливать произвольные сборки того и другого (у части производителей это аннулирует гарантию). Именно так обычно устанавливаются такие популярные дистрибутивы Android, как LineageOS (бывший CyanogenMod), Paranoid Android, AOKP, OmniROM и другие.

Поскольку разблокировка bootloader’а всё-таки позволяет загрузить на устройстве собственную версию системы, в целях безопасности при разблокировке все пользовательские данные (с раздела data) принудительно удаляются. Если систему переустанавливает сам пользователь, а не злоумышленник, после переустановки он может восстановить свои данные из бэкапа (например, из облачного бэкапа на серверах Google или из бэкапа на внешнем носителе), если злоумышленник — он получит работающую систему, но не сможет украсть данные владельца устройства.

После установки предпочитаемых сборок recovery и системы bootloader стоит заблокировать обратно, чтобы снова защитить свои данные в случае попадания устройства в руки злоумышленников.

Для разблокировки bootloader’а может также потребоваться дополнительно разрешить её из настроек системы:

Популярная сторонняя recovery, которую устанавливают большинство «флешаголиков» (flashaholics) — TWRP (Team Win Recovery Project). Она содержит тач-интерфейс и множество продвинутых «фич», в том числе возможность устанавливать части системы из сборок в виде zip-архивов, встроенную поддержку бэкапов и даже полноценный эмулятор терминала с виртуальной клавиатурой:

Шифрование диска

Современные версии Android используют пофайловое шифрование данных (file-based encryption). Этот механизм основан на встроенной в ext4 поддержке шифрования, реализованной в ядре Linux (fscrypt), и позволяет системе зашифровывать различные части файловой системы различными ключами.

По умолчанию система шифрует большинство данных пользователя, расположенных на разделе data, с помощью ключа, который создаётся на основе пароля пользователя и не сохраняется на диск (credential encrypted storage). Это означает, что при загрузке система должна попросить пользователя ввести свой пароль, чтобы вычислить с его помощью ключ для расшифровки данных. Именно поэтому первый раз после включения устройства пользователя встречает требование ввести полный пароль или графический ключ, а не просто пройти аутентификацию, приложив палец к сканеру отпечатков.

В дополнение к credential encrypted storage в Android также используется device encrypted storage — шифрование ключом на основе данных, которые хранятся на устройстве (в том числе в Trusted Execution Environment). Файлы, зашифрованные таким образом, система может расшифровать до того, как пользователь введёт пароль. Это лежит в основе функции, известной как Direct Boot: система способна загружаться в некоторое работоспособное состояние и без ввода пароля; при этом приложения могут явно попросить систему сохранить (наименее приватную) часть своих данных в device encrypted storage, что позволяет им начинать выполнять свои базовые функции, не дожидаясь полной разблокировки устройства. Например, Direct Boot позволяет будильнику срабатывать и до первого ввода пароля, что особенно полезно, если устройство непредвиденно перезагружается ночью из-за временного отключения питания или сбоя системы.

Так называемый root-доступ — это возможность выполнять код от имени «пользователя root» (UID 0, также известного как суперпользователь). Напомню, что root — это специально выделенный Unix-пользователь, которому — за несколькими интересными исключениями — разрешён полный доступ ко всему в системе, и на которого не распространяются никакие ограничения прав.

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

  • устанавливать произвольные приложения — как из множества существующих магазинов приложений, так и произвольные APK из любых источников,
  • выбирать приложения по умолчанию: веб-браузер, email-клиент, камеру, файловый менеджер, лончер, приложение для звонков, приложение для СМС, приложение для контактов и так далее (это работает за счёт красивой системы activity и intent’ов, которую я описал в прошлой статье),
  • устанавливать и использовать пакеты значков (icon packs),
  • получать прямой доступ к файловой системе, хранить в ней произвольные файлы,
  • подключать устройство к компьютеру (или даже к другому Android-устройству) и напрямую передавать между ними файлы по кабелю,
  • и даже, во многих дистрибутивах Android, настраивать цвета и шрифты системной темы.

Итак, для обыкновенных задач, с которыми может столкнуться простой пользователь, root-доступ не нужен. В то же время использование root-доступа неизбежно сопряжено со многими проблемами с безопасностью (подробнее о них ниже), поэтому в большинстве случаев Android не позволяет пользователю работать от имени root. Приложения, в том числе эмуляторы терминалов, выполняются от имени своих ограниченных Unix-пользователей; а shell, который запускается при использовании команды adb shell , работает от имени специально для этого предназначенного Unix-пользователя shell.

Тем не менее, бывает, что root доступен пользователю:

  • Во-первых, root-доступ обычно разрешён на сборках Android для эмуляторов — поставляемых вместе с Android Studio виртуальных машин на базе QEMU, которые изображают реальные устройства и обычно используются разработчиками для отладки и тестирования приложений.
  • Во-вторых, root-доступ включён по умолчанию во многих сторонних дистрибутивах Android (pre-rooted ROMs).
  • В-третьих, при разблокированном bootloader’е root-доступ на любой сборке Android можно включить напрямую, просто установив исполняемый файл, реализующий команду su , через bootloader.
  • Ну и наконец, в-четвёртых, на старых версиях системы, содержащих известные уязвимости, часто можно получить root-доступ, проэксплуатировав их (обычно для получения root-доступа эксплуатируются сразу несколько уязвимостей в разных слоях и компонентах системы). Например, если система не обновлялась с первой половины 2016 года, для получения root-доступа можно воспользоваться получившей широкую известность уязвимостью Dirty Cow.

Зачем это может быть нужно? Конечно, root-доступ полезен для отладки и исследования работы системы. Кроме того, обладая root-доступом, можно неограниченно настраивать систему, изменяя её темы, поведение и многие другие аспекты. Можно принудительно подменять код и ресурсы приложений — например, можно удалить из приложения рекламу или разблокировать его платную или скрытую функциональность. Можно устанавливать, изменять и удалять произвольные файлы, в том числе в разделе system (хотя это почти наверняка плохая идея).

С более философской точки зрения, root-доступ позволяет пользователю полностью контролировать своё устройство и свою систему — вместо того, чтобы устройство и разработчики ПО контролировали пользователя.

Проблемы root-доступа

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

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

Как я уже говорил во второй статье серии, в отличие от традиционной модели доверия программам в классическом Unix, Android рассчитан на то, что пользователь не может доверять сторонним приложениям — поэтому их и помещают в песочницу. Тем более нельзя доверять приложениям root-доступ, надеясь, что они будут использовать его только во благо. Фактически, root-доступ разрушает аккуратно выстроенную модель безопасности Android, снимая с приложений все ограничения и открывая им права на доступ ко всему в системе.

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

Аналогично, онлайн-игры вроде популярной Pokémon GO тоже отказываются работать на root-ованных устройствах, опасаясь, что игрок сможет с лёгкостью нарушить правила игры.

Google Play и root-доступ

Google разрешает производителям предустанавливать Google Play Store и Google Play Services только на устройства, где root-доступ отключён, тем самым делая Android более привлекательной платформой для разработчиков, которые, естественно, предпочитают вкладывать ресурсы в разработку под платформы, не позволяющие пользователям с лёгкостью вмешиваться в работу их приложений. А поскольку Play Store — наиболее известный и популярный (как среди разработчиков приложений, так и среди пользователей) магазин приложений для Android, большинство производителей предпочитают предустанавливать его на свои устройства. (Есть и исключения — например, Amazon использует собственный дистрибутив Android под названием Fire OS для своих устройств — Echo, Fire TV, Fire Phone, Kindle Fire Tablet — и не предустанавливает никаких приложений от Google). Именно поэтому root-доступ по умолчанию отключён на большинстве популярных Android-устройств.

Несмотря на ограничение для производителей, Google разрешает пользователям сборок, в которых разрешён root-доступ, самостоятельно устанавливать Google Play (обычно это делается путём установки готовых пакетов от проекта Open GApps); при этом Google требует, чтобы после установки пользователь вручную зарегистрировал устройство на специально предназначенной для этого странице регистрации.

Device manufacturers work with Google to certify that Android devices with Google apps installed are secure and will run apps correctly. To be certified, a device must pass Android compatibility tests. If you are unable to add a Google Account on your Android device, your Android device software might not have passed Android compatibility tests, or the device manufacturer has not submitted the results to Google to seek approval. As a result, your device is uncertified. This means that your device might not be secure.

If you are a User wanting to use custom ROMs on your device, please register your device by submitting your Google Services Framework Android ID below.

Ограничение доступа к root

В «обычном» Linux, как и в других Unix-системах, для получения root-доступа (с помощью команд sudo и su ) пользователю требуется ввести пароль (или свой, или пароль Unix-пользователя root, в зависимости от настройки системы и конкретной команды) или авторизоваться другим способом (например, с помощью отпечатка пальца). В дополнение к собственно авторизации это служит подтверждением того, что пользователь доверяет этой программе и согласен предоставить ей возможность воспользоваться root-доступом.

Стандартная версия команды su из Android Open Source Project не запрашивает подтверждения пользователя явно, но она доступна только Unix-пользователю shell (и самому root), что полностью отрезает приложениям возможность получать root-права. Многие сторонние реализации su позволяют любому приложению получать права суперпользователя, что, как я объяснил выше, очень плохо в плане безопасности.

В качестве компромисса многими пользователями используются специальные программы, которые управляют доступом к su . При попытке приложения вызвать su они запрашивают подтверждение у пользователя, который может разрешить или запретить приложению получить root-доступ. Несколько лет назад была популярна одна из таких программ, SuperSU; в последнее время её вытеснил новый открытый проект под названием Magisk.

Magisk

Основная особенность Magisk — возможность проведения широкого класса модификаций системы, в том числе связанных с изменением файлов, расположенных в папке /system , на самом деле не изменяя сам раздел system (это называют словом systemless-ly), путём использования нескольких продвинутых «фич» Linux. В сочетании с Magisk Hide — возможностью не просто не давать некоторым приложениям root-доступ, а полностью прятать от них сам факт наличия root-доступа и установки Magisk в системе — это позволяет устройству по-прежнему получать обновления системы от производителя и использовать приложения вроде того же Google Pay, которые отказываются работать на root-ованных системах. Magisk Hide способен обходить даже такие достаточно продвинутые технологии обнаружения root-а, как SafetyNet от Google.

Хотя это действительно невероятно круто, нужно осознавать, что возможность использовать приложения вроде Google Pay на root-ованных устройствах несмотря на встроенные в них проверки — это не решение связанных с root-доступом проблем с безопасностью. Приложения, которым пользователь доверил root-доступ, по-прежнему могут решить вмешаться в работу системы и украсть деньги пользователя через Google Pay. Проблемы с безопасностью остаются, нам лишь удаётся закрыть на них глаза.

Magisk поддерживает systemless-ную установку готовых системных «твиков» в виде Magisk Modules, специальных пакетов для установки с использованием Magisk. В таком виде доступны, например, известный root-фреймворк Xposed и ViPER, набор продвинутых драйверов и настроек для воспроизведения звука.

SoC, драйвера и фрагментация

Системы на кристалле

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

В отличие от такой схемы, в большинстве Android-устройств используются так называемые системы на кристалле (system on a chip, SoC). Система на кристалле представляет собой набор компонентов компьютера — центральный процессор, блок оперативной памяти, порты ввода-вывода, графический процессор, LTE-, Bluetooth- и Wi-Fi-модемы и т.п. — полностью реализованных и интегрированных в рамках одного микрочипа. Такой подход позволяет не только уменьшить физический размер устройства, чтобы оно поместилось в кармане, и повысить его производительность за счёт большей локальности и лучшей интеграции между компонентами, но и значительно снизить его энергопотребление и тепловыделение, что особенно актуально для мобильных устройств, питающихся от встроенной батарейки и не имеющих систем активного охлаждения.

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

О драйверах

Другой — гораздо более важный именно в контексте Android — недостаток SoC заключается в связанных с ними сложностях с драйверами. Как и в традиционных системах, основанных на отдельных платах, каждый компонент системы на кристалле — от камеры до LTE-модема — требует для работы использования специальных драйверов. Но в отличие от традиционных систем, эти драйвера обычно разрабатываются производителями систем на кристалле и специфичны для их конкретных моделей; кроме того, исходные коды таких драйверов обычно не раскрываются, да и бинарные сборки в свободный доступ производителями выкладываются совсем не всегда.

Вместо этого производитель SoC (например, Qualcomm) отдаёт готовую сборку драйверов производителям Android-устройств (например, Sony или LG), которые включают её в свою сборку Android, основанную на коде из Android Open Source Project. Так и получается, что сборка Android, предустановленная на устройстве производителем, содержит все нужные для этого устройства драйвера, а напрямую использовать сборку для одного устройства на другом невозможно.

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

Фрагментация

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

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

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

Во-вторых, фрагментация отрицательно сказывается на разработчиках приложений под Android — страдает так называемый developer experience (DX, по аналогии с user experience/UX). В теории, несмотря на внутренние различия в драйверах и пользовательском интерфейсе разных версий и сборок Android, используемые разработчиками приложений API — Android Framework, OpenGL/Vulkan и другие — должны быть переносимы и работать одинаково. На практике это, конечно, не всегда так, и разработчикам приходится тестировать и обеспечивать работу своих приложений на множестве версий и сборок Android — на разных устройствах, разных версиях системы, сторонних дистрибутивах и так далее.

Don’t Stop Thinking About Tomorrow

Далеко не все производители Android-устройств не считают важным своевременно выпускать обновления для своих устройств. Например, Google выпускают обновления для своих линеек Nexus и Pixel одновременно с тем, как выходит новая версия Android. У многих других производителей портирование сборок Android на его новую версию занимает месяцы, но они, тем не менее, стараются выпускать ежемесячные обновления безопасности.

Кроме того, совсем не все устройства, где используется Android, построены на основе SoC. Android вполне можно установить и на обычный «десктопный» компьютер (подойдут, например, сборки от проектов Android-x86 и RemixOS). Специальная сборка Android встроена в ChromeOS, что позволяет Chromebook’ам запускать Android-приложения наряду с Linux-приложениями и веб-приложениями. Аналогичного подхода — запуска специальной сборки Android в контейнере — придерживается проект Anbox, позволяющий использовать Android-приложения на «обыкновенных» Linux-системах. (Напомню, что Android-приложения так легко переносятся на x86-архитектуры, не требуя перекомпиляции, благодаря использованию виртуальной машины Java, о чём я рассказывал во второй статье серии.)

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

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

И такое решение уже существует. В 2017 году Google анонсировали Project Treble — новую, ещё более модульную (по сравнению с уже существующим HAL, hardware abstraction layer) архитектуру взаимодействия драйверов (и остального софта, специфичного для конкретного устройства) с остальными частями системы. Treble позволяет устанавливать основную систему и драйвера, специфичные для устройства, на разные разделы файловой системы, и обновлять — или как угодно изменять — систему отдельно от установленных драйверов.

Treble в корне меняет ситуацию с медленным выпуском обновлений и плохой переносимостью сборок. Благодаря Treble устройства от семи разных компаний (Sony, Nokia, OnePlus, Oppo, Xiaomi, Essential и Vivo — а не только от самих Google) смогли участвовать в бета-программе Android Pie. Treble позволил Essential выпустить обновление до Android Pie для своего Essential Phone прямо в день выхода Android Pie. Одну и ту же сборку Android — один и тот же бинарный файл без перекомпиляции или каких-либо изменений — теперь можно запускать на любом устройстве, поддерживающем Treble, несмотря на то, что они могут быть основаны на совершенно разных SoC.

Влияние Treble действительно сложно переоценить. Java принесла возможность «write once, run everywhere» для высокоуровневого кода — в том числе и возможность запускать Android-приложения на компьютерах с практически любой архитектурой процессора. Treble — аналогичный прорыв, позволяющий использовать однажды написанную и скомпилированную сборку Android на устройствах с совершенно разными SoC. Теперь дело за производителями, которым нужно конвертировать свои драйвера в формат, совместимый с Treble. Можно надеяться, что через несколько лет проблемы с обновлениями Android-устройств исчезнут окончательно.

В следующей статье я планирую рассказать о низкоуровневом userspace Android: о процессе init, о Zygote, Binder, сервисах и props.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *