W tym samouczku po raz pierwszy spróbujesz tworzenia systemu operacyjnego Android.
Konfigurowanie środowiska do tworzenia aplikacji na Androida
Zanim pobierzesz i skompilujesz gałąź manifestu android-latest-release źródła Androida, upewnij się, że Twój sprzęt spełnia
wymagania i że
wymagane oprogramowanie jest prawidłowo zainstalowane. Musisz też znać te terminy:
- Git
- Git to bezpłatny, rozproszony system kontroli wersji typu open source. Android używa Gita do operacji lokalnych, takich jak tworzenie gałęzi, zatwierdzanie zmian, porównywanie i edytowanie. Aby dowiedzieć się więcej o Gicie, zapoznaj się z dokumentacją Gita.
- Repo
- Repo to otoka Pythona wokół Gita, która upraszcza wykonywanie złożonych operacji w wielu repozytoriach Git. Repo nie zastępuje Gita we wszystkich operacjach kontroli wersji, tylko ułatwia wykonywanie złożonych operacji Git. Repo używa plików manifestu do agregowania projektów Git w superprojekcie Androida.
- plik manifestu
- Plik manifestu to plik XML określający, gdzie w drzewie źródłowym AOSP znajdują się różne projekty Git w źródle Androida.
Spełnianie wymagań sprzętowych
Twój komputer do programowania powinien spełniać te wymagania sprzętowe lub je przekraczać:
System 64-bitowy x86.
Co najmniej 400 GB wolnego miejsca na dysku na pobranie i skompilowanie kodu (250 GB na pobranie + 150 GB na kompilację).
Co najmniej 64 GB pamięci RAM. Google używa do kompilowania Androida maszyn z 72 rdzeniami i 64 GB pamięci RAM. Przy takiej konfiguracji sprzętowej pełna kompilacja Androida trwa około 40 minut, a kompilacja przyrostowa – tylko kilka minut. Dla porównania, pełna kompilacja na maszynie z 6 rdzeniami i 64 GB pamięci RAM trwa około 6 godzin.
Spełnianie wymagań systemowych
Na komputerze do programowania musi być zainstalowana dowolna dystrybucja Linuksa 64-bitowego z biblioteką GNU C (glibc) w wersji 2.17 lub nowszej.
Instalowanie wymaganych pakietów
Aby zainstalować wymagane pakiety w Ubuntu 18.04 lub nowszym, uruchom to polecenie:
sudo apt-get install git-core gnupg flex bison build-essential zip curl zlib1g-dev libc6-dev-i386 x11proto-core-dev libx11-dev lib32z1-dev libgl1-mesa-dev libxml2-utils xsltproc unzip fontconfigInstalowanie wymaganego oprogramowania
Zanim zaczniesz korzystać z AOSP, musisz zainstalować OpenJDK, Make, Pythona 3 i Repo. Najnowsza gałąź wersji Androida zawiera wstępnie skompilowane wersje OpenJDK, Make i Pythona 3, więc nie trzeba wykonywać dodatkowych czynności instalacyjnych. W następnej sekcji dowiesz się, jak zainstalować Repo.
Instalowanie Repo
Aby zainstalować Repo:
Pobierz aktualne informacje o pakietach:
sudo apt-get updateUruchom to polecenie, aby zainstalować program uruchamiający Repo:
sudo apt-get install repoProgram uruchamiający Repo udostępnia skrypt Pythona, który inicjuje pobieranie i pobiera pełne narzędzie Repo.
Jeśli operacja się powiedzie, przejdź do kroku 4.
(opcjonalnie) Ręcznie zainstaluj Repo za pomocą tych poleceń:
export REPO=$(mktemp /tmp/repo.XXXXXXXXX) curl -o ${REPO} https://storage.googleapis.com/git-repo-downloads/repo gpg --recv-keys 8BB9AD793E8E6153AF0F9A4416530D5E920F5C65 curl -s https://storage.googleapis.com/git-repo-downloads/repo.asc | gpg --verify - ${REPO} && install -m 755 ${REPO} ~/bin/repoPierwsze 3 polecenia konfigurują plik tymczasowy, pobierają do niego Repo i sprawdzają, czy podany klucz pasuje do wymaganego klucza. Jeśli te polecenia się powiodą, ostatnie polecenie zainstaluje program uruchamiający Repo.
Sprawdź wersję programu uruchamiającego Repo:
repo versionDane wyjściowe powinny wskazywać wersję 2.4 lub nowszą, na przykład:
repo launcher version 2.45
Pobieranie źródła Androida
Źródło Androida znajduje się w kolekcji repozytoriów Git hostowanych przez Google. Każde repozytorium Git zawiera całą historię źródła Androida, w tym zmiany w źródle i daty ich wprowadzenia. Aby pobrać źródło Androida:
Przejdź do katalogu głównego:
cd ~Utwórz w nim lokalny podkatalog roboczy:
mkdir aospPrzejdź do katalogu:
cd aospZainicjuj najnowszą gałąź repozytorium AOSP (
android-latest-release):repo init --partial-clone -b android-latest-release -u https://android.googlesource.com/platform/manifestWpisz lub zaakceptuj dane logowania do Gita (imię i nazwisko, adres e-mail).
Zsynchronizuj kod źródłowy:
repo sync -c -j8Jeśli podczas pobierania wystąpią problemy, przeczytaj artykuł Rozwiązywanie problemów z synchronizacją.
Kompilowanie kodu
Aby skompilować kod:
W katalogu roboczym uruchom skrypt
envsetup.sh, aby skonfigurować środowisko kompilacji:source build/envsetup.shOkreśl docelowy typ urządzenia, aby skompilować kod za pomocą polecenia
lunch. Docelowy typ urządzenia to permutacja urządzenia, np. konkretny model lub format. Określ ten docelowy typ urządzenia:lunch aosp_cf_x86_64_only_phone-aosp_current-userdebugPowinien wyświetlić się opis docelowego typu urządzenia 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 ============================================Skompiluj docelowy typ urządzenia:
m
Pierwsza kompilacja może potrwać kilka godzin. Kolejne kompilacje zajmują znacznie mniej czasu. Dane wyjściowe kompilacji pojawią się w $OUT_DIR.
Uruchamianie Cuttlefish
Cuttlefish to emulator Androida używany do testowania kompilacji.
Aby pobrać, skompilować i zainstalować pakiety hosta Debiana, uruchom te polecenia:
sudo apt install -y git devscripts equivs config-package-dev debhelper-compat golang curlgit clone https://github.com/google/android-cuttlefishcd android-cuttlefishfor dir in base frontend; do pushd $dir # Install build dependencies sudo mk-build-deps -i dpkg-buildpackage -uc -us popd donesudo dpkg -i ./cuttlefish-base_*_*64.deb || sudo apt-get install -fsudo dpkg -i ./cuttlefish-user_*_*64.deb || sudo apt-get install -fsudo usermod -aG kvm,cvdnetwork,render $USERsudo rebootPonowne uruchomienie powoduje zainstalowanie dodatkowych modułów jądra i zastosowanie reguł
udev.Uruchom Cuttlefish:
launch_cvd --daemonAby połączyć się z urządzeniem Cuttlefish, w przeglądarce otwórz adres
https://localhost:8443. Wyświetli się wirtualne urządzenie z Androidem.
Wprowadzanie zmiany
Zaktualizuj kod źródłowy zgodnie z tym przykładem listy zmian.
W katalogu głównym pobierania (
aosp/) przejdź do projektu Gitframeworks/native:cd frameworks/nativeUruchom tymczasowy projekt za pomocą tego polecenia:
repo start PROJECT_NAME.Użyj edytora, aby edytować plik
SurfaceFlinger.cppw tej lokalizacji:aosp/frameworks/native/services/surfaceflinger/SurfaceFlinger.cppZnajdź ten wiersz:
void SurfaceFlinger::updateColorMatrixLocked() {Dodaj ten wiersz na początku
updateColorMatrixLocked():mClientColorMatrix = mat4(vec4{1.0f, 0.0f, 0.0f, 0.0f}, vec4{0.0f, -1.0f, 0.0f, 0.0f}, vec4{0.0f, 0.0f, -1.0f, 0.0f}, vec4{0.0f, 1.0f, 1.0f, 1.0f});Skompiluj kod:
mZaktualizuj kompilację na urządzeniu:
adb rootadb remount -Radb rootadb syncadb rebootSprawdź, czy na wybranym urządzeniu widzisz zmianę koloru podobną do tej na rysunku 1.
Rysunek 1. Wygląd ekranu po udanej zmianie koloru
Naprawianie testu
Ta część ćwiczenia wykorzystuje przykładowy test, który znajduje się w drzewie źródłowym i nie przechodzi.
Aby uruchomić, debugować i naprawić test, wykonaj te czynności:
Uruchom:
atest DevCodelabTestTest się nie powiódł.
Sprawdź zrzut stosu nieudanego testu:
STACKTRACE: java.lang.AssertionError at org.junit.Assert.fail(Assert.java:87) at org.junit.Assert.assertTrue(Assert.java:42) at org.junit.Assert.assertTrue(Assert.java:53) at android.test.example.devcodelab.DevCodelabTest.testHelloWorld(DevCodelabTest.java:29)Ostatni wiersz śladu stosu pokazuje test, który się nie powiódł (
testHelloWorld). Ten test znajduje się w pliku o nazwieDevCodelabTest.java.Aby określić lokalizację testu do naprawienia, do ostatniego wiersza zrzutu stosu dołącz
WORKING_DIRECTORY/platform_testing/tests/example/devcodelab/src/aż do nazwy pliku testowego włącznie. Zatemandroid.test.example.devcodelab.DevCodelabTeststaje sięWORKING_DIRECTORY/platform_testing/tests/example/devcodelab/src/android/test/example/devcodelab/DevCodelabTest.java.Edytuj plik
platform_testing/tests/example/devcodelab/src/android/test/example/devcodelab/DevCodelabTest.javai zastąpAssert.assertTrue(false)ciągiemAssert.assertTrue(true).Uruchom test ponownie, aby sprawdzić, czy problem został rozwiązany:
atest DevCodelabTest
Przesyłanie kodu do sprawdzenia
Repo upraszcza korzystanie z Gita, łącząc polecenia takie jak git clone, aby działały jednocześnie w wielu repozytoriach Git (lub projektach).
Do inspekcji kodu projektów w Gicie użyj Gerrit internetowego systemu inspekcji kodu.
Zakładając, że zmiany zostały wprowadzone w projekcie
frameworks/native, uruchom te polecenia, aby przesłać zmiany:cd frameworks/nativerepo start PROJECT_NAME.git add .git commitW komunikacie zatwierdzenia wpisz:
Android PROJECT_NAME. change Test: manual atestPrześlij zmianę:
repo uploadJeśli operacja się powiedzie, zobaczysz komunikat podobny do tego:
Upload project frameworks/native/ to remote branch android17-release: branch PROJECT_NAME. ( 1 commit, Wed Aug 7 09:32:33 2019 -0700): ff46b36d android PROJECT_NAME. change to https://android-review.googlesource.com/ (y/N)? y remote: Processing changes: refs: 1, new: 1, done remote: remote: SUCCESS remote: remote: https://android-review.googlesource.com/c/platform/frameworks/native/+/1098432 android PROJECT_NAME. change [NEW] remote: To https://android-review.googlesource.com/platform/frameworks/native * [new branch] PROJECT_NAME. -> refs/for/android17-release
Wyświetlanie zmiany w Gerrit
Aby wyświetlić zmianę w Gerrit, kliknij link w danych wyjściowych terminala. Link jest podobny do tego:
https://android-review.googlesource.com/c/platform/frameworks/native/+/1098432
Cofanie zmiany
Zwykle po testach oraz sprawdzeniu i zatwierdzeniu przesyłasz zmianę w Gerrit i scalasz ją z repozytorium. Na potrzeby tego ćwiczenia cofnij jednak swoją pracę:
W Gerrit kliknij Porzuć.
Porzuć powiązaną gałąź tymczasową w katalogu projektu
frameworks/native(lub jego podkatalogach):repo abandon PROJECT_NAME.Cofnij zmiany wprowadzone w pliku testowym. Ponieważ nie uruchomiono poleceń
repo start,git commitirepo uploadw przypadku zmiany testu, możesz zresetować sam plik. Zakładając, że jesteś waosp/platform_testing directory, użyj tego polecenia, aby zresetować plik:git reset HEAD tests/example/devcodelab/src/android/test/example/devcodelab/DevCodelabTest.javagit checkout .
To kończy ćwiczenie dotyczące tworzenia platformy Android.
Pomoc
Jeśli podczas wykonywania tego ćwiczenia napotkasz błędy, zgłoś je za pomocą linku do narzędzia Issue Tracker u dołu dowolnej strony. Pytania wysyłaj do grupy android-building.
Wpisz ps -A | grep crosvm, aby sprawdzić, czy crosvm jest już uruchomiony. Jeśli crossvm jest
uruchomiony, wpisz stop_cvd || true lub kill crosvm proces za pomocą identyfikatora PID procesu.