W tym samouczku możesz po raz pierwszy wypróbować programowanie w systemie operacyjnym Android.
Skonfiguruj na potrzeby programowania na Androida
Zanim pobierzesz i skompilujesz gałąź main
kodu źródłowego Androida, sprawdź, czy Twój sprzęt spełnia wymagania i czy wymagane oprogramowanie jest prawidłowo zainstalowane. Musisz też zapoznać się z tymi warunkami:
- Git
- Git to bezpłatny, rozproszony system kontroli wersji typu open source. Android używa Gita do operacji lokalnych, takich jak rozgałęzianie, zatwierdzenia, różnice i zmiany. Aby dowiedzieć się więcej o Git, zapoznaj się z dokumentacją Git.
- Repo
- Repo to zewnętrzna biblioteka Pythona dla Git, która upraszcza wykonywanie złożonych operacji w wielu repozytoriach Git. Repozytorium nie zastępuje Gita w przypadku wszystkich operacji 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 ze źródła Androida.
Spełnij wymagania sprzętowe
Stacja robocza do programowania powinna spełniać te wymagania dotyczące sprzętu:
64-bitowy system x86.
Co najmniej 400 GB wolnego miejsca na dysku do pobrania i skompilowania kodu (250 GB na pobranie + 150 GB na kompilację).
co najmniej 64 GB pamięci RAM; Do kompilacji Androida Google używa maszyn z 72 rdzeniami i 64 GB pamięci RAM. Przy takiej konfiguracji sprzętowej pełnej kompilacji Androida zajmuje około 40 minut, a przyrostowa kompilacja Androida – zaledwie kilka minut. W przypadku pełnego kompilowania na maszynie z 6 rdzeniami i 64 GB pamięci RAM trwa to około 6 godzin.
Wymagania dotyczące systemu operacyjnego
Programowa stacja robocza musi obsługiwać dowolną 64-bitową dystrybucję Linuksa z biblioteką GNU C Library (glibc) w wersji 2.17 lub nowszej.
Instalowanie wymaganych pakietów
Aby zainstalować pakiety wymagane 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 fontconfig
Instalowanie wymaganego oprogramowania
Aby korzystać z AOSP, musisz zainstalować OpenJDK, Make, Python 3 i Repo. Główna gałąź Androida AOSP ma gotowe wersje OpenJDK, Make i Pythona 3, więc nie trzeba wykonywać dodatkowych czynności instalacyjnych. W tej sekcji dowiesz się, jak zainstalować Repo.
Instalowanie repozytorium
Aby zainstalować Repo:
Pobierz informacje o bieżącym pakiecie:
sudo apt-get update
Aby zainstalować uruchamiacz Repo, uruchom to polecenie:
sudo apt-get install repo
Uruchamiacz repozytorium udostępnia skrypt Pythona, który inicjuje sprawdzanie i pobiera pełne narzędzie Repo.
Jeśli się uda, przejdź do kroku 4.
(Opcjonalnie) Zainstaluj ręcznie Repo, używając 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/repo
Pierwsze 3 polecenia konfigurują plik tymczasowy, pobierają repozytorium do tego pliku i sprawdzają, czy podany klucz jest zgodny z wymaganym. Jeśli te polecenia zadziałają, ostatnie polecenie zainstaluje program uruchamiający Repo.
Sprawdź wersję programu uruchamiającego repozytorium:
repo version
Dane wyjściowe powinny wskazywać wersję 2.4 lub nowszą, na przykład:
repo launcher version 2.45
Pobieranie kodu źródłowego Androida
Kod źródłowy Androida znajduje się w kolekcji repozytoriów Git hostowanych przez Google. Każde repozytorium Git zawiera całą historię źródła Androida, łącznie ze zmianami w źródle i czasem ich wprowadzenia. Aby pobrać aplikację źródłową na Androida:
Przejdź do katalogu głównego:
cd ~
Utwórz w nim lokalny podkatalog roboczy:
mkdir aosp
Przejdź do katalogu:
cd aosp
Zainicjuj główną gałąź kodu źródłowego repozytorium AOSP (domyślnie):
repo init --partial-clone -b main -u https://android.googlesource.com/platform/manifest
Wpisz lub zaakceptuj swoje dane logowania Git (nazwę, adres e-mail).
Synchronizuj kod źródłowy:
repo sync -c -j8
Jeśli podczas pobierania wystąpią problemy, zapoznaj się z artykułem Rozwiązywanie problemów z synchronizacją i ich usuwanie.
Kompilowanie kodu
Aby utworzyć kod:
W katalogu roboczym pobierz skrypt
envsetup.sh
, aby skonfigurować środowisko kompilacji:source build/envsetup.sh
Określ typ docelowego urządzenia, które chcesz utworzyć za pomocą polecenia
lunch
. Cel to permutacja urządzenia, np. konkretny model lub format. Określ tę grupę docelową:lunch aosp_cf_x86_64_phone-trunk_staging-userdebug
Powinien pojawić się podsumowanie środowiska docelowego i kompilacji:
============================================ PLATFORM_VERSION_CODENAME=VanillaIceCream PLATFORM_VERSION=VanillaIceCream PRODUCT_INCLUDE_TAGS=com.android.mainline TARGET_PRODUCT=aosp_arm TARGET_BUILD_VARIANT=eng TARGET_ARCH=arm TARGET_ARCH_VARIANT=armv7-a-neon TARGET_CPU_VARIANT=generic HOST_OS=linux HOST_OS_EXTRA=Linux-6.5.13-1rodete2-amd64-x86_64-Debian-GNU/Linux-rodete HOST_CROSS_OS=windows BUILD_ID=AOSP.MAIN OUT_DIR=out ============================================
Utwórz środowisko docelowe:
m
Pierwsza kompilacja może potrwać kilka godzin. Kolejne kompilacje zajmują znacznie mniej czasu. Dane wyjściowe kompilacji pojawią się tutaj: $OUT_DIR
.
Uruchamianie Mątwy
Cuttlefish to emulator Androida używany do testowania wersji.
Aby pobrać, skompilować i zainstalować hostowane pakiety Debiana, uruchom następujące polecenia:
sudo apt install -y git devscripts equivs config-package-dev debhelper-compat golang curl
git clone https://github.com/google/android-cuttlefish
cd android-cuttlefish
for dir in base frontend; do pushd $dir # Install build dependencies sudo mk-build-deps -i dpkg-buildpackage -uc -us popd done
sudo dpkg -i ./cuttlefish-base_*_*64.deb || sudo apt-get install -f
sudo dpkg -i ./cuttlefish-user_*_*64.deb || sudo apt-get install -f
sudo usermod -aG kvm,cvdnetwork,render $USER
sudo reboot
Ponowne uruchamianie powoduje instalację dodatkowych modułów jądra i zastosuje
udev
zasad.Uruchom Mątwę:
launch_cvd --daemon
Połącz się z urządzeniem Cuttlefish, przechodząc do strony
https://localhost:8443
w przeglądarce. Wyświetli się wirtualne urządzenie z Androidem.
Wprowadź zmianę
Zaktualizuj kod źródłowy zgodnie z tym przykładem changelist.
Z poziomu głównego katalogu płatności (katalog
aosp/
) przejdź do projektu Gitframeworks/native
:cd frameworks/native
Uruchom projekt tymczasowy za pomocą tego polecenia:
repo start <some-name> .
Użyj edytora, aby edytować
SurfaceFlinger.cpp
w tym miejscu:aosp/frameworks/native/services/surfaceflinger/SurfaceFlinger.cpp
Znajdź ten wiersz:
void SurfaceFlinger::updateColorMatrixLocked() {
Dodaj ten wiersz na początku wiersza
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});
Utwórz kod:
m
Zaktualizuj wersję na urządzeniu:
adb root
adb remount -R
adb root
adb sync
adb reboot
Sprawdź, czy na wybranym urządzeniu widzisz zmianę koloru podobną do tej widocznej na rysunku 1.
Rysunek 1. Wygląd ekranu po zmianie koloru
Napraw test
W tej części ćwiczenia w Codelabs używany jest przykładowy test, który znajduje się w drzewie źródłowym, i kończy się niepowodzeniem.
Aby uruchomić test, debugować go i poprawiać, wykonaj te czynności:
Uruchom:
atest DevCodelabTest
Test się nie powiedzie.
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 ścieżki wywołania podaje test, który się nie udał (
testHelloWorld
). Ten test znajduje się w pliku o nazwieDevCodelabTest.java
.Aby określić lokalizację testu, który należy naprawić, dodaj
WORKING_DIRECTORY/platform_testing/tests/example/devcodelab/src/
do ostatniego wiersza ścieżki sterowania, aż do nazwy pliku testu.android.test.example.devcodelab.DevCodelabTest
zmienia się naWORKING_DIRECTORY/platform_testing/tests/example/devcodelab/src/android/test/example/devcodelab/DevCodelabTest.java
.Edytuj pole
platform_testing/tests/example/devcodelab/src/android/test/example/devcodelab/DevCodelabTest.java
i zastąpAssert.assertTrue(false)
elementemAssert.assertTrue(true)
Uruchom test jeszcze raz, aby sprawdzić, czy problem został rozwiązany:
atest DevCodelabTest
Przesyłanie kodu do sprawdzenia
Repo upraszcza korzystanie z Git, ponieważ pozwala na łączenie poleceń takich jak git clone
, aby jednocześnie pracować w wielu repozytoriach Git (lub projektach).
Aby sprawdzić kod swoich projektów w Git, użyj internetowego systemu Gerrit do sprawdzania kodu.
Zakładając, że zmiany zostały wprowadzone w projekcie
frameworks/native
, uruchom te polecenia, aby przesłać zmiany:cd frameworks/native
repo start codelab .
git add .
git commit
W komunikacie zatwierdzenia wpisz:
Android codelab change Test: manual atest
Prześlij zmiany:
repo upload
Jeśli się uda, zobaczysz komunikat podobny do tego:
Upload project frameworks/native/ to remote branch main: branch codelab ( 1 commit, Wed Aug 7 09:32:33 2019 -0700): ff46b36d android codelab 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 codelab change [NEW] remote: To https://android-review.googlesource.com/platform/frameworks/native * [new branch] codelab -> refs/for/main
Wyświetlanie zmiany w Gerrit
Aby wyświetlić zmiany w Gerricie, przejdź do wyjścia linku w terminalu. Link wygląda mniej więcej tak:
https://android-review.googlesource.com/c/platform/frameworks/native/+/1098432
Cofnij zmianę
Zwykle po przeprowadzeniu testów, a potem po sprawdzeniu i zatwierdzeniu zmiany przesyła się ją do Gerrit i scala z repozytorium. Zamiast tego, na potrzeby tego Codelab cofnij zmiany:
W Gerrit kliknij Porzuć.
Porzuć powiązaną tymczasową gałąź w katalogu projektu
frameworks/native
(lub jego podkatalogach):repo abandon codelab .
Cofnij zmiany wprowadzone w pliku testowym. Ponieważ nie uruchomiono testowych zmian w plikach
repo start
,git commit
irepo upload
, 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.java
git checkout .
To już koniec ćwiczeń dotyczących tworzenia aplikacji na platformę Android.
Pomoc
Jeśli podczas pracy z tym ćwiczeniem napotkasz błędy, zgłoś je, korzystając z linku Problem Tracker na dole dowolnej strony. Pytania kieruj do grupy android-building.
Wpisz ps -A | grep crosvm
, aby sprawdzić, czy aplikacja crosvm
jest już uruchomiona. Jeśli proces crossvm
jest uruchomiony, wpisz stop_cvd || true
lub kill crosvm
z identyfikatorem procesu PID.