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 związana z publikowanym obrazem, a wersja KMI reprezentuje interfejs, z którego powstaje 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 aktualizacjach dotyczących interfejsu Google Knowledge Graph.

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 dynamicznie ładowanymi modułami jądra (DLKM).
Podpoziom Y 42 Opisuje kolejność wydań jądra w tej samej wersji KMI.

W tabeli poniżej znajdziesz inne powiązane terminy.

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ż trzyczęściowy numer wersji. Termin używany w VINTF, kernel version, może być mylony z innymi terminami, zwłaszcza w.

W bibliotece libkver ta zmienna jest nazywana kernel_version_tuple.

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. W bibliotece libkver ta zmienna jest nazywana wersją.
Poziom poprawek x 4 Ten termin nie jest używany w tym dokumencie. Ta zmienna jest określana jako patch_levellibkver.
Wersja na Androida zzz android12

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

Podczas porównywania pola AndroidRelease z innego pola z danymi z poziomu usługi Google Analytics, z ciągu znaków jest wyodrębniana część liczbowa, która jest porównywana z danymi z innego 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.

Projektowanie wersji

Wydanie jądra

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 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 pliki binarne 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 ten 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 Wersja jądra wersja KMI to:

5.4-android12-0

Opis

Wersja KMI opisuje interfejs modułu jądra (KMI) między 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 tej samej wersji KMI.

W przypadku 2 wersji jądra z tą samą wersją KMI, ale z poziomem podrzędnym Y1 i Y2:

  • Jeśli Y1 jest mniejsze lub równe Y2, urządzenie z wersją Y1 może otrzymać aktualizację do wersji Y2.
  • Jeśli wartość Y1 jest większa niż Y2, na urządzeniu z wartością Y1 nie można zaktualizować wartości 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 polecenie 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. Jednak w mało prawdopodobnym przypadku, gdy konieczna jest zmiana wymogu konfiguracji jądra, upewnij się, że:

  • Odpowiednie wymaganie zostanie usunięte z tablicy zgodności.
  • 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 przez aktualizację OTA, musi być zapakowany w formacie pliku danych OTA (payload.bin). Ładunek 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ń, pole version partycji rozruchowej w metadanych OTA nosi 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ę.