Руководство по созданию собственной прошивки на AOSP

Содержание

Введение

AOSP (Android Open Source Project) — это открытый исходный код операционной системы Android, поддерживаемый Google. Создание собственной прошивки на основе AOSP позволяет получить полный контроль над системой, добавить новые функции, улучшить производительность и безопасность, а также убрать нежелательные компоненты.

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

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

Системные требования

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

Внимание! Сборка AOSP требует значительных вычислительных ресурсов и может занять от нескольких часов до суток в зависимости от мощности вашего компьютера и объема включаемых компонентов.

Установка необходимых пакетов

Для начала работы с AOSP необходимо установить набор инструментов разработки. Выберите вашу операционную систему:

Ubuntu

Для Ubuntu 20.04/22.04:

sudo apt update
sudo apt install git-core gnupg flex bison build-essential zip curl zlib1g-dev gcc-multilib g++-multilib libc6-dev-i386 lib32ncurses5-dev x11proto-core-dev libx11-dev lib32z1-dev libgl1-mesa-dev libxml2-utils xsltproc unzip fontconfig

Установите JDK 11:

sudo apt install openjdk-11-jdk

Установите Python и необходимые инструменты:

sudo apt install python3 python3-pip
pip3 install argparse mkdocs ninja mako jinja2

Debian

Для Debian 11 (Bullseye) или новее:

sudo apt update
sudo apt install git-core gnupg flex bison build-essential zip curl zlib1g-dev gcc-multilib g++-multilib libc6-dev-i386 lib32ncurses5-dev x11proto-core-dev libx11-dev lib32z1-dev libgl1-mesa-dev libxml2-utils xsltproc unzip fontconfig

Установите JDK 11:

sudo apt install openjdk-11-jdk

Установите Python и необходимые инструменты:

sudo apt install python3 python3-pip
pip3 install argparse mkdocs ninja mako jinja2

Fedora

Для Fedora 36 или новее:

sudo dnf update
sudo dnf install git curl wget gcc gcc-c++ glibc-devel.{x86_64,i686} zlib-devel.{x86_64,i686} libstdc++-devel.{x86_64,i686} ncurses-devel.{x86_64,i686} zlib-devel bison flex gperf SDL-devel readline-devel squashfs-tools ncurses-devel bzip2-devel make libxml2-utils unzip perl-Digest-SHA

Установите JDK 11:

sudo dnf install java-11-openjdk-devel

Установите Python и необходимые инструменты:

sudo dnf install python3 python3-pip
pip3 install argparse mkdocs ninja mako jinja2

Arch Linux

Для Arch Linux и его производных:

sudo pacman -Syu
sudo pacman -S git gnupg flex bison gcc gcc-libs gperf sdl wxgtk2 squashfs-tools curl ncurses zlib schedtool perl-switch zip unzip libxslt python2 python-virtualenv bc rsync ccache lib32-zlib lib32-ncurses lib32-readline lib32-gcc-libs jdk11-openjdk

Установите AUR-пакеты (с помощью yay или другого менеджера AUR):

yay -S lib32-ncurses5-compat-libs lib32-readline5

Установите необходимые инструменты Python:

pip install argparse mkdocs ninja mako jinja2

macOS

Для macOS, сначала установите Homebrew, если его нет:

ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

Затем установите необходимые инструменты:

brew install git gnupg coreutils findutils gnu-sed gawk gnu-getopt
brew install openssl python ninja
pip3 install argparse mkdocs mako jinja2

Установите JDK 11:

brew tap homebrew/cask
brew install --cask temurin11
Примечание: macOS имеет ограниченную поддержку для сборки AOSP и может потребовать дополнительных настроек для работы с чувствительными к регистру файловыми системами.

Настройка рабочей среды

Перед началом сборки AOSP необходимо настроить некоторые переменные окружения и создать рабочую директорию.

Создание рабочей директории

mkdir -p ~/android/aosp
cd ~/android/aosp

Настройка переменных окружения

Добавьте следующие строки в ваш ~/.bashrc или ~/.zshrc:

# Настройка для AOSP
export USE_CCACHE=1
export CCACHE_EXEC=/usr/bin/ccache
export CCACHE_DIR=~/.ccache
export JACK_SERVER_VM_ARGUMENTS="-Dfile.encoding=UTF-8 -XX:+TieredCompilation -Xmx4g"
export ANDROID_JACK_VM_ARGS="-Dfile.encoding=UTF-8 -XX:+TieredCompilation -Xmx4g"

Примените изменения в текущей сессии:

source ~/.bashrc  # или source ~/.zshrc если используете zsh

Настройка ccache

Для ускорения повторных сборок рекомендуется настроить ccache с большим размером кэша:

ccache -M 50G
Совет: Размер кэша можно настроить в зависимости от доступного места на диске, но для комфортной работы рекомендуется не менее 50 ГБ.

Инициализация репозитория

Для работы с исходным кодом AOSP используется инструмент repo. Сначала установим его:

mkdir -p ~/bin
curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
chmod a+x ~/bin/repo
export PATH=~/bin:$PATH

Добавьте export PATH=~/bin:$PATH в ваш ~/.bashrc или ~/.zshrc для постоянного эффекта.

Настройка Git

git config --global user.name "Ваше имя"
git config --global user.email "ваш.email@example.com"

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

Теперь можно инициализировать репозиторий и загрузить исходный код AOSP. Это может занять несколько часов в зависимости от скорости вашего интернет-соединения.

Инициализация репозитория

cd ~/android/aosp
repo init -u https://android.googlesource.com/platform/manifest -b android-13.0.0_r24
Примечание: android-13.0.0_r24 - это тег для Android 13. Вы можете выбрать другую версию Android заменив этот тег на нужный. Список доступных тегов можно найти на сайте Android Source.

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

repo sync -c -j$(nproc --all) --force-sync --no-clone-bundle --no-tags
Внимание! Эта команда загрузит около 100 ГБ данных и может занять очень много времени в зависимости от скорости интернета. Рекомендуется запускать её в screen или tmux сессии, чтобы процесс не прервался при разрыве соединения.

Параметры команды:

Добавление поддержки устройства

Для сборки прошивки для конкретного устройства необходимо добавить его конфигурационные файлы. Есть несколько способов получить их:

Использование LineageOS как источника

LineageOS содержит конфигурации для многих устройств. Создайте файлы для подключения репозиториев:

Создайте файл local_manifests:

mkdir -p .repo/local_manifests

Создайте файл .repo/local_manifests/[ваше_устройство].xml со следующим содержимым (пример для Google Pixel 6):

<?xml version="1.0" encoding="UTF-8"?>
<manifest>
  <project name="LineageOS/android_device_google_gs101" path="device/google/gs101" remote="github" />
  <project name="LineageOS/android_device_google_pixel-common" path="device/google/pixel-common" remote="github" />
  <project name="LineageOS/android_device_google_raviole" path="device/google/raviole" remote="github" />
  <project name="LineageOS/android_kernel_google_gs101" path="kernel/google/gs101" remote="github" />
  <project name="LineageOS/android_vendor_google" path="vendor/google" remote="github" />
</manifest>

Затем синхронизируйте эти репозитории:

repo sync -j$(nproc --all)
Примечание: Вам нужно заменить пути и названия репозиториев согласно вашему устройству. Информацию о нужных репозиториях можно найти в GitHub организации LineageOS или других кастомных прошивок.

Создание собственных конфигураций

Если для вашего устройства нет готовых конфигураций, вам придется создать их самостоятельно. Для этого нужно:

  1. Создать директорию device/[производитель]/[кодовое_имя]
  2. Создать основные конфигурационные файлы:
    • AndroidProducts.mk
    • BoardConfig.mk
    • device.mk
    • [кодовое_имя].mk
  3. Добавить драйверы и бинарные файлы в vendor/[производитель]/[кодовое_имя]

Это сложный процесс, требующий хороших знаний структуры Android и опыта работы с ним.

Сборка прошивки

После добавления конфигурации устройства можно приступать к сборке прошивки.

Подготовка окружения сборки

cd ~/android/aosp
source build/envsetup.sh

Выбор цели сборки

Выберите конфигурацию вашего устройства:

lunch aosp_[кодовое_имя]-[вариант]

Например, для Google Pixel 6 в режиме разработчика:

lunch aosp_oriole-userdebug

Варианты сборки:

Начало сборки

make -j$(nproc --all)
Совет: Для ускорения сборки можно использовать меньшее количество ядер, если ваша система не имеет достаточно ОЗУ. Например, make -j8 для использования 8 ядер.

Процесс сборки может занять от 1 до 8 часов в зависимости от мощности вашего компьютера.

Сборка только системного образа

Если вам нужно собрать только системный образ (например, после внесения изменений):

make systemimage -j$(nproc --all)

Результаты сборки

После успешной сборки, файлы прошивки будут находиться в директории:

~/android/aosp/out/target/product/[кодовое_имя]/

Основные файлы:

Кастомизация прошивки

Теперь рассмотрим как можно настроить и изменить прошивку по своему вкусу.

Добавление собственного приложения

Для добавления своего приложения в прошивку:

  1. Создайте директорию для приложения: mkdir -p packages/apps/МоеПриложение
  2. Поместите исходный код в эту директорию
  3. Создайте файл Android.mk с описанием сборки
  4. Добавьте приложение в список для сборки, добавив в device/[производитель]/[кодовое_имя]/device.mk:
    PRODUCT_PACKAGES += \
        МоеПриложение

Изменение системных настроек по умолчанию

Для изменения настроек системы по умолчанию:

mkdir -p device/[производитель]/[кодовое_имя]/overlay/frameworks/base/core/res/res/values/

Создайте файл config.xml в этой директории:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <!-- Пример настройки -->
    <bool name="config_dozeAlwaysOnEnabled">true</bool>
</resources>

Настройка темы и брендинга

Для изменения брендинга прошивки:

  1. Измените логотип загрузки: device/[производитель]/[кодовое_имя]/bootanimation.zip
  2. Измените обои по умолчанию: frameworks/base/core/res/res/drawable-nodpi/default_wallpaper.png
  3. Создайте оверлей для SystemUI с вашими изменениями

Изменение ядра системы

Для модификации ядра:

cd kernel/[производитель]/[кодовое_имя]
make menuconfig  # Интерфейс конфигурации ядра

После внесения изменений, пересоберите ядро и затем снова соберите образ boot.img:

cd ~/android/aosp
make bootimage -j$(nproc --all)
Предупреждение: Модификация ядра требует хорошего понимания работы Linux и может привести к нестабильной работе устройства при неправильных настройках.

Прошивка устройства

После успешной сборки прошивки нужно установить её на устройство.

Подготовка устройства

  1. Включите режим разработчика на устройстве:
    • Перейдите в Настройки → О телефоне
    • Нажмите на номер сборки 7 раз
  2. Включите отладку по USB:
    • Перейдите в Настройки → Для разработчиков
    • Включите "Отладка по USB"
  3. Разблокируйте загрузчик (bootloader):
    adb reboot bootloader
    fastboot flashing unlock

    Подтвердите разблокировку на устройстве.

Внимание! Разблокировка загрузчика приведет к полной очистке данных устройства. Сделайте резервную копию всех важных данных перед продолжением.

Прошивка образов

Для прошивки полного набора образов:

cd ~/android/aosp
export DEVICE=[кодовое_имя]
fastboot flash boot out/target/product/$DEVICE/boot.img
fastboot flash system out/target/product/$DEVICE/system.img
fastboot flash vendor out/target/product/$DEVICE/vendor.img
fastboot flash dtbo out/target/product/$DEVICE/dtbo.img
fastboot flash vbmeta out/target/product/$DEVICE/vbmeta.img --disable-verification
fastboot reboot

Альтернативный метод с помощью fastboot update

Можно также использовать OTA-пакет для прошивки:

fastboot update out/target/product/$DEVICE/[название-пакета].zip

Первый запуск

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

Устранение неполадок

При создании и установке кастомной прошивки могут возникнуть различные проблемы. Вот решения для наиболее распространенных из них:

Проблемы при сборке

Ошибка "command not found"

source build/envsetup.sh

Убедитесь, что вы выполнили инициализацию окружения сборки.

Ошибки компиляции

Попробуйте выполнить чистую сборку:

make clean
make clobber
source build/envsetup.sh
lunch aosp_[кодовое_имя]-userdebug
make -j$(nproc --all)

Недостаточно места на диске

Освободите место и удалите ненужные файлы:

cd ~/android/aosp
rm -rf out/target/product/*/obj/PACKAGING/

Проблемы при установке

Устройство не определяется через ADB

Ошибка "no permissions" в fastboot

Добавьте правила udev для вашего устройства:

sudo nano /etc/udev/rules.d/51-android.rules

Добавьте строку:

SUBSYSTEM=="usb", ATTR{idVendor}=="[ID производителя]", MODE="0666", GROUP="plugdev"

Затем:

sudo chmod a+r /etc/udev/rules.d/51-android.rules
sudo service udev restart

Зацикливание загрузки (bootloop)

Вернитесь в стоковую прошивку:

fastboot flash system stock_system.img
fastboot flash boot stock_boot.img
fastboot reboot

Невозможно смонтировать /system

Проблема может быть в несовместимости файловой системы или неправильном формате раздела. Попробуйте:

fastboot format:ext4 system
fastboot flash system system.img

Дополнительные возможности

Подпись образов прошивки

Для дополнительной безопасности рекомендуется подписывать образы прошивки:

cd ~/android/aosp
source build/envsetup.sh
lunch aosp_[кодовое_имя]-userdebug
make -j$(nproc --all) target-files-package

Создание ключей подписи:

mkdir -p ~/.android-certs
development/tools/make_key ~/.android-certs/releasekey '/C=US/ST=California/L=Mountain View/O=Android/OU=Android/CN=Android/emailAddress=android@android.com'
development/tools/make_key ~/.android-certs/platform '/C=US/ST=California/L=Mountain View/O=Android/OU=Android/CN=Android/emailAddress=android@android.com'
development/tools/make_key ~/.android-certs/shared '/C=US/ST=California/L=Mountain View/O=Android/OU=Android/CN=Android/emailAddress=android@android.com'
development/tools/make_key ~/.android-certs/media '/C=US/ST=California/L=Mountain View/O=Android/OU=Android/CN=Android/emailAddress=android@android.com'

Подпись образа:

sign_target_files_apks -o -d ~/.android-certs \
    out/target/product/$DEVICE/obj/PACKAGING/target_files_intermediates/*-target_files-*.zip \
    signed-target_files.zip

ota_from_target_files -k ~/.android-certs/releasekey \
    signed-target_files.zip \
    signed-ota_update.zip

Автоматизация сборки

Для автоматизации процесса сборки можно создать скрипт сборки:

#!/bin/bash
# build_aosp.sh

# Настройка переменных
DEVICE="[кодовое_имя]"
VARIANT="userdebug"
THREADS=$(nproc --all)
BUILD_DIR="$HOME/android/aosp"

# Переход в директорию сборки
cd $BUILD_DIR

# Инициализация среды сборки
source build/envsetup.sh

# Выбор цели сборки
lunch aosp_${DEVICE}-${VARIANT}

# Очистка предыдущей сборки
make clean

# Запуск сборки
make -j${THREADS}

# Проверка успешности сборки
if [ $? -eq 0 ]; then
    echo "Сборка успешно завершена!"
    echo "Файлы прошивки находятся в: $BUILD_DIR/out/target/product/$DEVICE/"
else
    echo "Во время сборки произошла ошибка!"
    exit 1
fi

Сделайте скрипт исполняемым и запустите его:

chmod +x build_aosp.sh
./build_aosp.sh

Непрерывная интеграция (CI)

Для организации автоматической сборки при изменениях в репозитории можно использовать Jenkins или GitHub Actions:

Пример конфигурации для GitHub Actions (.github/workflows/build.yml):

name: Build AOSP

on:
  push:
    branches: [ main ]
  pull_request:
    branches: [ main ]

jobs:
  build:
    runs-on: ubuntu-latest
    container:
      image: ubuntu:20.04
      
    steps:
    - name: Install dependencies
      run: |
        apt-get update
        apt-get install -y git-core gnupg flex bison build-essential zip curl zlib1g-dev gcc-multilib g++-multilib libc6-dev-i386 lib32ncurses5-dev x11proto-core-dev libx11-dev lib32z1-dev libgl1-mesa-dev libxml2-utils xsltproc unzip python3 python3-pip openjdk-11-jdk

    - name: Setup repo tool
      run: |
        mkdir -p ~/bin
        curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
        chmod a+x ~/bin/repo
        export PATH=~/bin:$PATH

    - name: Initialize repo
      run: |
        mkdir -p ~/android/aosp
        cd ~/android/aosp
        repo init -u https://android.googlesource.com/platform/manifest -b android-13.0.0_r24
        
    - name: Sync repo
      run: |
        cd ~/android/aosp
        repo sync -c -j$(nproc --all) --force-sync --no-clone-bundle --no-tags

    - name: Build AOSP
      run: |
        cd ~/android/aosp
        source build/envsetup.sh
        lunch aosp_[кодовое_имя]-userdebug
        make -j$(nproc --all)
        
    - name: Upload artifacts
      uses: actions/upload-artifact@v2
      with:
        name: aosp-images
        path: ~/android/aosp/out/target/product/[кодовое_имя]/*.img

Заключение

Создание собственной прошивки на базе AOSP — это сложный, но увлекательный процесс, который даёт полный контроль над системой Android на вашем устройстве. В этом руководстве мы рассмотрели основные шаги от установки необходимых инструментов до сборки и установки готовой прошивки.

Ключевые преимущества собственной прошивки AOSP:

Помните, что работа с исходным кодом AOSP требует терпения, технических знаний и готовности к экспериментам. Не бойтесь искать помощь в сообществах разработчиков Android, таких как XDA Developers.