Schemat obsługi wersji GKI

Na tej stronie opisano schemat wersji ogólnych obrazów jądra (GKI). Ogólny obraz jądra (GKI) ma unikalny identyfikator zwany wersją jądra. Wersja jądra składa się z wersji interfejsu modułu jądra (KMI) i podpoziomu. Wersja jądra jest specyficzna dla wydanego obrazu, a wersja KMI reprezentuje interfejs, na podstawie którego została utworzona. Wersja KMI może obsługiwać wiele wersji jądra. Wersja jądra jest powiązana tylko z jedną wersją KMI. W mało prawdopodobnym przypadku, gdy interfejs modułu jądra musi zostać zmieniony, generowanie KMI jest powtarzane, aby odzwierciedlić zmianę wersji KMI.

Podsumowanie warunków

W tabeli poniżej znajdziesz podsumowanie ważnych terminów używanych na tej stronie i w przypadku aktualizacji GKI.

Nazwa Symbol Przykład Opis
Wydanie jądra w.x.y-zzz-k-suffix 5.4.42-android12-0-foo Unikalny identyfikator wersji GKI. Jest to wartość zwracana przez uname.
Wersja KMI w.x-zzz-k 5.4-android12-0 Opisuje interfejs modułu jądra (KMI) między GKI a dynamicznie ładowanymi modułami jądra (DLKM).
Podpoziom y 42 Opisuje kolejność wydań jądra w ramach tej samej wersji KMI.

W tabeli poniżej znajdziesz inne powiązane terminy.

Nazwa Symbol Przykład Opis
w.x.y w.x.y 5.4.42

Więcej informacji znajdziesz w artykule Linux Kernel Makefiles (wyszukaj „KERNELRELEASE”).

W tym dokumencie używamy bezpośrednio wersji w.x.y. Jest to też powszechnie nazywane trzyczęściowym numerem wersji. Termin używany w VINTF, wersja jądra, może być mylony z innymi terminami, zwłaszcza z w.

W bibliotece libkver ta zmienna jest oznaczana jako kernel_version_tuple.

Ta krotka nie może zostać zmniejszona przez żadne aktualizacje, w tym OTA ani mainline.

Gałąź jądra zzz-w.x android12-5.4 Ten termin jest używany w sekcji Typowe gałęzie jądra.
Wersja w 5 Ten termin nie jest używany w tym dokumencie. W bibliotece libkver ta zmienna jest oznaczana jako version.
Poziom poprawek x 4 Ten termin nie jest używany w tym dokumencie. W libkver ta zmienna jest oznaczana jako patch_level.
Wersja Androida Chrr… android12

Jest to numer wersji Androida (nazwa deseru), z którą jest powiązane jądro.

Podczas porównywania pola AndroidRelease z ciągu znaków wyodrębniana jest część numeryczna.

Numer wersji Androida nie może być zmniejszany przez żadne aktualizacje, w tym aktualizacje OTA ani aktualizacje główne.

Generowanie KMI K 0

Jest to dodatkowa liczba dodana na wypadek mało prawdopodobnych zdarzeń. Jeśli poprawka błędu związanego z bezpieczeństwem wymaga zmian w KMI w ramach tej samej wersji Androida, numer generacji KMI jest zwiększany.

Numer generacji KMI zaczyna się od 0.

Projektowanie wersji

Wydanie jądra

Definicja

W przypadku urządzeń dostarczanych z GKI wersja jądra jest określana w ten sposób:

KernelRelease :=
Version.PatchLevel.SubLevel-AndroidRelease-KmiGeneration-suffix
w      .x         .y       -zzz           -k            -something

Więcej informacji znajdziesz w artykule Określanie wersji jądra na urządzeniu.

Oto przykład wersji jądra:

5.4.42-android12-0-00544-ged21d463f856

Opis

Wersja jądra to unikalny identyfikator wersji GKI. Jeśli 2 pliki binarne GKI mają tę samą wersję jądra, muszą być identyczne pod względem bajtów.

Wersja jądra składa się z wersji KMI, podpoziomu i sufiksu. Na potrzeby tego dokumentu sufiks po wygenerowaniu KMI jest ignorowany.

Wersja KMI

Definicja

Wersja KMI jest zdefiniowana w ten sposób:

KmiVersion :=
Version.PatchLevel-AndroidRelease-KmiGeneration
w      .x         -zzz           -k

Pamiętaj, że poziom podrzędny y nie jest częścią wersji KMI. W przykładzie w sekcji Wydanie jądra systemu wersja KMI to:

5.4-android12-0

Opis

Wersja KMI opisuje interfejs modułu jądra (KMI) między GKI a dynamicznie ładowanymi modułami jądra (DLKM).

Jeśli dwie wersje jądra mają tę samą wersję KMI, implementują ten sam interfejs modułu jądra. Klucze DLKM zgodne z jednym z nich są też zgodne z drugim.

Wersja KMI nie może zostać obniżona przez żadne aktualizacje OTA.

Podpoziom

Poziom podrzędny y określa kolejność wydań jądra w ramach tej samej wersji KMI.

W przypadku 2 wersji jądra, które mają tę samą wersję KMI, ale odpowiednio podpoziomy Y1 i Y2:

  • Jeśli Y1 jest mniejsza lub równa Y2, urządzenie z Y1 może otrzymać aktualizację do Y2.
  • Jeśli Y1 jest większe niż Y2, urządzenia z Y1 nie można zaktualizować do Y2.

Oznacza to, że jeśli wersja KMI nie ulegnie zmianie, poziom podrzędny nie może zostać obniżony przez żadną aktualizację OTA.

Określanie wersji jądra na urządzeniu

Pełną wersję jądra można znaleźć, wykonując polecenie uname -r lub uname(2) za pomocą tego fragmentu kodu:

std::string get_kernel_release() {
  struct utsname buf;
  return uname(&buf) == 0 ? buf.release : "";
}

Przykładowe dane wyjściowe:

5.4.42-android12-0-00544-ged21d463f856

Na potrzeby tego dokumentu wszystko, co następuje po wygenerowaniu KMI, jest ignorowane podczas wyodrębniania informacji o jądrze. Bardziej formalnie, dane wyjściowe uname -r są analizowane za pomocą tego wyrażenia regularnego (zakładając, że zzz zawsze zaczyna się od „android”):

^(?P<w>\d+)[.](?P<x>\d+)[.](?P<y>\d+)-(?P<z>android\d+)-(?P<k>\d+).*$

Ignorowane informacje mogą obejmować np. numer kompilacji ci.android.com, liczbę poprawek w stosunku do podstawowego jądra oraz skróty SHA zatwierdzenia git.

libkver

Biblioteka libkver udostępnia interfejs C++ do analizowania wersji jądra lub ciągu tekstowego wersji KMI. Listę interfejsów API udostępnianych przez bibliotekę libkver znajdziesz w packages/modules/Gki/libkver/include/kver.

Sprawdzanie VINTF

W przypadku Androida 11 lub starszego wersja Androida w wersji KMI jest określana ręcznie w pliku manifestu urządzenia przez producentów urządzeń. Więcej informacji znajdziesz w sekcji Reguły dopasowania jądra VINTF.

Od Androida S część wersji KMI odpowiadająca wersji Androida może być wyodrębniana z jądra i wstrzykiwana do manifestu urządzenia w czasie kompilacji.

Wymagania dotyczące konfiguracji jądra zwykle się nie zmieniają, więc nie musisz kodować k w macierzy zgodności. Jeśli jednak w rzadkich przypadkach konieczna jest zmiana konfiguracji jądra, upewnij się, że:

  • Odpowiednie wymaganie z macierzy zgodności zostanie usunięte.
  • Dodano dodatkowe testy VTS, aby sprawdzić nowe wymagania warunkowe dotyczące generowania KMI.

Wersja obrazu rozruchowego w metadanych OTA

Nawet jeśli obraz rozruchowy jest aktualizowany za pomocą aktualizacji OTA, musi być on zawarty w formacie ładunku OTA, payload.bin. Ładunek OTA koduje pole a version dla każdej partycji. Gdy update_engine obsługuje pakiet OTA, porównuje to pole, aby upewnić się, że partycja nie została obniżona.

Aby uniknąć nieporozumień, pole version w przypadku partycji rozruchowej w metadanych OTA nazywa się boot image version.

Ponieważ dysk RAM jest zawsze tworzony od zera, do opisania całego obrazu rozruchowego wystarczy użyć ramdisk timestamp. Nie musisz kodować wersji jądra w wersji obrazu rozruchowego, chyba że w przyszłości będziesz łączyć stary obraz rozruchowy z nowym plikiem binarnym jądra.

Przed aktualizacją OTA klient OTA sprawdza wersję obrazu rozruchowego w taki sam sposób jak w przypadku każdej innej partycji.