Kompilowanie Androida

Aby skompilować Androida, postępuj zgodnie z instrukcjami na tej stronie.

Konfigurowanie środowiska kompilacji

W katalogu roboczym uruchom skrypt envsetup.sh, aby skonfigurować środowisko kompilacji:

source build/envsetup.sh

Ten skrypt importuje kilka poleceń, które umożliwiają pracę z kodem źródłowym Androida, w tym polecenia używane na tej stronie. Aby wyświetlić źródło skryptu, otwórz platform/build/envsetup.sh. Aby wyświetlić wbudowaną pomoc, wpisz hmm.

Wybieranie celu

Zanim zaczniesz kompilować Androida, musisz określić cel kompilacji. Cel odzwierciedla platformę docelową, na którą kompilujesz. Aby określić cel kompilacji, użyj polecenia lunch i ciągu znaków reprezentującego cel. Przykład:

lunch aosp_cf_x86_64_only_phone-aosp_current-userdebug

Powinien się wyświetlić opis celu i środowiska kompilacji:

============================================
PLATFORM_VERSION_CODENAME=Baklava
PLATFORM_VERSION=Baklava
TARGET_PRODUCT=aosp_cf_x86_64_only_phone
TARGET_BUILD_VARIANT=userdebug
TARGET_ARCH=x86_64
TARGET_ARCH_VARIANT=silvermont
HOST_OS=linux
HOST_OS_EXTRA=Linux-6.10.11-1rodete2-amd64-x86_64-Debian-GNU/Linux-rodete
HOST_CROSS_OS=windows
BUILD_ID=BP1A.250305.020
OUT_DIR=out
============================================

Ciąg znaków reprezentujący cel ma ten format:

lunch product_name-release_config-build_variant

Składniki tego ciągu znaków to:

  • product_name to nazwa produktu, który chcesz skompilować, np. aosp_cf_x86_64_only_phone lub aosp_husky. Twój konkretny product_name może mieć własny format, ale format używany przez Google w przypadku swoich urządzeń ma te komponenty:

    • aosp odnosi się do projektu Android Open Source Project.
    • Opcjonalnie, jeśli celem jest uruchomienie w emulatorze Cuttlefish, dodawany jest ciąg znaków cf.
    • Nazwa kodowa architektury i sprzętu, np. x86_64_only_phone lub husky, która jest nazwą kodową Pixela 8 Pro. Listę nazw kodowych urządzeń Google znajdziesz w artykule Nazwy kodowe urządzeń.
  • release_config jest ustawiony na konfigurację wersji, np. konfigurację wersji deweloperskiej o nazwie aosp_current. Konfiguracja wersji określa niektóre funkcje i kod, które są ukryte za flagami uruchamiania funkcji i są włączone lub wyłączone w kompilacji. Więcej informacji o konfiguracjach wersji znajdziesz w artykule Ustawianie wartości flag funkcji.

  • Część ciągu znaków build_variant może mieć jedną z 3 wartości w tej tabeli:

    build_variant Opis
    user Ta wersja kompilacji zapewnia ograniczony dostęp do zabezpieczeń i jest odpowiednia do środowiska produkcyjnego.
    userdebug Ta wersja kompilacji pomaga deweloperom urządzeń zrozumieć wydajność i zużycie energii w wersjach w trakcie opracowywania. Podczas programowania z użyciem kompilacji userdebug postępuj zgodnie z wytycznymi dotyczącymi kompilacji userdebug.
    eng Ta wersja kompilacji ma krótszy czas kompilacji i najlepiej nadaje się do codziennych środowisk programistycznych (gdzie wydajność i zużycie energii są mniej ważne).

Jeśli uruchomisz polecenie lunch bez argumentów, wyświetli się lista typowych celów.lunch Aby utworzyć niestandardowe ciągi znaków celu, połącz elementy ciągu znaków celu z nazwami kodowymi sprzętu. Listę nazw kodowych znajdziesz w artykule Nazwy kodowe urządzeń.

Wyświetlanie bieżącego celu

Aby wyświetlić bieżące ustawienia polecenia lunch, uruchom:

$ echo "$TARGET_PRODUCT-$TARGET_BUILD_VARIANT"

Kompilowanie kodu

Aby skompilować cel, uruchom to polecenie. W zależności od specyfikacji stacji roboczej pierwsza kompilacja może potrwać od niecałej godziny do kilku godzin. Kolejne kompilacje trwają znacznie krócej.

m

Dane wyjściowe kompilacji pojawiają się w $OUT_DIR. Jeśli skompilujesz różne cele, każda kompilacja celu pojawi się w $OUT_DIR.

Polecenie m kompiluje od góry drzewa, więc możesz je uruchomić z podkatalogów.m Jeśli masz ustawioną zmienną środowiskową TOP, polecenie m jej używa. Jeśli TOP nie jest ustawiona, polecenie m przeszukuje drzewo od bieżącego katalogu, próbując znaleźć jego górę.

Polecenie m może obsługiwać zadania równoległe za pomocą argumentu -jN. Jeśli nie podasz argumentu -j, system kompilacji automatycznie wybierze liczbę zadań równoległych, która jego zdaniem jest optymalna dla Twojego systemu.

Zamiast pełnego obrazu urządzenia możesz skompilować konkretne moduły, wymieniając ich nazwy w wierszu poleceń m. Polecenie m udostępnia też pseudocel, zwany celem. Na przykład m nothing niczego nie kompiluje , ale analizuje i weryfikuje strukturę kompilacji. Aby wyświetlić listę prawidłowych celów, wpisz m help.

Rozwiązywanie problemów z błędami kompilacji

W tej sekcji znajdziesz instrukcje dotyczące obsługi błędów kompilacji.

Błędy systemu plików tylko do odczytu (Android 17 i nowsze wersje)

Podczas kompilacji drzewo źródłowe AOSP jest tylko do odczytu. Jeśli kompilacja, którą uruchamiasz, próbuje zmodyfikować drzewo źródłowe podczas konfiguracji produktu lub innej części kompilacji, kompilacja może się nie powieść i zgłosić błędy systemu plików tylko do odczytu. Aby tymczasowo zmienić drzewo źródłowe na tryb odczytu i zapisu, możesz użyć tych opcji:

  • Aby zmienić całe drzewo źródłowe na tryb odczytu i zapisu podczas kompilacji, dodaj BUILD_BROKEN_SRC_DIR_IS_WRITABLE=true do środowiska kompilacji.

  • Aby zmienić część drzewa na tryb odczytu i zapisu podczas kompilacji, użyj BUILD_BROKEN_SRC_DIR_RW_ALLOWLIST="path1, path2, ...". Ścieżki powinny być ścieżkami katalogów, w których zapisy mają być dozwolone, w stosunku do górnej części obszaru roboczego.

Nieprawidłowa wersja Javy (Android 8.0 i starsze wersje)

Jeśli kompilujesz Androida 8.0 (poziom interfejsu API 26) lub starszą wersję, polecenie m może zostać przerwane, gdy napotka problem z Twoją wersją Javy. Może się na przykład pojawić ten komunikat:

************************************************************
You are attempting to build with the incorrect version of java.

Your version is: WRONG_VERSION.
The correct version is: RIGHT_VERSION.

Please follow the machine setup instructions at
https://source.android.com/source/initializing.html
************************************************************

Oto prawdopodobne przyczyny i rozwiązania:

  • Nie jest zainstalowany prawidłowy zestaw JDK. Więcej informacji znajdziesz w artykule Konfigurowanie środowiska do programowania w AOSP (2.3–8.0).
  • W ścieżce znajduje się inny, wcześniej zainstalowany zestaw JDK. Dodaj prawidłowy zestaw JDK na początku ścieżki lub usuń problematyczny zestaw JDK.