AOSP (Android Open Source Project) — это открытый исходный код операционной системы Android, поддерживаемый Google. Создание собственной прошивки на основе AOSP позволяет получить полный контроль над системой, добавить новые функции, улучшить производительность и безопасность, а также убрать нежелательные компоненты.
В этом руководстве мы рассмотрим полный процесс создания собственной прошивки на базе AOSP, начиная с установки необходимых инструментов и заканчивая созданием образа прошивки, готового к установке на устройство.
Перед началом работы убедитесь, что ваш компьютер соответствует минимальным требованиям для сборки AOSP:
Для начала работы с AOSP необходимо установить набор инструментов разработки. Выберите вашу операционную систему:
Для 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 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 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 и его производных:
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, сначала установите 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
Перед началом сборки 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 -M 50G
Для работы с исходным кодом 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 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
Параметры команды:
-c
- загружать только текущую ветку, а не всю историю-j$(nproc --all)
- использовать все доступные ядра процессора--force-sync
- перезаписывать любые локальные изменения--no-clone-bundle
- не использовать bundle, полезно при проблемах с подключением--no-tags
- не загружать теги Git, экономит времяДля сборки прошивки для конкретного устройства необходимо добавить его конфигурационные файлы. Есть несколько способов получить их:
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)
Если для вашего устройства нет готовых конфигураций, вам придется создать их самостоятельно. Для этого нужно:
device/[производитель]/[кодовое_имя]
AndroidProducts.mk
BoardConfig.mk
device.mk
[кодовое_имя].mk
vendor/[производитель]/[кодовое_имя]
Это сложный процесс, требующий хороших знаний структуры Android и опыта работы с ним.
После добавления конфигурации устройства можно приступать к сборке прошивки.
cd ~/android/aosp
source build/envsetup.sh
Выберите конфигурацию вашего устройства:
lunch aosp_[кодовое_имя]-[вариант]
Например, для Google Pixel 6 в режиме разработчика:
lunch aosp_oriole-userdebug
Варианты сборки:
user
- ограниченная версия для конечных пользователей (без root)userdebug
- похожа на user, но с root и отладочными возможностямиeng
- инженерная сборка с полным доступом к отладкеmake -j$(nproc --all)
make -j8
для использования 8 ядер.
Процесс сборки может занять от 1 до 8 часов в зависимости от мощности вашего компьютера.
Если вам нужно собрать только системный образ (например, после внесения изменений):
make systemimage -j$(nproc --all)
После успешной сборки, файлы прошивки будут находиться в директории:
~/android/aosp/out/target/product/[кодовое_имя]/
Основные файлы:
system.img
- образ системного разделаvendor.img
- образ раздела с проприетарными драйверамиboot.img
- образ раздела загрузки (ядро и initramfs)recovery.img
- образ раздела восстановленияuserdata.img
- образ раздела пользовательских данныхТеперь рассмотрим как можно настроить и изменить прошивку по своему вкусу.
Для добавления своего приложения в прошивку:
mkdir -p packages/apps/МоеПриложение
Android.mk
с описанием сборки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>
Для изменения брендинга прошивки:
device/[производитель]/[кодовое_имя]/bootanimation.zip
frameworks/base/core/res/res/drawable-nodpi/default_wallpaper.png
Для модификации ядра:
cd kernel/[производитель]/[кодовое_имя]
make menuconfig # Интерфейс конфигурации ядра
После внесения изменений, пересоберите ядро и затем снова соберите образ boot.img:
cd ~/android/aosp
make bootimage -j$(nproc --all)
После успешной сборки прошивки нужно установить её на устройство.
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
Можно также использовать OTA-пакет для прошивки:
fastboot update out/target/product/$DEVICE/[название-пакета].zip
Первая загрузка системы может занять больше времени, чем обычно. Это нормально, так как система выполняет начальную оптимизацию и настройку.
При создании и установке кастомной прошивки могут возникнуть различные проблемы. Вот решения для наиболее распространенных из них:
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 devices
и убедитесь, что устройство в спискеДобавьте правила 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
Вернитесь в стоковую прошивку:
fastboot flash system stock_system.img
fastboot flash boot stock_boot.img
fastboot reboot
Проблема может быть в несовместимости файловой системы или неправильном формате раздела. Попробуйте:
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
Для организации автоматической сборки при изменениях в репозитории можно использовать 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.