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 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.