Schemat obsługi wersji GKI

Na tej stronie opisano schemat obsługi wersji dla ogólnych obrazów jądra (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 wymaga zmiany, 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 szer.x-zzz-k 5.4-android12-0 Opis interfejsu 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 poniższej tabeli wymienione są także inne powiązane terminy.

Nazwa Symbol Przykład Opis
w.x.y szeroka x y 5.4.42

Szczegółowe informacje można znaleźć w sekcji Linux Tworzenie plików jądra (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 z w.

W bibliotece libkver ta zmienna jest nazywana kernel_version_tuple.

Tej krotki nie można zmniejszać przez żadne aktualizacje, w tym aktualizacje OTA ani Mainline.

Gałąź jądra zzz-s.x android12-5.4 Termin ten jest używany w  typach gałęzi jądra.
Wersja w 5 Termin ten nie jest używany w tym dokumencie. Jest to tzw. zmienna version w bibliotece libkver.
Poziom poprawki x 4 Ten termin nie jest używany w tym dokumencie. Ta zmienna jest określana jako patch_levellibkver.
Wersja Androida zzz android12

To jest numer wersji Androida (deser), z którym jest powiązane jądro z naszymi usługami.

Podczas porównywania pola AndroidRelease część liczbowa to wyodrębnione z ciągu do porównania.

Numeru wersji Androida nie można zmniejszać przez żadne aktualizacje, w tym OTA lub mainline.

Generowanie KMI K 0

Dodanie tego numeru w celu rozwiązania problemu z mało prawdopodobnymi 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.

Projekt obsługi wersji

Wydanie jądra systemu

Definicja

W przypadku urządzeń dostarczanych z Google Play for Kernel wersja jądra jest określana 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 podstawie urządzenia.

Poniżej znajduje się 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ą to samo jądro, muszą być identyczne pod względem bajtów.

Wersja jądra składa się z wersji KMI, poziomu podrzędnego i sufiksu. Dla: dla celów tego dokumentu, przyrostek po wygenerowaniu 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. Na przykład w Wersja 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 DLKM zgodne z jednym z nich są też zgodne z drugim.

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

Podpoziom

Podpoziom (y) opisuje kolejność wersji jądra w tę samą wersję KMI.

Dla dwóch wersji jądra, które mają tę samą wersję KMI, ale są podrzędne na poziomie Y1 oraz Y2 odpowiednio:

  • Jeśli wartość Y1 jest mniejsza lub równa Y2, urządzenie z wartością Y1 może otrzymać zaktualizować do 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 urządzenia

Aby znaleźć pełną wersję jądra, wykonaj 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 dane wyjściowe:

5.4.42-android12-0-00544-ged21d463f856

Na potrzeby tego dokumentu wszystko, co następuje po wygenerowaniu KMI, jest ignorowane podczas wyodrębniania informacji o jądrze. Bardziej oficjalnie dane wyjściowe funkcji uname -r to analizowana 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ć numer kompilacji ci.android.com, liczbę poprawek dodanych do podstawowego jądra oraz sumy kontrolne SHA commitów git.

libkver

Biblioteka libkver udostępnia interfejs w języku C++ do analizowania wersji jądra lub Ciąg znaków 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ń. Więcej informacji: zobacz reguły 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. Jednak w mało prawdopodobnych w którym wymaga zmiany konfiguracji jądra, upewnij się, następujące:

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

Wersja obrazu rozruchowego w metadanych OTA

Nawet jeśli obraz rozruchowy jest aktualizowany za pomocą aktualizacji OTA, musi być zapakowany w formacie pliku obrazu OTA (payload.bin). Payload OTA koduje pole version dla każdej partycji. Gdy update_engine obsługuje ładunek OTA, porównuje to pole, aby sprawdzić, czy partycja nie została obniżona.

Aby uniknąć nieporozumień, pole version w metadanych OTA 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żda inna partycja.