Android 10 с открытым кодом на Orange Pi: возможна ли стабильная работа

Меня зовут Марина Сергиенко, я Team Lead, Engineering, Consultant в компании GlobalLogic уже 10 лет, последний год занимаю позицию Team Lead. Сегодня хочу рассказать про один из некоммерческих проектов, над которым работали инженеры из моей команды.

Данная статья — это систематизация опыта, технических решений и навыков, которые команда получила в ходе портирования актуальной версии open source системы Android на одноплатный компьютер Orange Pi.

Статья будет полезна инженерам, занимающимся вопросами интеграции и портирования ОС, энтузиастам еmbedded-технологий, специалистам, имеющим дело с микрокомпьютерами типа Raspberry Pi.

Зачем нам Orange Pi

Чуть больше года назад, когда в руки попала плата Orange Pi, нас заинтересовала возможность запустить на ней последний Android (тогда это была версия P). Собралась команда из пяти единомышленников (embedded-инженеров), и мы стартовали небольшой проект для проверки концепции.

Сегодня на рынке нет недорогого решения с современной версией Android и периферией, привычной любому пользователю. Что мы понимаем под «нет платформы»?

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

С чего начинали

1. Выбрали операционную систему.

Разумеется, определились с интересующей нас операционной системой — Android. На текущий момент это самая популярная ОС для портирования мобильных устройств.

2. Исследовали рынок одноплатных компьютеров.

Небольшой ликбез. Одноплатный компьютер — это портативное решение: плата, на которой установлен SOC с графическим процессором, оперативная память и контроллеры периферии. Все это позволяет собрать на рабочем столе маленький полнофункциональный компьютер. К нему можно подключить монитор, запустить браузер.

На текущий момент индустрия одноплатных компьютеров развивается интенсивно. В таблице ниже мы собрали для наглядности некоторые разработки и модели. Отбирали по принципу: все имеют на борту 2 ГБ оперативной памяти. Особое внимание обратим на колонку Price. Она не отражает полного состояния отрасли, но хорошо иллюстрирует диапазон цен: есть решения от десятков до сотен долларов.

HW Comparison Table, 2 Gb DDR3

BoardsSoCGPUPriceAvailable Android
Raspberry Pi 4 Model BBroadcom BCM2711Cortex-A72 Quad coreVideoCore VI$52.97Android 7.1.2
Banana Pi M2 Ultra
Allwinner R40Cortex A7 Quad coreMali-400MP2$56.99Android 7.1.2
ODROID-C2Amlogic S905Cortex-A53 Quad coreMali-450$85.40Android 8.1
NanoPi K2Amlogic S905Cortex-A53 Quad coreMali-450MP$53.00Android 8.1
PINE A64+Amlogic S905Cortex A53 Quad-CoreMali-400MP2 $29.00Android 7.0
Orange Pi 3Allwinner H6Cortex-A53 Quad coreMali-720$34.90Android 7.0
HiKey 960HiSilicon Kirin 9604xCortex-A73, 4xCortex-A53Mali-G71MP8$239.00Android 9.0
SanCloud BeagleBone EnhancedTI AM3358Cortex-A8SGX530$69.00Custom Android for BBB

Что это дает? Гибкость. Пользователь с любым бюджетом соберет для себя «умное» устройство. Еще одна графа в таблице показывает версию ОС Android, которую можно запустить на данной платформе. От чего она зависит и откуда берется? Все просто: версия предоставляется либо продавцом/производителем для популяризации своей платформы, либо от open source community.

К чему были эти теоретические отступления? У нас есть новая версия Android, одноплатный компьютер, и год назад мы решили портировать этот Android на одноплатный компьютер. Мы не первые, кто решил это сделать. Но есть нюанс: наша команда определила новые требования. Чтобы было интереснее!

3. Формирование требований и постановка задачи:

  1. Использовать только последнюю версию Android, которая актуальна на текущий момент. Что надо, чтобы портировать ее? Настроить аппаратно-зависимые части, bootloader, адаптировать ядро Linux, сконфигурировать уровень HAL, сервисы.
  2. Платформа должна быть дешевой. И, разумеется, содержать ресурсы, достаточные, чтобы Android мог работать. 640 килобайт, конечно, хватит для всех, но не для Android 10.
  3. Использовать только open source проекты из открытых источников. Итоговый проект должен быть открыт и доступен каждому. Плюс важен аспект безопасности. Можно ли доверять данному продукту? Например, когда мы скачиваем Android с официального сайта Orange Pi, получаем только бинарный файл. Содержимое этого файла никому не известно. И всегда остается доля сомнений. Хотелось бы избежать этого: люди должны понимать, что проекту можно доверять.
  4. Проект должен собираться «из коробки». Ни для кого не секрет: чтобы собрать Android, сначала нужно собрать ядро Linux, bootloader, библиотеки и сервисы самого Android. Это все сконфигурировать, адаптировать аппаратно-зависимые части, сложить все в образ и записать на носитель информации. После этого Android заработает. Нетривиальная задача для неподготовленных людей.
  5. Последнее в списке, но не по важности. Получить удовольствие от процесса.

На этом теоретический этап подошел к концу. Теперь рассмотрим, а как же было на практике? Весь процесс мы разбили на шаги.

Шаг 1. Выбор платы

После сравнения вариантов мы остановились на Orange Pi Plus 2E.

Orange Pi Plus 2E (Shenzhen Xunlong Software)

Потому что:

  • она дешевая;
  • есть активное сообщество, которое может помочь;
  • относительно неплохое «железо» (32-разрядный процессор, 4-ядерный с частотой 1.6 ГГц, графический процессор Mali-400, 2 ГБ ОЗУ и 16 ГБ MMC, интерфейсы: USB для подключения внешней периферии, Wi-Fi и Ethernet).

Шаг 2. Критерии и постулаты разработки

  1. Все, что исправляем или добавляем в сторонние репозитории, нужно коммитить в upstream. Если находим ошибку и требуется фикс в ядре — предлагаем в mainline Linux kernel. Если делается фикс в Android Open Source Project от Google — аналогично. В течении разработки, особенно в активной фазе, активно предлагаем наши патчи в upstream.
  2. Создавать форки других проектов только при необходимости — если нужно добавить специфические для платформы вещи.
  3. Держать код чистым. Это понятные структурированные описания изменений. Не всегда получается из-за спешки, но стараемся обращать на это внимание.
  4. Максимально избегать использования проприетарных проектов.

Шаг 3. Процесс

Google предлагает нам следующие шаги по кастомизации Android под новую платформу:

За этими словами скрываются такие действия:

  1. Создать директорию для платформы (она должна располагаться в папке device): с наименованием вендора и названием продукта. Там следует разместить vendor setup файл, в котором будет задаваться название сборки.
  2. Добавить make-файлы для сборки продукта. Они содержат название архитектуры, подключаемые модули и конфигурационные файлы. Кроме того, overlay config file, который настраивает ресурсы стандартных компонентов Android.
  3. Доработать Android-манифест, чтобы обеспечить сборку «из коробки». Включить сборку ядра и bootloaders.

GloDroid основывается на AOSP от Google и включает репозитории с таблицы ниже. Мы сделали make-файлы для конфигурации Android: какую разновидность хотим собрать (TV, Automotive, для других задач), поддержку каких HAL/сервисов включить (например, Wi-Fi и Bluetooth).

Что получилось в итоге

В отдельном репозитории (скачивается в директорию prebuilts) мы храним уже собранные сторонние приложения (файлы APK), которые могут сразу инсталлироваться. Загвоздка в том, что Play Market не входит в AOSP, за него необходимо либо платить, либо проходить сертификацию у Google. Мы нашли выход и использовали F-Droid для установки и тестирования приложений. Также добавили тулчейн, которым собираем ядро, и U-Boot. Инструменты для сборки остальных пакетов входят в состав AOSP.

Вернемся к вопросу о безопасности бинарных файлов. В частности, поговорим о графических драйверах. Их поставляет компания ARM для своих графических процессоров. Это проприетарный драйвер, а мы договаривались не использовать такие решения.

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

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

Рассмотрим, над какими компонентами нам приходится больше всего работать.

На схеме выделены цветом структурные элементы программного обеспечения, которые пришлось дорабатывать:

  • DRM-микшер, который отвечает за взаимодействие с вспомогательным процессором. Комьюнити не приняло три нужных нам патча, поэтому храним их в нашем репозитории.
  • Проект Mesa, который реализует OpenGL Stack. Он динамично развивается последние три года. Реализует OpenGL, GL ES, Vulkan и позволяет использовать различные средства аппаратного ускорения. Драйвера от Mesa часто функциональней и лучше, чем оригинальные драйвера от производителей «железа». Практически весь проект сделан с помощью реверс-инжиниринга.
  • Video Engine позволяет выполнять аппаратное кодирование и декодирование видео. Google уже сделал под него базовую поддержку, но не дал всех компонентов, чтобы склеить воедино. На данный момент поддержку видеодекодирования мы не реализовали.
  • Аудио. Получилось поднять звук «из коробки». Мы используем tinyhal — открытый проект на GitHub.

А что со стабильностью

Мы работаем над исправлением существующих и новых багов, которые появляются как регрессия из-за некоторых улучшений сторонних репозиториев. Планируем поднять сервер Continuous Іntegration, на котором все изменения будут автоматически собираться. Будут запускаться тесты и генерироваться отчет валидации для любого члена сообщества, который захочет участвовать в проекте. Тем самым планируем немного разгрузить себя и улучшить качество продукта. Для тестирования будем использовать VTS/CTS. Это наборы тестов, которые предоставляет Google.

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

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

Итоги

На этом слайде показано, сколько усилий было потрачено на различные активности.

Мы написали около 1350 строк make-файлов для конфигурации Android. Примерно 300 строк C/C++ кода для улучшения его работы. Написание кода у нас занимало примерно 1% времени. Make-файлы — около 5% времени. Для наглядности: за 3-4 месяца активной фазы разработки на кодирование было потрачено 5 дней. Еще 24% времени уходило на сборку и отладку.

Android OS — живая и постоянно изменяющаяся система. То, что было актуально для версии 8, зачастую неактуально для версии 10. Приходится разбирать исходный код, и на это идет много времени. Поэтому, кроме решения практической задачи портирования, работа над проектом здорово прокачала навык самообразования:

  • глубоко погрузились в официальную документацию Google, поняли ее логику;
  • руками пощупали существующие AOSP-репозитории. Разобрались, как они устроены, поскольку там далеко не все задокументировано.

Мы выполнили все поставленные цели. Реализовали поддержку Android для платформы Orange Pi Plus 2E, сделали это достоянием сообщества и получили массу удовольствия.

Итоговый проект доступен на GitHub. Вот его wiki.

Если стало интересно и хотите приобщиться к нашей команде — мы рады помощи!

Похожие статьи:
Сергій Поднос — Senior Project Manager в компанії GlobalLogic. А ще він автогонщик, суддя національної категорії і член апеляційного суду...
Буквально только что мы писали о том, что рендер-изображение готовящегося смартфона Microsoft Lumia 950 XL раскрыло размеры...
Цифровая революция открыла новые возможности для бизнеса. Вместе с этим, она поставила много новых задач перед...
Мы попросили адептов гибких методологий рассказать конкретные истории, как с помощью Agile удалось повысить...
Минув уже більш як рік від початку карантину та нашого опитування на цю тему. І ми вирішили знову...
Яндекс.Метрика