Halaman ini menjelaskan skema pembuatan versi untuk Gambar Kernel Generik (GKI). Gambar Kernel Generik (GKI) memiliki pengidentifikasi 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. Jika 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 detailnya, lihat Linux Kernel Makefiles (cari "KERNELRELEASE"). wxy digunakan langsung di seluruh dokumen ini. 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 kernel umum . |
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. Saat membandingkan bidang 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 selengkapnya, 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-level, y
bukan bagian dari versi KMI. Untuk contoh dalam 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 yang satu juga kompatibel dengan yang lain.
Versi KMI tidak boleh dikurangi oleh pembaruan OTA apa pun.
Sub-tingkat
Sub-level, y
, menjelaskan 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 cuplikan 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. Secara lebih formal, output dari uname -r
diuraikan dengan regex berikut (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 nomor build ci.android.com , jumlah patch di atas kernel baseline, dan hash SHA dari git commit.
libkver
Pustaka, libkver, menyediakan antarmuka C++ untuk mengurai rilis kernel atau string versi KMI. Untuk daftar API yang diekspos libkver, lihat 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 detailnya, lihat aturan pencocokan kernel VINTF .
Dari Android S, bagian rilis Android dari versi KMI dapat diekstraksi dari kernel dan disuntikkan ke manifes perangkat pada waktu pembuatan.
Karena persyaratan konfigurasi kernel umumnya tidak berubah, tidak perlu menyandikan 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.
Boot versi gambar dalam metadata OTA
Bahkan jika gambar boot diperbarui melalui pembaruan OTA, itu harus dibungkus dalam format muatan OTA, payload.bin
. Payload OTA mengkodekan bidang version
untuk setiap partisi. Saat update_engine
menangani muatan OTA, ia membandingkan bidang ini untuk memastikan partisi tidak diturunkan.
Untuk menghindari kebingungan, bidang version
untuk partisi boot dalam metadata OTA disebut boot image version
.
Karena ramdisk selalu dibuat dari awal, menggunakan stempel waktu ramdisk sudah cukup untuk menggambarkan keseluruhan gambar boot. Tidak perlu menyandikan rilis kernel dalam versi image boot, 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.