Schemat obsługi wersji GKI

Ta strona zawiera opis schematu obsługi wersji ogólnych obrazów jądra (GKI). Ogólny obraz jądra (GKI) ma unikalny identyfikator nazywany 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 jest tworzona wersja. Wersja KMI może obsługiwać wiele wersji jądra. Wersja jądra jest powiązana tylko z 1 wersją KMI. W mało prawdopodobnym przypadku, gdy trzeba zmienić interfejs modułu jądra, generacja KMI jest iterowana, aby odzwierciedlić zmianę wersji KMI.

Podsumowanie terminó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
Wersja 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 modułami jądra ładowanymi dynamicznie (DLKM).
Podpoziom y 42 Opisuje kolejność wydawania wersji 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 plikach Makefiles jądra systemu Linux Kernel (wyszukaj „KERNELRELEASE”).

w.x.y jest używane bezpośrednio w tym dokumencie. Jest to też często nazywane numerem wersji składającym się z 3 części. Termin używany w VINTF, wersja jądra, może powodować zamieszanie z innymi terminami, zwłaszcza w.

Ta zmienna jest nazywana kernel_version_tuple w libkver.

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

Gałąź jądra zzz-w.x android12-5.4 Ten termin jest używany w artykule Typowe gałęzie jądra.
Wersja w 5 Ten termin nie jest używany w tym dokumencie. Ta zmienna jest nazywana version w libkver.
Poziom poprawek x 4 Ten termin nie jest używany w tym dokumencie. Ta zmienna jest nazywana patch_level w libkver.
Wersja Androida zzz android12

Jest to numer wersji Androida (deseru), z którym jest powiązane z.

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

Numer wersji Androida nie może zostać zmniejszony przez żadne aktualizacje, w tym OTA lub mainline.

Generacja KMI k 0

Jest to dodatkowa liczba dodana w celu obsługi mało prawdopodobnych zdarzeń. Jeśli poprawka błędu zabezpieczeń wymaga zmian w KMI w ramach tej samej Androida, generacja KMI jest zwiększana.

Numer generacji KMI zaczyna się od 0.

Projekt obsługi wersji

Wersja jądra

Definicja

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

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

Więcej informacji znajdziesz w sekcji Określanie wersji jądra na podstawie urządzenia.

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 bajt po bajcie.

Wersja jądra składa się z wersji KMI, podpoziomu i sufiksu. Na potrzeby tego dokumentu sufiks po generacji 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 przypadku przykładu w sekcji Wersja jądra wersja KMI to:

5.4-android12-0

Opis

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

Jeśli 2 wersje jądra mają tę samą wersję KMI, implementują ten sam interfejs modułu jądra. Moduły DLKM, które są zgodne z jedną wersją, są też zgodne z drugą.

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

Podpoziom

Podpoziom y opisuje kolejność wydawania wersji jądra w ramach tej samej wersji KMI.

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

  • Jeśli Y1 jest mniejsze lub równe 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 się nie zmieni, podpoziom nie może zostać zmniejszony przez żadną aktualizację OTA.

Określanie wersji jądra na podstawie urządzenia

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 : "";
}

Oto przykład danych wyjściowych:

5.4.42-android12-0-00544-ged21d463f856

Na potrzeby tego dokumentu podczas wyodrębniania informacji o jądrze wszystko, co znajduje się po generacji KMI, jest ignorowane. 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ć takie dane jak numer kompilacji ci.android.com, liczba poprawek na podstawie jądra bazowego i skróty SHA zatwierdzenia git.

libkver

Biblioteka libkver udostępnia interfejs C++ do analizowania wersji jądra lub ciągu znaków wersji KMI. Listę interfejsów API, które udostępnia libkver, znajdziesz w packages/modules/Gki/libkver/include/kver.

Sprawdzanie VINTF

W przypadku Androida 11 lub starszego część wersji KMI dotycząca wersji Androida jest ręcznie określana w manifeście 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 dotycząca wersji Androida może zostać wyodrębniona z jądra i wstawiona do manifestu urządzenia w czasie kompilacji.

Ponieważ wymagania dotyczące konfiguracji jądra zwykle się nie zmieniają, nie trzeba kodować k w macierzy zgodności. Jeśli jednak w mało prawdopodobnym przypadku trzeba zmienić wymagania dotyczące konfiguracji jądra, upewnij się, że:

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

Wersja obrazu rozruchowego w metadanych OTA

Nawet jeśli obraz rozruchowy jest aktualizowany przez OTA, musi być opakowany w format ładunku OTA, payload.bin. Ładunek OTA koduje pole version dla każdej partycji. Gdy update_engine obsługuje ładunek OTA, porównuje to pole, aby upewnić się, że partycja nie jest obniżana.

Aby uniknąć nieporozumień, pole version dla 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ć sygnatury czasowej dysku RAM. Nie trzeba 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.