Schemat obsługi wersji GKI

Na tej stronie opisano schemat obsługi wersji ogólnych obrazów jądra systemu (GKI). Ogólny obraz jądra (GKI) ma unikalny identyfikator zwany wersją jądra. Wersja jądra systemu składa się z wersji interfejsu modułu jądra systemu (KMI) i podpoziomu. Wersja jądra systemu (operacyjnego) 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 systemu 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 systemu (KMI) między GKI a dynamicznie ładowanymi modułami jądra systemu (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 aktualizacje OTA ani aktualizacje główne.

Gałąź jądra zzz-w.x android12-5.4 Ten termin jest używany w sekcji Typy gałęzi 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 zzz 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, która jest używana do porównania.

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 systemu (operacyjnego) 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 podpoziom 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 systemu (KMI) między GKI a dynamicznie ładowanymi modułami jądra systemu (DLKM).

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

Żadne aktualizacje OTA nie mogą obniżać wersji KMI.

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 nałożonych na podstawowy kernel i wartości 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 artykule Reguły dopasowania jądra VINTF.

Od Androida S część wersji KMI dotyczącą wersji Androida można wyodrębnić z jądra i wstrzyknąć do manifestu urządzenia w czasie kompilacji.

Wymagania dotyczące konfiguracji jądra zwykle się nie zmieniają, więc nie ma potrzeby kodowania k w macierzy zgodności. Jeśli jednak w rzadkich przypadkach konieczna jest zmiana konfiguracji jądra systemu (operacyjnego), 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 przez OTA, musi być zawarty w formacie ładunku OTA, payload.bin. Ładunek OTA koduje pole a version dla każdej partycji. Gdy update_engine obsługuje ładunek 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.