AOSP сборка · 11 min read · Nov 26, 2025

Создание и прошивка защищенной сборки AOSP с проверенной загрузкой и отдельным паролем блокировки для Nexus 5X

Отказ от ответственности и лицензия

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

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

Если не указано иное, содержание этой страницы лицензировано по лицензии Creative Commons Attribution 3.0, а образцы кода лицензированы по лицензии Apache 2.0.

Мотивация

Nexus 5X и 6P были первыми устройствами, которые поддерживали проверенную загрузку на основе ключей подписи, предоставленных пользователем (а не навязываемых поставщиком). Перед его “взрывом” [1] CopperheadOS (вариант AOSP с улучшенной безопасностью) предоставлял хорошую документацию и скрипты для создания и прошивки безопасной версии AOSP [2]. Однако проект перестал предоставлять какие-либо обновления в последние месяцы, поэтому большинство бывших пользователей ищут жизнеспособные альтернативы.

Мое впечатление таково, что многие пользователи согласны с тем, что запуск самособранного ROM AOSP является гораздо лучшей альтернативой другим вариантам, таким как переход на, например, LineageOS. Есть несколько хороших причин для этого:

  • AOSP является обычным стоком и имеет лишь несколько потенциально нежелательных функций
  • AOSP может быть собран как “user” вместо “userdebug” и, таким образом, ожидается, что он будет более безопасным (я пытался компилировать пользовательские сборки LineageOS, но они, похоже, сломаны из-за инвазивных изменений, внесенных LineageOS в исходные коды AOSP)
  • Как только исходные коды загружены, AOSP может быть просто собран. В отличие от LineageOS, он не начинает загружать дополнительные исходные коды во время сборки.

Поскольку Nexus 5X считается хорошо поддерживаемым устройством для разработчиков, я ожидал, что процесс сборки AOSP будет простым и хорошо документированным. Однако оказывается, что есть несколько подводных камней:

  • включение двоичных файлов поставщика, следуя официальной документации, приводит к неполным сборкам, которые не могут быть использованы для инкрементальных обновлений без разблокировки и очистки каждый раз (раздел поставщика, радио ROM и т.д. не включены в сборку)
  • официальная документация не описывает, как использовать проверенную сборку таким образом, который можно было бы непосредственно применить. В документации CopperheadOS [05] есть лучшая документация, но инструкции полагаются на устаревшие скрипты, которые не применимы для AOSP.
  • нет документации о том, как использовать “слабый” PIN-код в качестве пароля, но сильный пароль в качестве ключа шифрования диска (в отличие от новых устройств Pixel, Nexus 5X основан на старом подходе FDE). Методы, которые работают для устройств LineageOS, не применимы, так как они предполагают, что устройство имеет root-доступ, что не так для обычных пользовательских сборок AOSP.

Это руководство направлено на предоставление подробных инструкций о том, как решить эти подводные камни, создать и прошить AOSP для Nexus 5X с проверенной загрузкой и использовать отдельные секреты блокировки/шифрования. Оно также должно применяться для Nexus 6P с небольшими изменениями, но я не смог протестировать это, так как у меня не было под рукой Nexus 6P.

За исключением небольшой коллекции скриптов (необходимых для правильного извлечения двоичных файлов поставщика из файлов, предоставленных Google) и его зависимости “oatdump” (которая загружается как двоичный файл из публичного хранилища), инструкции не используют никаких “неофициальных” (в смысле “не предоставленных Google”) сторонних ресурсов.

Имейте в виду следующие проблемы с свободой:

  • Дерево исходных кодов AOSP содержит ряд предварительно собранных двоичных файлов (например, инструментальная цепочка, ядро Linux и т.д.). Хотя эти двоичные файлы могут быть пересобраны из исходников, необходимые шаги не охвачены в этом руководстве.
  • Исходный код для двоичных файлов поставщика, необходимых для использования многих аппаратных компонентов Nexus 5X, не доступен публично!
  • Инструмент “android-prepare-vendor”, используемый для извлечения проприетарных файлов поставщика, сам использует предварительно собранные двоичные файлы (некоторые даже размещены внешне).

Требования и предположения

Руководство предполагает, что у вас есть следующие предварительные условия (другие версии/распределения также могут работать, но могут потребовать другие или дополнительные пакеты):

  • Nexus 5X с разблокированным загрузчиком (разблокировка не охвачена в этом руководстве)

  • (виртуальная) машина, работающая под управлением Debian9 в варианте x86_64, используемая исключительно для нашей цели (мы предполагаем, что вы используете sudo, если нет, адаптируйте команды)

  • как минимум 5 ГБ оперативной памяти (больше - лучше)

  • примерно 200 МБ дискового пространства

  • быстрое интернет-соединение (нам нужно загрузить около 30 ГБ данных)

Установка зависимостей

Сначала установите зависимости, как описано в инструкциях по сборке LineageOS [3] (инструкции по сборке AOSP не предоставляют этот список):

sudo apt install bc bison build-essential ccache curl flex g++-multilib gcc-multilib git gnupg gperf imagemagick lib32ncurses5-dev lib32readline-dev lib32z1-dev liblz4-tool libncurses5-dev libsdl1.2-dev libssl-dev libwxgtk3.0-dev libxml2 libxml2-utils lzop pngcrush rsync schedtool squashfs-tools xsltproc zip zlib1g-dev

Теперь установите дополнительные зависимости:

sudo apt install cmake zip unzip openjdk-8-jdk-headless

Затем создайте путь bin в вашем домашнем каталоге (в Debian 9 этот путь автоматически настраивается в профиле bash):

mkdir -p ~/bin

Установите команду repo:

curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo  
chmod a+x ~/bin/repo

Проверьте контрольную сумму двоичного файла repo. Она должна быть e147f0392686c40cfd7d5e6f332c6ee74c4eab4d24e2694b3b0a0c037bf51dc5 для текущей версии 1.23. Для более поздних версий проверьте страницу инструкций по сборке AOSP [4]. Используйте следующую команду для вычисления контрольной суммы:

sha256sum ~/bin/repo

Затем предоставьте идентификацию git, выполнив следующие команды (вы можете оставить примерные данные, если предпочитаете оставаться анонимным):

git config --global user.email "[email protected]"
git config --global user.name "Ваше Имя"

К сожалению, пакет brotli (необходимый для упаковки сборок) в Debian 9 слишком старый, поэтому нам нужно собрать текущую версию самостоятельно. Сначала получите исходный код и перейдите в его директорию:

git clone https://github.com/google/brotli.git

Запустите сборку (замените -j15 на количество ваших потоков процессора):

cd ~/brotli
./configure-cmake
make -j15

Наконец, скопируйте полученный двоичный файл в наш путь bin:

cp brotli ~/bin/

Наконец, выйдите из системы и войдите снова, чтобы ваш профиль bash был прочитан снова.

Получение двоичных файлов поставщика

Существует несколько проблем с использованием двоичных файлов поставщика из пакетов драйверов, предоставленных Google (см. [5]). Чтобы решить их, мы используем набор внешних скриптов “android-prepare-vendor” от “anestisb”, который извлекает двоичные файлы поставщика из заводских образов.

Сначала клонируйте репозиторий:

git clone https://github.com/anestisb/android-prepare-vendor.git

Используя сайт Google [6], узнайте последний тег сборки для вашего Nexus 5X (в настоящее время это OPM6.171019.030.K1).

Перейдите в репозиторий, создайте выходной каталог и запустите скрипт (мы запускаем скрипт от имени root из-за проблем с fuse в Debian 9):

cd android-prepare-vendor
mkdir bullhead-blobs
sudo ./execute-all.sh -k -d bullhead -a bullhead -b OPM6.171019.030.K1 -o bullhead-blobs

Загрузка исходников AOSP

Примечание: В следующих шагах отсутствуют инструкции по проверке загруженного исходного кода.

Сначала создайте каталог, в котором будут храниться исходники:

mkdir -p ~/aosp

Зная текущий тег сборки для Nexus 5X, узнайте, какой соответствующий тег Android, используя обзор, доступный на [6]. Затем выполните checkout манифеста Android для соответствующей ветки (в этом примере мы используем android-8.1.0_r46):

cd ~/aosp
repo init -u https://android.googlesource.com/platform/manifest -b android-8.1.0_r46

как обычно в XML для комментирования репозиториев. Я рекомендую исключить/заменить следующее:

  • - QuickSearchBox в любом случае в AOSP в основном сломан
  • - замените это на репозиторий, который содержит исправленное дерево устройства, где два неисправных ядра процессора отключены. Это приведет к снижению производительности примерно на 30%. Тем не менее, рекомендуется, даже если у вас Nexus 5X, который не подвержен bootloop, так как, вероятно, он будет подвержен этому в будущем.
  • - есть лучшие альтернативы стандартному календарю AOSP, которые вы можете установить позже (например, Etar)
  • - Silence.im является лучшей альтернативой для приложения обмена сообщениями AOSP
  • - OpenCamera является лучшей альтернативой для стандартной камеры

Теперь загрузите все репозитории (это может занять много времени, в основном в зависимости от вашего интернет-соединения):

repo sync

Наконец, скопируйте ранее сгенерированные двоичные файлы поставщика от имени root (это необходимо, иначе qmus и другие двоичные файлы будут отсутствовать и вызовут сбой компиляции) в каталог vendor вашего дерева AOSP (замените номер заводской сборки на текущий):

sudo cp -av ~/android-prepare-vendor/bullhead-blobs/bullhead/opm6.171019.030.k1/vendor .
sudo cp -av ~/android-prepare-vendor/bullhead-blobs/bullhead/opm6.171019.030.k1/vendor_overlay .

Сделайте вашего пользователя владельцем каталогов vendor (иначе сборка позже потерпит неудачу). Замените yourusername на ваше фактическое имя пользователя:

sudo chown -R yourusername:yourusername ~/aosp/vendor
sudo chown -R yourusername:yourusername ~/aosp/vendor_overlay

Генерация ключей

Установите переменные сборки:

source build/envsetup.sh

Соберите инструмент, необходимый для генерации ключа проверки:

make generate_verity_key

Создайте каталог для хранения ваших ключей (документы CopperheadOS [2] рекомендуют использовать отдельный ключ для каждого устройства, в данном случае bullhead):

mkdir -p keys/bullhead

Теперь пришло время сгенерировать ключи (не устанавливайте пароли на ваши ключи):

cd keys/bullhead
../../development/tools/make_key releasekey '/C=DE/ST=Hometown/L=XX/O=yournamehere/OU=yournamehere/CN=yournamehere/[email protected]'
../../development/tools/make_key platform '/C=DE/ST=Hometown/L=XX/O=yournamehere/OU=yournamehere/CN=yournamehere/[email protected]'
../../development/tools/make_key shared '/C=DE/ST=Hometown/L=XX/O=yournamehere/OU=yournamehere/CN=yournamehere/[email protected]'
../../development/tools/make_key media '/C=DE/ST=Hometown/L=XX/O=yournameher /OU=yournamehere/CN=yournamehere/[email protected]'
../../development/tools/make_key verity '/C=DE/ST=Hometown/L=XX/O=yournamehere/OU=yournamehere/CN=yournamehere/[email protected]'
cd ~/aosp  

Преобразуйте ключ проверки в формат, требуемый AOSP:

out/host/linux-x86/bin/generate_verity_key -convert keys/bullhead/verity.x509.pem keys/bullhead/verity_key

Компиляция

Убедитесь, что ваши переменные сборки установлены:

cd ~/aosp
source build/envsetup.sh

Создайте конфигурацию lunch для устройства bullhead (замените user на userdebug, если хотите конфигурацию userdebug вместо этого):

lunch aosp_bullhead-user

Отключите Jack (он часто вызывает проблемы при компиляции и был устаревшим в Android 9):

export ANDROID_COMPILE_WITH_JACK=false

Скомпилируйте пакет целевых файлов (замените -j15 на количество ваших потоков процессора):

make target-files-package -j15

Упаковка и подписание

Создайте каталог для хранения выходных файлов (вне обычного каталога сборки под названием out):

mkdir dist

Запустите целевой dist (замените -j15 на количество ваших потоков процессора):

make dist -j15

Создайте пакет signed-target-files, заменив стандартные тестовые ключи на ваши ключи (замените yourusername на ваше фактическое имя пользователя в системе):

build/tools/releasetools/sign_target_files_apks -o -d keys/bullhead --replace_verity_public_key keys/bullhead/verity_key.pub --replace_verity_private_key keys/bullhead/verity --replace_verity_keyid keys/bullhead/verity.x509.pem out/dist/aosp_bullhead-target_files-eng.yourusername.zip dist/signed-target-files.zip

Создайте подписанный OTA пакет:

 build/tools/releasetools/ota_from_target_files -k keys/bullhead/releasekey dist/signed-target-files.zip dist/signed-ota-update.zip

Прошивка

Загрузите ваше устройство Nexus 5X в загрузчик (удерживайте кнопку уменьшения громкости, затем нажмите кнопку питания).

Подключите ваше устройство через USB к вашему компьютеру (и сделайте его доступным для виртуальной машины, если вы собираете в виртуальной машине). Вы также можете скопировать содержимое из каталога dist на другой компьютер и прошить оттуда, но мы предполагаем, что вы прошиваете, используя двоичные файлы fastboot/adb, собранные из исходников AOSP (если вы прошиваете снаружи, убедитесь, что ваш двоичный файл fastboot актуален).

Распакуйте образы из signed-target-files.zip:

cd ~/aosp/dist
unzip `signed-target-files.zip IMAGES/*  
`

Теперь прошейте все образы:

../out/host/linux-x86/bin/fastboot flash boot boot.img
../out/host/linux-x86/bin/fastboot flash recovery recovery.img
../out/host/linux-x86/bin/fastboot flash vendor vendor.img
../out/host/linux-x86/bin/fastboot flash system system.img

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

Наконец, перезагрузитесь обратно в загрузчик и снова заблокируйте его (это сотрет все данные):

out/host/linux-x86/bin/fastboot flash oem locking

Вот и все!

Установка отдельных секретов загрузки/блокировки

Установка отдельного пароля для загрузки/блокировки может быть выполнена с помощью небольшого трюка:

  • Разблокируйте загрузчик (это сотрет все данные)
  • соберите и прошейте сборку userdebug (см. выше)
  • заблокируйте загрузчик
  • установите PIN-код/пароль блокировки с помощью интерфейса Android. Убедитесь, что вы выбрали правильный, потому что вы не сможете изменить его снова без очистки данных, как только переключитесь на пользовательскую сборку.
  • подключитесь к устройству через adb
  • от имени root выполните следующую команду: vdc cryptfs changepw password your-new-password
  • перезагрузите и убедитесь, что это работает
  • соберите обычную пользовательскую сборку (не разблокируйте загрузчик!)
  • прошейте пользовательскую сборку

Примечание: Без дополнительных шагов recovery не позволяет прошивать более старые сборки. Таким образом, вам нужно прошить пользовательскую сборку, которая новее вашей сборки userdebug!

Обработка обновлений

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

Затем очистите старый манифест (сделайте резервную копию, если вы внесли изменения, которые хотите повторить в обновленном):

cd ~/aosp
rm -rf .repo/manifests.git
rm -rf .repo/manifest.xml

Также очистите (тогда устаревшие) двоичные файлы поставщика и репозиторий prepare-vendor:

rm -rf ~/android-prepare-vendor
rm -rf vendor
rm -rf vendor_overlay

Также очистите дерево сборки и артефакты сборки:

rm -rf out
rm -rf dist

Затем повторите ТОЛЬКО следующие шаги:

  • Получение двоичных файлов поставщика
  • Загрузка исходников AOSP (это будет намного быстрее, потому что будут загружены только изменения)
  • Компиляция
  • Упаковка и подписание

В теории вы должны иметь возможность устанавливать обновления как новые OTA пакеты из recovery без очистки (так как они будут подписаны теми же - вашими - ключами). На практике это еще не работает (см. следующий раздел). Там вам также придется действовать следующим образом:

  • Сделайте резервную копию всех ваших данных
  • Разблокируйте загрузчик (ваши данные будут стерты)
  • Прошейте обновленные образы и снова заблокируйте загрузчик, как описано в разделе “Прошивка”

WIP: Подписанные OTA обновления

Этот раздел находится в разработке, описанные инструкции пока не работают!

В теории должно быть возможно создать и прошить подписанные OTA обновления из recovery. Однако все мои попытки сделать это привели к ошибке “Проверка подписи не удалась”. Поскольку это работает, когда используются файлы поставщика, предоставленные Google напрямую, вместо использования android-prepare-vendor, я предполагаю, что это связано с файлами поставщика или другими файлами (такими как образы загрузчика или радио), которые не были правильно подписаны.

Создайте подписанный OTA пакет следующим образом:

 build/tools/releasetools/ota_from_target_files -k keys/bullhead/releasekey dist/signed-target-files.zip dist/signed-ota-update.zip

Перезагрузитесь в recovery, используя физические кнопки вашего устройства.

В recovery вы увидите маленький символ android. Удерживайте кнопку питания и нажмите кнопку увеличения громкости, чтобы попасть в меню восстановления.

Теперь выберите “обновление из adb” с помощью физических кнопок вашего устройства.

Установите ваш подписанный OTA пакет:

out/host/linux-x86/bin/adb sideload dist/`signed-ota-update.zip`

Ссылки

[1] https://www.reddit.com/r/CopperheadOS/comments/8qdnn3/goodbye/

[2] https://copperhead.co/android/docs/building

[3] https://wiki.lineageos.org/devices/bullhead/build

[4] https://source.android.com/setup/build/downloading

[5] https://github.com/anestisb/android-prepare-vendor

[6] https://source.android.com/setup/start/build-numbers.html#source-code-tags-and-builds

Share: X/Twitter LinkedIn

Get new posts in your inbox

No spam. Unsubscribe anytime.