Разработка и портирование GSI прошивок

Установка GSI-образа на устройство без поддержки Project Treble почти гарантированно заканчивается bootloop — телефон зависает на логотипе загрузчика, потому что системный раздел не может связаться с vendor-разделом без стандартизированного интерфейса. Именно поэтому разработка и портирование GSI прошивок начинается не с кастомизации Android, а с проверки архитектуры устройства и соответствия требованиям Treble. Без этой базы любые правки системного образа бессмысленны.

GSI (Generic System Image) — это «чистый» системный образ Android, способный загружаться на любом совместимом устройстве независимо от производителя. В этой статье разберём, как устроена GSI, как собрать собственный образ из исходников AOSP, как портировать готовую GSI под конкретное устройство и какие ошибки встречаются чаще всего.

Что такое GSI и как работает Project Treble

До появления Project Treble системный раздел Android был жёстко связан с драйверами и библиотеками производителя. Любое обновление системы требовало переработки vendor-компонентов, поэтому кастомные прошивки собирались индивидуально под каждую модель. Treble разделил систему и vendor-часть стандартизированным интерфейсом — HIDL и позже AIDL, а также VNDK для библиотек.

Благодаря этому разделению Generic System Image может работать поверх чужого vendor-раздела, если оба соблюдают контракт интерфейсов. Проверить наличие Treble на устройстве можно через ADB:

adb shell getprop ro.treble.enabled

Значение true означает базовую совместимость. Дополнительно стоит проверить архитектуру процессора и тип разметки разделов — от этого зависит, какой вариант GSI (arm64, a-only или AB) подойдёт конкретному аппарату.

  • 📱 arm64 — самая распространённая архитектура современных устройств;
  • 🔀 AB (seamless updates) — устройства с двумя слотами разделов A и B;
  • 📦 a-only — классическая разметка с одним system-разделом;
  • 🧩 system-as-root — схема, при которой system монтируется как корневой раздел.

Проверка совместимости устройства перед портированием

Прежде чем портировать или собирать GSI, необходимо собрать технический паспорт устройства. Начните с архитектуры: команда adb shell getprop ro.product.cpu.abi покажет, нужен ли образ arm64 или устаревший arm. Затем проверьте поддержку AB-разметки через ro.build.ab_update.

Несовпадение типа разметки — одна из самых частых причин неудачной прошивки. Образ для a-only, записанный на AB-устройство (или наоборот), просто не смонтируется корректно. Также уточните, использует ли аппарат dynamic partitions — на таких устройствах system-раздел находится внутри super-раздела, и прошивка выполняется иначе, чем на старых схемах.

⚠️ Внимание: разблокировка загрузчика — обязательное условие для установки GSI. На большинстве устройств эта операция стирает все пользовательские данные и может аннулировать гарантию. Сделайте резервную копию до начала работ.

Результаты проверки удобно свести в таблицу и сверять с требованиями конкретной GSI-сборки:

ПараметрКоманда проверкиЧто определяет
Treblegetprop ro.treble.enabledБазовую совместимость с GSI
Архитектураgetprop ro.product.cpu.abiВариант образа (arm64/arm)
AB-разметкаgetprop ro.build.ab_updateТип разделов (A/B или a-only)
System-as-rootgetprop ro.build.system_root_imageСхему монтирования system
VNDK-версияgetprop ro.vndk.versionСовместимость vendor-библиотек
📊 С какой целью вы интересуетесь GSI-прошивками?
Хочу установить чистый Android на своё устройство
Планирую собирать собственные образы
Портирую GSI под конкретную модель
Тестирую приложения на разных версиях Android

Инструменты и подготовка среды разработки

Для сборки GSI из исходников потребуется Linux-машина (чаще всего используют Ubuntu LTS), значительный объём оперативной памяти и свободного дискового пространства — исходный код AOSP вместе с результатом сборки занимает сотни гигабайт. Точные требования зависят от версии Android, поэтому сверяйтесь с официальной документацией AOSP для выбранной ветки.

Базовый набор инструментов включает repo для синхронизации исходников, Android SDK Platform-Tools (fastboot и adb) для прошивки и отладки, а также компиляторы и библиотеки, перечисленные в документации AOSP. Для портирования готовых образов дополнительно пригодятся утилиты распаковки и перепаковки образов, например инструменты для работы с sparse image и payload.bin.

Если цель — не полная сборка, а портирование существующей GSI, объём работы заметно меньше: достаточно рабочего окружения с fastboot, инструментами монтирования образов и редактором файловых систем ext4/erofs. Однако и здесь без Linux-окружения обойтись сложно — большинство скриптов porting-сообществ написаны под него.

Сборка GSI из исходников AOSP

Полная сборка начинается с инициализации репозитория нужной ветки Android и синхронизации исходников через repo sync. Затем выбирается цель сборки — для GSI это специальные target-конфигурации вроде aosp_arm64. Процесс выглядит так:

source build/envsetup.sh

lunch aosp_arm64-userdebug

make systemimage -j$(nproc)

Результатом будет файл system.img в выходном каталоге сборки. Именно он прошивается в system-раздел устройства. На этом этапе в образ можно вносить собственные изменения: патчи фреймворка, предустановленные приложения, модифицированные настройки по умолчанию.

Важный нюанс: «голая» сборка AOSP не содержит проприетарных компонентов Google (GMS). Если они нужны, их интегрируют отдельно, и это отдельная задача со своими лицензионными и техническими ограничениями. Многие разработчики GSI поставляют две версии образа — с GMS и без.

Портирование GSI под конкретное устройство

Портирование отличается от сборки тем, что за основу берётся уже готовый образ, который адаптируется под особенности конкретного vendor-раздела. Типичный рабочий процесс выглядит так: сначала на устройство прошивается стоковая (или минимально модифицированная) GSI, фиксируются неработающие функции, затем проблемы устраняются точечными правками.

☑️ Порядок портирования GSI

Выполнено: 0 / 6

Чаще всего портирование сводится к работе с overlay-файлами (настройки яркости, разрешений, энергосбережения), правке build.prop и добавлению устройство-специфичных библиотек из стоковой прошивки. Некоторые проблемы — например, неработающий сканер отпечатков или камера — решаются подменой соответствующих HAL-компонентов, но это уже требует глубокого понимания vendor-интерфейсов конкретной модели.

⚠️ Внимание: прошивка модифицированных образов может привести к состоянию soft-brick, когда устройство не загружается в систему. Перед экспериментами убедитесь, что у вас есть способ вернуть стоковую прошивку — заводской образ и рабочий доступ к fastboot или режиму восстановления производителя.

Прошивка самого образа обычно выполняется через fastboot:

fastboot flash system system.img

fastboot -w

fastboot reboot

Команда fastboot -w очищает userdata — без сброса данных после смены системного образа устройство часто не загружается из-за конфликта настроек. На устройствах с dynamic partitions порядок действий отличается: образ прошивается в fastbootd-режиме внутри super-раздела, и точную процедуру нужно смотреть в документации или ветках сообщества по конкретной модели.

Почему GSI загружается, но не работает звук или мобильная сеть

Наиболее вероятная причина — несовпадение vendor-интерфейсов. GSI рассчитана на стандартный HIDL/AIDL-контракт, но производители иногда расширяют его собственными вызовами. Проверьте логи через adb logcat на предмет ошибок аудио-HAL и RIL, сравните версию VNDK образа с версией vendor-раздела устройства. Часто помогает подбор GSI под правильную версию VNDK.

Типичные ошибки и их диагностика

Почти все проблемы с GSI делятся на три группы: устройство не загружается, система загружается с неработающими функциями, либо работает нестабильно. Для диагностики первого случая главный инструмент — логи загрузки: если устройство позволяет, снимите adb logcat на ранней стадии или изучите pstore/ramoops, если ядро его поддерживает.

  • 🔄 Bootloop — чаще всего несовпадение типа разметки, SELinux-конфликты или несовместимость версии vendor;
  • 📵 Нет сети/звонков — проблемы с RIL, несовпадение радио-интерфейсов vendor;
  • 📷 Не работает камера — отсутствуют или конфликтуют camera-HAL библиотеки;
  • 🔋 Быстрый разряд — отсутствуют overlay-настройки энергосбережения под конкретное железо.

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

Тестирование и публикация сборки

Google предусмотрел формальный механизм проверки GSI — наборы тестов CTS-on-GSI и VTS, которые проверяют соответствие образа и vendor-раздела требованиям совместимости. Для любительских сборок полный прогон тестов необязателен, но базовый чек-лист проверить стоит: звонки, мобильный интернет, Wi-Fi, Bluetooth, камера, датчики, воспроизведение звука и видео, работа биометрии.

При публикации сборки указывайте архитектуру, тип разметки, версию VNDK и перечень известных неработающих функций. Честное описание ограничений экономит время и вам, и пользователям: большинство негативных отзывов на GSI-сборки связано не с ошибками разработчика, а с установкой образа на несовместимое устройство.

Часто задаваемые вопросы

Можно ли установить GSI на устройство без Project Treble?

Нет, полноценная установка GSI невозможна без Treble — системный раздел не сможет взаимодействовать с vendor-компонентами. Для старых устройств существуют только модифицированные кастомные прошивки, собранные специально под модель, но это уже не GSI.

Чем GSI отличается от обычной кастомной прошивки?

Кастомная прошивка собирается под конкретную модель и включает device-specific ядро и vendor-часть. GSI — универсальный системный образ, который работает поверх штатного vendor-раздела любого Treble-совместимого устройства. Поэтому одна и та же GSI может загружаться на десятках разных моделей.

Устройство ушло в bootloop после прошивки GSI. Что делать?

Сначала проверьте, соответствует ли образ архитектуре и типу разметки устройства — это самая частая причина. Затем попробуйте прошить образ заново с очисткой userdata (fastboot -w). Если не помогло, верните стоковую прошивку через заводской образ и fastboot либо фирменную утилиту производителя.

Нужен ли root для установки GSI?

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

Будут ли работать сервисы Google на GSI?

Только если они интегрированы в конкретную сборку. Чистый образ AOSP не содержит GMS, поэтому разработчики обычно выпускают отдельные варианты с предустановленными сервисами Google. Перед установкой проверяйте описание сборки.