Google berkomitmen untuk mendorong terwujudnya keadilan ras bagi komunitas Kulit Hitam. Lihat caranya.

Versi GKI

Halaman ini menjelaskan skema pembuatan versi untuk Gambar Kernel Generik (GKI). Sebuah Generik Kernel Gambar (GKI) memiliki pengenal yang unik yang disebut rilis kernel. Rilis kernel terdiri dari versi kernel module interface (KMI) dan sub-level. Rilis kernel khusus untuk gambar yang dirilis, sedangkan versi KMI mewakili antarmuka tempat rilis dibuat. Versi KMI dapat mendukung beberapa rilis kernel. Rilis kernel terikat hanya pada satu versi KMI. Dalam kejadian yang tidak mungkin di mana antarmuka modul kernel harus diubah, generasi KMI diulang untuk mencerminkan perubahan dalam versi KMI.

Ringkasan istilah

Tabel berikut merangkum istilah-istilah penting yang digunakan di halaman ini dan untuk pembaruan GKI.

Nama Simbol Contoh Keterangan
Rilis kernel wxy-zzz-k-suffix 5.4.42-android12-0-foo Pengenal unik untuk rilis GKI. Ini adalah nilai yang dikembalikan oleh uname .
versi KMI wx-zzz-k 5.4-android12-0 Menjelaskan antarmuka modul kernel (KMI) antara GKI dan modul kernel yang dapat dimuat secara dinamis (DLKM).
Sub-tingkat kamu 42 Menjelaskan urutan rilis rilis kernel dalam versi KMI yang sama.

Tabel berikut mencantumkan istilah terkait lainnya sebagai referensi.

Nama Simbol Contoh Keterangan
wxy wxy 5.4.42

Untuk rincian, lihat Linux Kernel Makefiles (mencari "KERNELRELEASE").

WXY digunakan secara langsung di seluruh dokumen ini. Hal ini juga sering disebut sebagai nomor versi tiga bagian. Istilah yang digunakan dalam VINTF, versi kernel, dapat menyebabkan kebingungan dengan istilah lain, terutama w.

Variabel ini disebut sebagai kernel_version_tuple di libkver .

Tuple ini tidak boleh dikurangi oleh pembaruan apa pun, termasuk OTA atau jalur utama.

Cabang kernel zzz-wx android12-5.4 Istilah ini digunakan dalam jenis cabang Umum kernel .
Versi: kapan w 5 Istilah ini tidak digunakan dalam dokumen ini. Variabel ini disebut sebagai versi di libkver .
Tingkat tambalan x 4 Istilah ini tidak digunakan dalam dokumen ini. Variabel ini disebut sebagai patch_level di libkver .
rilis Android zzz android12

Ini adalah nomor rilis Android (makanan penutup) yang terkait dengan kernel.

Ketika membandingkan AndroidRelease lapangan, bagian numerik diekstrak dari string untuk perbandingan.

Nomor rilis Android tidak boleh dikurangi oleh pembaruan apa pun, termasuk OTA atau jalur utama.

generasi KMI k 0

Ini adalah nomor tambahan yang ditambahkan untuk menangani peristiwa yang tidak mungkin terjadi. Jika perbaikan bug keamanan memerlukan perubahan pada KMI dalam rilis Android yang sama, generasi KMI akan ditingkatkan.

Nomor generasi KMI dimulai dengan 0.

Desain versi

Rilis kernel

Definisi

Untuk perangkat yang dikirimkan dengan GKI, rilis kernel didefinisikan sebagai berikut:

KernelRelease :=
Version.PatchLevel.SubLevel-AndroidRelease-KmiGeneration-suffix
w      .x         .y       -zzz           -k            -something

Untuk informasi lebih lanjut, lihat Menentukan rilis kernel dari perangkat .

Berikut ini adalah contoh rilis kernel.

5.4.42-android12-0-00544-ged21d463f856

Keterangan

Rilis kernel adalah ID unik dari rilis GKI. Jika dua binari GKI memiliki rilis kernel yang sama, keduanya harus identik secara byte.

Rilis kernel terdiri dari versi KMI, sub-level, dan sufiks. Untuk keperluan dokumen ini, akhiran setelah pembuatan KMI diabaikan.

versi KMI

Definisi

Versi KMI didefinisikan sebagai berikut:

KmiVersion :=
Version.PatchLevel-AndroidRelease-KmiGeneration
w      .x         -zzz           -k

Perhatikan bahwa sub-tingkat, y bukan bagian dari versi KMI. Untuk contoh di rilis Kernel , versi KMI adalah:

5.4-android12-0

Keterangan

Versi KMI menjelaskan antarmuka modul kernel (KMI) antara GKI dan modul kernel yang dapat dimuat secara dinamis (DLKM).

Jika dua rilis kernel memiliki versi KMI yang sama, mereka mengimplementasikan antarmuka modul kernel yang sama. DLKM yang kompatibel dengan satu juga kompatibel dengan yang lain.

Versi KMI tidak boleh dikurangi oleh pembaruan OTA apa pun.

Sub-tingkat

Sub-tingkat, y , menggambarkan urutan rilis rilis kernel dalam versi KMI yang sama.

Untuk dua rilis kernel yang memiliki versi KMI yang sama tetapi masing-masing memiliki sub-level Y1 dan Y2:

  • Jika Y1 kurang dari atau sama dengan Y2, perangkat yang menjalankan Y1 dapat menerima pembaruan ke Y2.
  • Jika Y1 lebih besar dari Y2, perangkat yang menjalankan Y1 tidak dapat diperbarui ke Y2.

Artinya, jika versi KMI tidak berubah, sub-level tidak boleh diturunkan oleh pembaruan OTA apa pun.

Menentukan rilis kernel dari perangkat

Rilis kernel lengkap dapat ditemukan dengan menjalankan uname -r , atau uname(2) dengan potongan kode berikut:

std::string get_kernel_release() {
  struct utsname buf;
  return uname(&buf) == 0 ? buf.release : "";
}

Contoh keluarannya adalah:

5.4.42-android12-0-00544-ged21d463f856

Untuk tujuan dokumen ini, apa pun setelah pembuatan KMI diabaikan saat mengekstrak informasi kernel. Lebih formal, output dari uname -r parsing dengan berikut regex (dengan asumsi zzz selalu dimulai dengan "android"):

^(?P<w>\d+)[.](?P<x>\d+)[.](?P<y>\d+)-(?P<z>android\d+)-(?P<k>\d+).*$

Informasi yang diabaikan dapat mencakup informasi seperti ci.android.com nomor build, jumlah tambalan di atas kernel dasar, dan hash SHA dari git commit.

libkver

Pustaka, libkver, menyediakan antarmuka C++ untuk mengurai rilis kernel atau string versi KMI. Untuk daftar API yang libkver paparan, melihat packages/modules/Gki/libkver/include/kver .

Cek VINTF

Untuk Android 11 atau lebih rendah, bagian rilis Android dari versi KMI ditentukan secara manual di manifes perangkat oleh produsen perangkat. Untuk rincian, lihat aturan pertandingan kernel VINTF .

Dari Android S, bagian rilis Android dari versi KMI dapat diekstraksi dari kernel dan disuntikkan ke dalam manifes perangkat pada waktu pembuatan.

Karena persyaratan konfigurasi kernel umumnya tidak berubah, tidak perlu untuk mengkodekan k dalam matriks kompatibilitas. Namun, jika persyaratan konfigurasi kernel perlu diubah, pastikan hal berikut:

  • Persyaratan yang sesuai dari matriks kompatibilitas dihapus.
  • Tes VTS tambahan ditambahkan untuk memeriksa persyaratan baru yang bergantung pada pembuatan KMI.

Versi gambar boot dalam metadata OTA

Bahkan jika boot image diperbarui melalui OTA update, itu harus dibungkus dalam format payload OTA, payload.bin . Payload OTA mengkodekan version lapangan untuk setiap partisi. Ketika update_engine menangani sebuah payload OTA, membandingkan bidang ini untuk memastikan partisi tidak diturunkan.

Kebingungan menghindari, yang version lapangan untuk partisi boot dalam metadata OTA disebut boot image version .

Karena ramdisk selalu dibangun dari awal, menggunakan timestamp ramdisk cukup untuk menggambarkan boot image secara keseluruhan. Tidak perlu menyandikan rilis kernel dalam versi boot image, kecuali jika Anda menggabungkan image boot lama ke biner kernel baru di masa mendatang.

Sebelum pembaruan OTA, klien OTA memeriksa versi gambar boot dengan cara yang sama seperti partisi lainnya.