Ta strona opisuje schemat wersjonowania ogólnych obrazów jądra (GKI). Ogólny obraz jądra (GKI) ma unikalny identyfikator zwany wydaniem 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 interfejs modułu jądra musi zostać zmieniony, generowanie KMI jest iterowane, aby odzwierciedlić zmianę wersji KMI.
Podsumowanie warunków
Poniższa tabela zawiera podsumowanie ważnych terminów używanych na tej stronie oraz w przypadku aktualizacji GKI.
Nazwa | Symbol | Przykład | Opis |
---|---|---|---|
Wydanie jądra | wxy-zzz-k-suffix | 5.4.42-android12-0-foo | Unikalny identyfikator wydania GKI. Jest to wartość zwracana przez uname . |
Wersja KMI | wx-zzz-k | 5.4-android12-0 | Opisuje interfejs modułu jądra (KMI) między GKI a dynamicznie ładowanymi modułami jądra (DLKM). |
Poziom podrzędny | tak | 42 | Opisuje kolejność wydawania wydań jądra w ramach 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 Linux Kernel Makefiles (wyszukaj "KERNELRELEASE"). wxy jest używany bezpośrednio w tym dokumencie. Jest to również powszechnie określane jako trzyczęściowy numer wersji . Termin używany w VinTF, wersja jądra , może mylić z innymi terminami, zwłaszcza 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 linię główną. |
Oddział jądra | zzz-wx | Android12-5.4 | Termin ten jest używany w typach wspólnych gałęzi jądra . |
Wersja | w | 5 | Termin ten nie jest używany w tym dokumencie. Ta zmienna jest określana jako wersja w libkver . |
Poziom aktualizacji | x | 4 | Termin ten nie jest używany w tym dokumencie. Ta zmienna jest określana w libkver jako patch_level . |
Wersja Androida | zzz | android12 | Jest to numer wydania Androida (deserowy), z którym powiązane jest jądro. Podczas porównywania pola Numer wersji Androida nie może być zmniejszany przez żadne aktualizacje, w tym OTA lub mainline. |
Generacja KMI | k | 0 | Jest to dodatkowa liczba dodana, aby poradzić sobie z mało prawdopodobnymi zdarzeniami. Jeśli poprawka błędu zabezpieczeń wymaga zmian w KMI w tej samej wersji systemu Android, generowanie KMI zostanie zwiększone. Numer generacji KMI zaczyna się od 0. |
Projektowanie wersji
Wydanie jądra
Definicja
W przypadku urządzeń dostarczanych z GKI wersja jądra jest zdefiniowana 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 wydania jądra z urządzenia .
Poniżej znajduje się przykład wydania jądra.
5.4.42-android12-0-00544-ged21d463f856
Opis
Wydanie jądra jest unikalnym identyfikatorem wydania GKI. Jeśli dwa pliki binarne GKI mają to samo wydanie jądra, muszą być identyczne pod względem bajtów.
Wydanie jądra składa się z wersji KMI, podpoziomu i przyrostka. Na potrzeby 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
Zauważ, że podpoziom y
nie jest częścią wersji KMI. Na przykład w wersji Kernel 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. DLKM, które są kompatybilne z jednym, są również kompatybilne z drugim.
Wersja KMI nie może być zmniejszana przez żadne aktualizacje OTA.
Poziom podrzędny
Poziom podrzędny, y
, opisuje kolejność wydawania wydań jądra w ramach 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 działające na Y1 może otrzymać aktualizację do Y2.
- Jeśli Y1 jest większe niż Y2, urządzenie działające na Y1 nie może zostać zaktualizowane do Y2.
Oznacza to, że jeśli wersja KMI się nie zmieni, podpoziom nie może zostać zmniejszony przez żadną aktualizację OTA.
Określanie wydania jądra z urządzenia
Pełne wydanie jądra można znaleźć, wykonując 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 dane wyjściowe 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, wyjście uname -r
jest analizowane z następującym wyrażeniem regularnym (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+).*$
Zignorowane informacje mogą obejmować takie informacje, jak numer kompilacji ci.android.com , liczba poprawek na jądrze podstawowym i skróty SHA zatwierdzenia git.
libkver
Biblioteka libkver udostępnia interfejs C++ do analizowania wydania jądra lub ciągu wersji KMI. Aby uzyskać listę API, które udostępnia libkver, zobacz packages/modules/Gki/libkver/include/kver
.
Czeki VITF
W przypadku systemu Android 11 lub starszego część wersji KMI dla 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 .
Z systemu 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 w mało prawdopodobnym przypadku, gdy wymaganie konfiguracji jądra musi zostać zmienione, upewnij się, że:
- Odpowiednie wymaganie z macierzy kompatybilności zostało usunięte.
- Dodano dodatkowe testy VTS w celu sprawdzenia nowych wymagań w zależności od generowania KMI.
Wersja obrazu rozruchowego w metadanych OTA
Nawet jeśli obraz rozruchowy jest aktualizowany za pomocą aktualizacji 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żona.
Aby uniknąć nieporozumień, pole version
dla partycji rozruchowej w metadanych OTA nazywa się boot image version
.
Ponieważ ramdysk jest zawsze budowany od podstaw, użycie znacznika czasu ramdysku jest wystarczające do opisania całego obrazu rozruchowego. Nie ma potrzeby kodowania wydania jądra w wersji obrazu startowego, chyba że w przyszłości połączysz 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.