Вчера вышло очередное обновление ОС для мобильных устройств от Google. Одним из главных нововведений Android 10 стал «Project Mainline». Попробую разобраться что это, для чего и как работает.

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

Первым большим шагом к упрощению обновления Android стал «Project Treble», который «разделил» Android на две части: аппаратно зависимую и независимую. Что облегчило выпуск обновлений до новых версий Android. Следующим большим шагом стал «Project Mainline». Он позволит обновлять отдельные компоненты операционной системы без обновления всей системы аналогично обновлению приложений.

Почему это понадобилось?


В архитектуре Android операционная система (часто ее называют прошивкой) жестко отделена от пользовательских данных и приложений. Она находится на отдельном разделе флеш памяти, доступна только для чтения и в последних версиях Android подписана электронной подписью для контроля целостности. Для приложений Android, входящих в состав операционной системы, возможно обновление с размещением новых версий приложений в пользовательском разделе памяти. Обновление других частей операционной системы (сервисы, библиотеки и т.д.), например с помощью пакетного менеджера, как на дистрибутивах Linux, было невозможно. Для таких исправлений производитель был вынужден выпускать обновление всей системы. При этом, при использовании сервисов Google Mobile Services (подавляющее большинство устройств их использует), каждое обновление требует сертификации в Google. И «Project Mainline» решает эту проблему, теперь компоненты системы можно обновлять по отдельности, аналогично Android приложениям. Кроме обновлений безопасности, он также упрощает обновление системных настроек и данных, например о часовых поясах (tzdata).

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


Основу «Project Mainline» составляет новый контейнер для системных приложений APEX (сокращение от Android Pony EXpress).

В Android 10 Google выделил в системе 13 APEX пакетов, которые можно обновлять независимо:

  • Security: Media Codecs, Media Framework Components, DNS Resolver, Conscrypt
  • Privacy: Documents UI, Permission Controller, ExtServices
  • Consistency: Timezone data, ANGLE (developers opt-in), Module Metadata, Networking components, Captive Portal Login, Network Permission Configuration

APEX пакеты можно устанавливать аналогично APK с помощью «установщика пакетов», adb или Google Play.

APEX


APEX файл похож на используемый для Andoird приложений APK.

APEX это zip архив, содержащий 4 основных файла:

  • apex_manifest.json — содержит имя пакета и его версию;
  • AndroidManifest.xml — метаданные пакета (аналогично APK);
  • apex_payload.img — образ ext4 файловой системы;
  • apex_pubkey — открытый ключ для проверки подписи образа.

С APEX пакетами работает системный сервис APEX manager (apexd).

APEX manager


  • Установщик пакетов, определив что это APEX пакет, передает его APEX менеджеру.
  • APEX менеджер проверяет пакет и его версию.
  • Если проверки проходят, распаковывает его в пользовательский раздел памяти, обновляет запись в своей базе данных и перезагружает устройства.
  • При загрузке APEX менеджер проверяет все пакеты из базы данных, создает loop устройство для ext4 образа и монтирует его по пути /apex/name@ver.

Внутри образа из APEX пакета могут быть:

  • исполняемые файлы,
  • разделяемые (.so) библиотеки,
  • JAR библиотеки,
  • файлы с данными,
  • конфигурационные файлы.

Подпись APEX пакета


APEX пакет подписывается два раза, двумя разными ключами. Одним ключом подписывается ext4 образ (используется dm-verity, как в Android Verified Boot), вторым ключом подписывается APEX пакет (zip-файл) аналогично APK пакету.

Linux kernel


Для работы APEX используется ряд механизмов Linux ядра, таких как loop-устройство, DM-verity.
Работа APEX поддерживается на ядре версии 4.4 и выше. Для устройств на более старых версия ядра, поддерживается только работа в «плоском» режиме, не поддерживающем обновление.

Ссылки:
android.googlesource.com/platform/system/apex/+/refs/heads/master/docs/README.md
android-developers.googleblog.com/2019/05/fresher-os-with-projects-treble-and-mainline.html

Комментарии (19)


  1. inferrna
    04.09.2019 20:23

    Кажется, что-то подобное обещали ещё начиная с 8-й версии. По-крайней мере, про возможность создать прошивку 9 и более андроида на основе ядра от 8-го.


    1. vm03 Автор
      04.09.2019 20:42

      В 8-ом был "первый шаг" — Project Treble. Прошивку разделили на две части общую и аппаратно зависимую. Теперь следующий шаг, обновлять систему частями.


      1. qw1
        04.09.2019 21:22

        Сейчас Project Treble почти нигде не работает. Производителям устройств это просто невыгодно, и они не включают необходимые компоненты в прошивку. Куда лучше, если через 2 года устройство перестаёт поддерживаться, устаревает, пользователь покупает новое.


        1. vm03 Автор
          04.09.2019 21:38

          Не идеально, но Project Treble работает. Phh-Treble GSI ( github.com/phhusson/treble_experimentations ) прошивки работают на достаточно большом количестве устройств. Причем 9е хорошо работают с 8м vendor.


          1. qw1
            04.09.2019 22:01

            Ну-ка, а есть список устройств, где Treble реально работает?
            Может, он работает на Samsung Galaxy S9, или на HTC U12+, или на Honor 8?


            1. qw1
              04.09.2019 22:04

              Почитал ветку на XDA, так и есть. Нужно накатывать кастомную прошивку, чтобы работал Treble. Из коробки вендоры его не поддерживают.


              1. vm03 Автор
                04.09.2019 22:17

                Phh-Treble это и есть кастомная прошивка, но она использует стоковый vendor и boot, прошивается только system, причем может использоваться vendor 8й версии для 9го андроида.
                Для некоторых устройств существуют кастомные vendor (если сток не treble)


                1. qw1
                  04.09.2019 23:08

                  В этом случае, цель гугла не достигнута — продлить устройствам срок поддержки и обеспечить доставку патчей безопасности.

                  Потому что кастомные прошивки накатывают очень немногие пользователи.


                  1. vm03 Автор
                    05.09.2019 07:46

                    Phh-Treble это пример того, что Treble, как технология вполне себе работает. Для любителей кастомов, она оказалась полезней чем для производителей (я не видел не одного "официального" обновления версии андроида без обновления BSP), но она работает и посмотрим что будет дальше.


                    1. qw1
                      05.09.2019 10:02

                      Как по мне, «работает» — это значит присутствует в любом андроиде, начиная с некоторой версии (как переход с Dalvik на ART в 5.0).

                      То есть, читая новости, я ожидал, что с 8-го андроида Treble будет в любой сборке ОС и можно будет им пользоваться. По факту, кроме гугло-пикселей, нигде в стоковой конфигурации его нет. Как пользователю, мне одинаково — что разблокировать загрузчик, накатывать AOSP и обновляться через Treble, что обновляться ночными билдами AOSP.

                      Как обладателю HTC U11, мне вообще Lineage/AOSP не подходит — там постоянно что-то, да не работает.


                      1. vm03 Автор
                        05.09.2019 10:21

                        Project Treble и не предполагает, что вы сможете ставить прошивку (операционную систему) не от производителя (Гугла или кого либо еще), GSI это побочный эфект Project Treble. Цель отделить «аппаратную часть» ОС, что бы облегчить производителям обновление до новых версий андроида, меньше зависить от поставщиков компонентов. И GSI прошивки, доказывают, что технически эта цель достигнута.

                        я ожидал, что с 8-го андроида Treble будет в любой сборке ОС и можно будет им пользоваться.

                        Я не очень понимаю, как вы себе представляете «использование Treble». Он не для конечного пользователя, он для производителя и его разработчиков.


                        1. qw1
                          05.09.2019 15:23

                          Я ожидал, что вендоры массово начнут использовать Treble в своих стоковых прошивках, и обновления будут доставляться в минимальные сроки напрямую от гугл без необходимости разблокировать загрузчик и т.п. В реальности, этого не произошло. Весьма вероятно, что и этот Project Mainline постигнет та же участь.


                          1. zikasak
                            05.09.2019 16:40

                            Все производители, если хотят пройти сертификацию Гугла, используют Treble


                            1. qw1
                              05.09.2019 19:08

                              Но мы всё равно ждём апдейта от вендора телефона, напрямую от google обновление не получить?

                              В таком случае, для пользователей ничего не меняется. Для вендоров, возможно, обновления собирать станет попроще, но 2-летний лимит поддержки остаётся в силе: после 2 лет устройство перестаёт обновляться.


                              1. zikasak
                                05.09.2019 20:21

                                Не получить. Можно лишь gsi образ скачать. Но не факт, что все будет работать.
                                Ну и никто в Гугле и не заявлял, что обновления при treble идут от Гугла.


            1. vm03 Автор
              04.09.2019 22:15

              На Galaxy S9 работает, и вот еще например:
              Mi 6X/Mi Pad 4, Note 9, Pixel 2, OnePlus 6, HTC U11+, Xperia XZ1, Razer Phone, Sharp Aquos S2
              и еще много, ищите на XDA и 4pda.


            1. vm03 Автор
              04.09.2019 22:36

  1. Punk_Joker
    04.09.2019 20:30

    Лучше бы указать, что за tzdata (не все поймут что это часовые пояса)


    1. Nengchak
      05.09.2019 10:29
      +3

      это было бы странно, что не поймут.