Schemat obsługi wersji GKI

Na tej stronie opisano schemat wersji obrazów Generic Kernel Image (GKI). Typowy obraz jądra (GKI) ma unikalny identyfikator o nazwie wersja jądra. Wersja jądra składa się z wersji interfejsu modułu jądra (KMI) i poziomu podrzędnego. Wersja jądra jest powiązana z wydanym obrazem, a wersja KMI to interfejs, na którym opiera się wersja. Wersja KMI może obsługiwać wiele wersji jądra. Wersja jądra jest powiązana tylko z jedną wersją KMI. W nieprawdopodobnym 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 ramach 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 funkcję uname.
Wersja KMI w.x-zzz-k 5.4-android12-0 Opisuje interfejs modułu jądra (KMI) między GKI a dynamicznymi modułami jądra (DLKM).
Podpoziom Y 42 Opisuje kolejność wersji jądra w ramach tej samej wersji KMI.

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

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

Szczegółowe informacje znajdziesz w Makefileach jądra Linuxa (wyszukaj „KERNELRELEASE”).

W całym dokumencie używana jest wersja w.x.y. Jest to też powszechnie nazywane trzyczęściowym numerem wersji. Termin używany w VINTF, kernel version, może być mylony z innymi terminami, zwłaszcza w.

Ta zmienna jest określana jako kernel_version_tuplelibkver.

Ta tupla nie może być zmniejszana przez żadne aktualizacje, w tym OTA ani główną linię.

Gałąź jądra zzz-w.x android12-5.4 Termin ten jest używany w  typach gałęzi jądra.
Wersja w 5 Ten termin nie jest używany w tym dokumencie. Ta zmienna jest określana jako versionlibkver.
Poziom poprawek x 4 Ten termin nie jest używany w tym dokumencie. Ta zmienna jest określana jako patch_levellibkver.
Wersja na Androida zzz android12

Numer wersji Androida (deser), z którym powiązane jest jądro.

Podczas porównywania pola AndroidRelease z innego pola z danymi z poziomu usługi Google Analytics, z ciągu znaków jest wyodrębniana część liczbowa.

Numer wersji Androida nie może być niższy niż w przypadku poprzednich aktualizacji, w tym aktualizacji OTA lub głównej.

Generowanie KMI K 0

Jest to dodatkowa liczba dodana w celu obsługi mało prawdopodobnych zdarzeń. Jeśli poprawka błędu związanego z bezpieczeństwem wymaga wprowadzenia zmian w KMI w ramach tej samej wersji Androida, generowanie KMI zostanie zwiększone.

Numer generacji KMI zaczyna się od 0.

Obsługa wersji

Wydanie jądra

Definicja

W przypadku urządzeń dostarczanych z Google Play I/O wersja jądra jest definiowana 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.

Poniżej znajdziesz przykład wydania jądra.

5.4.42-android12-0-00544-ged21d463f856

Opis

Wersja jądra to unikalny identyfikator wersji GKI. Jeśli 2 binarne pliki 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 przyrostka. W ramach tego dokumentu sufiks po wygenerowaniu KMI jest ignorowany.

Wersja KMI

Definicja

Wersja KMI jest zdefiniowana w następujący sposób:

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

Pamiętaj, że poziom podrzędny y nie jest częścią wersji KMI. Na przykład w Wersji jądra wersja KMI to:

5.4-android12-0

Opis

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

Jeśli 2 wersje jądra mają tę samą wersję KMI, oznacza to, że implementują ten sam interfejs modułu jądra. Dane klucza dostępu do multimediów, które są zgodne z jednym z tych formatów, są też zgodne z drugim.

Wersja KMI nie może być obniżana przez żadne aktualizacje OTA.

Podpoziom

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

W przypadku 2 wersji jądra z tą samą wersją KMI, ale z poziomem podrzędnym Y1 i Y2 odpowiednio:

  • Jeśli Y1 jest mniejsze lub równe Y2, urządzenie z wersją Y1 może otrzymać aktualizację do wersji Y2.
  • Jeśli Y1 jest większa niż Y2, urządzenia z wersją Y1 nie można zaktualizować do wersji 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 uname -r lub uname(2)z użyciem 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

W tym dokumencie wszystko, co następuje po wygenerowaniu KMI, jest ignorowane podczas wyodrębniania informacji o jądrze. Bardziej formalnie, dane wyjściowe funkcji uname -r są analizowane za pomocą tego wyrażenia regularnego (z założenia, że ciąg znaków 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ć numer kompilacji ci.android.com, liczbę poprawek dodanych do jądra podstawowego oraz sumy kontrolne SHA commitów w git.

libkver

Biblioteka libkver udostępnia interfejs C++, który umożliwia analizowanie wersji jądra lub ciągu wersji KMI. Listę interfejsów API udostępnianych przez libkver znajdziesz w packages/modules/Gki/libkver/include/kver.

Kontrole VINTF

W przypadku Androida 11 lub starszego część Androida w pliku KMI jest określana ręcznie w pliku manifestu urządzenia przez producentów urządzeń. Szczegółowe informacje znajdziesz w regułach dopasowania jądra VINTF.

W Androidzie S część wersji Androida w pliku KMI można wyodrębnić z jądra i wbudować w pliku manifestu urządzenia w momencie kompilacji.

Wymagania dotyczące konfiguracji jądra zwykle się nie zmieniają, więc nie trzeba kodować k w ramach macierzy zgodności. W niewielkiej liczbie przypadków wymagania dotyczące konfiguracji jądra mogą jednak wymagać zmiany. W takim przypadku:

  • Odpowiednie wymaganie zostanie usunięte z tablicy zgodności.
  • Dodano dodatkowe testy VTS, aby sprawdzić nowe wymagania zależne od generowania KMI.

Wersja obrazu rozruchowego w metadanych OTA

Nawet jeśli obraz rozruchu jest aktualizowany przez aktualizację OTA, musi być zapakowany w formacie pliku danych OTA (payload.bin). Payload OTA koduje pole version dla każdej partycji. Gdy update_engine obsługuje dane OTA, porównuje to pole, aby upewnić się, że partycja nie została zaktualizowana.

Aby uniknąć nieporozumień, w metadanych OTA pole version dla partycji rozruchowej ma nazwę boot image version.

Ponieważ dysk RAM jest zawsze tworzony od podstaw, użycie ramdisk czasu wystarczy do opisania całego obrazu rozruchowego. Nie musisz kodować wersji jądra w wersji obrazu rozruchu, chyba że w przyszłości połączysz stary obraz rozruchu z nowym binarnym jądrem.

Przed aktualizacją OTA klient OTA sprawdza wersję obrazu rozruchowego w taki sam sposób jak każdą inną partycję.