Wersjonowanie GKI

Na tej stronie opisano schemat wersjonowania ogólnych obrazów jądra (GKI). Ogólny obraz jądra (GKI) ma unikalny identyfikator zwany wersją jądra. Wydanie jądra składa się z wersji interfejsu modułu jądra (KMI) i poziomu podrzędnego. Wersja jądra jest specyficzna dla wydawanego obrazu, podczas gdy wersja KMI reprezentuje interfejs, z którego zbudowane jest wydanie. Wersja KMI może obsługiwać wiele wydań jądra. Wydanie jądra jest powiązane tylko z jedną wersją KMI. W mało prawdopodobnym przypadku, gdy trzeba zmienić interfejs modułu jądra, generowanie KMI jest powtarzane, aby odzwierciedlić zmianę w wersji KMI.

Podsumowanie warunków

W poniższej tabeli podsumowano ważne terminy używane na tej stronie oraz w aktualizacjach GKI.

Nazwa Symbol Przykład Opis
Wydanie jądra przyrostek wxy-zzz-k 5.4.42-Android12-0-foo Unikalny identyfikator wersji GKI. To jest wartość zwrócona przez uname .
Wersja KMI wx-zzz-k 5.4-Android12-0 Opisuje interfejs modułu jądra (KMI) pomiędzy GKI i dynamicznie ładowanymi modułami jądra (DLKM).
Poziom podrzędny y 42 Opisuje kolejność wydań jądra w tej samej wersji KMI.

W poniższej tabeli wymieniono inne powiązane terminy jako odniesienie.

Nazwa Symbol Przykład Opis
wxy wxy 5.4.42

Aby uzyskać szczegółowe informacje, zobacz pliki Makefile jądra systemu Linux (wyszukaj „KERNELRELEASE”).

wxy jest używane bezpośrednio w całym dokumencie. Jest to również powszechnie określane jako trzyczęściowy numer wersji . Termin używany w VINTF, wersja jądra , może powodować zamieszanie z innymi terminami, zwłaszcza z w .

Ta zmienna jest określana jako kernel_version_tuple w libkver .

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

Gałąź jądra zzz-wx android12-5.4 Termin ten jest używany w popularnych typach gałęzi jądra .
Wersja w 5 Termin ten nie jest używany w tym dokumencie. Ta zmienna jest nazywana wersją w libkver .
Poziom poprawki X 4 Termin ten nie jest używany w tym dokumencie. Ta zmienna jest określana jako poziom_łatki w libkver .
Wersja Androida zzz android12

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

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

Numer wersji Androida nie może zostać zmniejszony przez żadne aktualizacje, w tym OTA lub główne.

Generacja KMI k 0

Jest to dodatkowa liczba dodana w celu uwzględnienia mało prawdopodobnych zdarzeń. Jeśli poprawka błędu bezpieczeństwa wymaga zmian w KMI w tej samej wersji Androida, generowanie KMI zostaje zwiększone.

Numer generacji KMI zaczyna się od 0.

Projekt wersji

Wydanie jądra

Definicja

W przypadku urządzeń dostarczanych z GKI, wydanie jądra jest zdefiniowane w następujący sposób:

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

Aby uzyskać więcej informacji, zobacz Określanie wersji jądra na podstawie urządzenia .

Poniżej znajduje się przykład wydania jądra.

5.4.42-android12-0-00544-ged21d463f856

Opis

Wersja jądra jest unikalnym identyfikatorem wydania GKI. Jeśli dwa pliki binarne GKI mają tę samą wersję jądra, muszą być identyczne pod względem bajtów.

Wydanie jądra składa się z wersji KMI, poziomu podrzędnego i przyrostka. Na potrzeby tego dokumentu przyrostek 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

Należy pamiętać, że podpoziom 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) pomię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. DLKM kompatybilne z jednym są również kompatybilne z drugim.

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

Poziom podrzędny

Podpoziom y opisuje kolejność wydań jądra w tej samej wersji KMI.

Dla dwóch wydań jądra, które mają tę samą wersję KMI, ale mają odpowiednio podpoziom Y1 i Y2:

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

Oznacza to, że jeśli wersja KMI się nie zmieni, podpoziom nie może zostać obniżony przez żadną aktualizację OTA.

Określanie wydania jądra z urządzenia

Pełną wersję jądra można znaleźć, wykonując polecenie uname -r lub uname(2) z następującym fragmentem kodu:

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

Przykładowe wyjście to:

5.4.42-android12-0-00544-ged21d463f856

Na potrzeby tego dokumentu wszystko po wygenerowaniu KMI jest ignorowane podczas wyodrębniania informacji o jądrze. Bardziej formalnie, wynik uname -r jest analizowany za pomocą następującego 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 informacje, jak numer kompilacji ci.android.com , liczba poprawek na jądrze bazowym i skróty SHA zatwierdzenia git.

biblioteka

Biblioteka libkver zapewnia interfejs C++ umożliwiający analizowanie wydania jądra lub ciągu znaków wersji KMI. Aby zapoznać się z listą interfejsów API udostępnianych przez libkver, zobacz packages/modules/Gki/libkver/include/kver .

VINTF sprawdza

W przypadku systemu Android 11 lub starszego część wersji KMI dotycząca wydania systemu Android jest określana ręcznie w manifeście urządzenia przez producentów urządzeń. Aby uzyskać szczegółowe informacje, zobacz reguły dopasowania jądra VINTF .

W systemie Android S część wersji KMI dla systemu Android można wyodrębnić z jądra i wstrzyknąć do manifestu urządzenia w czasie kompilacji.

Ponieważ wymagania konfiguracyjne jądra generalnie się nie zmieniają, nie ma potrzeby kodowania k w macierzy zgodności. Jednakże w mało prawdopodobnym przypadku, gdy wymagania dotyczące konfiguracji jądra wymagają zmiany, upewnij się, że:

  • Usunięto odpowiednie wymaganie z matrycy zgodności.
  • Dodano dodatkowe testy VTS w celu sprawdzenia nowych wymagań pod warunkiem wygenerowania KMI.

Wersja obrazu rozruchowego w metadanych OTA

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

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

Ponieważ ramdysk jest zawsze budowany od zera, użycie znacznika czasu ramdysku wystarczy do opisania całego obrazu startowego. Nie ma potrzeby kodowania wersji jądra w wersji obrazu startowego, chyba że w przyszłości będziesz łączyć stary obraz startowy z nowym plikiem binarnym jądra.

Przed aktualizacją OTA klient OTA sprawdza wersję obrazu rozruchowego w taki sam sposób, jak każda inna partycja.