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_tuple w libkver. 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 version w libkver. |
Poziom poprawek | x | 4 | Ten termin nie jest używany w tym dokumencie. Ta zmienna jest określana jako patch_level w libkver. |
Wersja na Androida | zzz | android12 |
Numer wersji Androida (deser), z którym powiązane jest jądro.
Podczas porównywania pola 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ę.