Halaman ini menjelaskan skema pembuatan versi untuk Generic Kernel Image (GKI). J Gambar Kernel Generik (GKI) memiliki pengenal unik yang disebut rilis {i>kernel<i}. Rilis {i>kernel<i} terdiri dari versi {i>kernel module interface <i}(KMI) dan sublevel. {i>Kernel<i} rilis spesifik untuk image yang dirilis, sedangkan versi KMI mewakili antarmuka yang digunakan untuk membuat sebuah rilis. Versi KMI dapat mendukung beberapa rilis {i>kernel<i}. Rilis {i>kernel<i} terikat hanya dengan satu versi KMI. Di beberapa kejadian di mana antarmuka modul {i> kernel<i} harus diubah, KMI diiterasi untuk mencerminkan perubahan dalam versi KMI.
Ringkasan persyaratan
Tabel berikut meringkas istilah penting yang digunakan pada halaman ini dan untuk pembaruan GKI.
Nama | Simbol | Contoh | Deskripsi |
---|---|---|---|
Rilis kernel | {i>w.x.y-zzz-k-akhiran<i} | 5.4.42-android12-0-foo | ID unik untuk rilis GKI. Ini adalah nilai
ditampilkan oleh uname . |
Versi KMI | w.x-zzz-k | 5.4-android12-0 | Menjelaskan {i>kernel module interface<i} (KMI) antara GKI dan modul kernel yang dapat dimuat secara dinamis (DLKM). |
Subtingkat | y | 42 | Menjelaskan urutan rilis rilis {i>kernel<i} dalam versi KMI yang sama. |
Tabel berikut mencantumkan istilah terkait lainnya sebagai referensi.
Nama | Simbol | Contoh | Deskripsi |
---|---|---|---|
lx. | lx. | 5.4.42 |
Untuk mengetahui detailnya, lihat Linux Kernel Makefiles (telusuri "KERNELRELEASE"). w.x.y digunakan langsung di seluruh dokumen ini. Hal ini juga biasanya disebut sebagai nomor versi tiga bagian. Istilah yang digunakan di VINTF, versi kernel, dapat menimbulkan kebingungan dengan istilah lain, terutama w. Variabel ini disebut sebagai kernel_version_tuple di libkver. Tuple ini tidak boleh diturunkan oleh update apa pun, termasuk OTA atau sebagai garis utama. |
Cabang kernel | zzz-w.x | Android 12-5.4 | Istilah ini digunakan di Jenis cabang kernel umum. |
Versi | w | 5 | Istilah ini tidak digunakan dalam dokumen ini. Variabel ini disebut sebagai version di libkver. |
Level patch | x | 4 | Istilah ini tidak digunakan dalam dokumen ini. Variabel ini disebut sebagai patch_level di libkver. |
Rilis Android | zzz | Android 12 |
Ini adalah nomor rilis Android (makanan penutup) yang dikaitkan dengan {i>kernel<i} kami.
Saat membandingkan kolom Nomor rilis Android tidak boleh dikurangi dengan update apa pun, termasuk OTA atau mainline. |
Pembuatan KMI | k | 0 |
Ini adalah angka tambahan yang ditambahkan untuk menangani peristiwa. Jika perbaikan bug keamanan membutuhkan perubahan pada KMI dalam Android, peningkatan pembuatan KMI. Nomor pembuatan KMI dimulai dengan 0. |
Desain pembuatan versi
Rilis kernel
Definisi
Untuk perangkat yang disertakan 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 {i>kernel<i}.
5.4.42-android12-0-00544-ged21d463f856
Deskripsi
Rilis {i>kernel<i} adalah ID unik dari rilis GKI. Jika dua biner GKI memiliki rilis {i>kernel<i} yang sama, mereka harus identik setiap {i>byte<i}.
Rilis {i>kernel<i} terdiri dari versi KMI, sublevel, dan akhiran. Sebagai tujuan dokumen ini, akhiran setelah pembuatan KMI diabaikan.
Versi KMI
Definisi
Versi KMI didefinisikan sebagai berikut:
KmiVersion :=
Version.PatchLevel-AndroidRelease-KmiGeneration
w .x -zzz -k
Perlu diketahui bahwa sublevel, y
, bukan bagian dari versi KMI. Untuk contoh
dalam rilis Kernel, versi KMInya adalah:
5.4-android12-0
Deskripsi
Versi KMI menjelaskan antarmuka modul {i> kernel<i} (KMI) antara GKI dan modul kernel yang dapat dimuat secara dinamis (DLKM).
Jika dua rilis {i>kernel<i} memiliki versi KMI yang sama, mereka mengimplementasikan {i>kernel<i} yang sama ruang lingkup modul ini. DLKM yang kompatibel dengan DLKM juga kompatibel dengan yang lain.
Versi KMI tidak boleh diturunkan oleh update OTA apa pun.
Subtingkat
Sublevel, y
, menjelaskan urutan rilis rilis kernel dalam
versi KMI yang sama.
Untuk dua rilis {i>kernel<i} yang memiliki versi KMI yang sama tetapi memiliki sublevel Y1 dan Y2 masing-masing:
- Jika Y1 kurang dari atau sama dengan Y2, perangkat yang menjalankan Y1 dapat menerima perbarui ke Y2.
- Jika Y1 lebih besar dari Y2, perangkat yang menjalankan Y1 tidak dapat diupdate ke Y2.
Artinya, jika versi KMI tidak berubah, sublevel tidak boleh diturunkan oleh update OTA apa pun.
Menentukan rilis kernel dari perangkat
Rilis kernel lengkap dapat ditemukan dengan mengeksekusi uname -r
, atau
uname(2)
dengan cuplikan kode berikut:
std::string get_kernel_release() {
struct utsname buf;
return uname(&buf) == 0 ? buf.release : "";
}
Contoh output-nya adalah:
5.4.42-android12-0-00544-ged21d463f856
Untuk tujuan dokumen ini, apa pun setelah pembuatan KMI diabaikan
saat mengekstrak informasi {i>kernel<i}. Secara lebih formal, output uname -r
adalah
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 {i>patch<i} di atas {i>kernel<i} dasar, dan {i> hash<i} SHA dari {i>git commit<i}.
{i>libkver<i}
{i>Library<i}, {i>libkver<i}, menyediakan antarmuka C++ untuk mengurai rilis {i>kernel<i} atau
String versi KMI. Untuk daftar API yang diekspos oleh libkver, lihat
packages/modules/Gki/libkver/include/kver
Pemeriksaan VINTF
Untuk Android 11 atau yang lebih rendah, bagian rilis Android dari versi KMI adalah yang ditentukan secara manual dalam manifes perangkat oleh produsen perangkat. Untuk mengetahui detailnya, lihat aturan pencocokan kernel VINTF.
Dari Android S, bagian rilis Android dari versi KMI dapat diekstrak dari {i>kernel<i} dan dimasukkan ke dalam manifes perangkat pada waktu {i>build<i}.
Karena persyaratan konfigurasi {i>kernel<i} umumnya
tidak berubah, tidak ada
perlu mengenkode k
dalam matriks kompatibilitas. Namun, dalam
saat persyaratan konfigurasi {i>kernel<i} memang perlu diubah, pastikan
hal berikut:
- Persyaratan yang terkait dari matriks kompatibilitas dihapus.
- Pengujian VTS tambahan ditambahkan untuk memeriksa persyaratan baru berdasarkan kondisi pembuatan KMI.
Versi image booting di metadata OTA
Bahkan jika image {i>booting<i} diperbarui melalui
pembaruan OTA, itu harus
yang digabungkan dalam format payload OTA, payload.bin
. Payload OTA mengenkode
Kolom version
untuk setiap partisi. Saat update_engine
menangani payload OTA,
ia membandingkan isian ini untuk
memastikan partisi tidak diturunkan.
Untuk menghindari kebingungan, kolom version
untuk partisi booting di OTA
metadatanya disebut boot image version
.
Karena ramdisk selalu dibuat dari awal, menggunakan ramdisk stempel waktu sudah cukup untuk menggambarkan keseluruhan image booting. Tidak perlu mengenkode rilis kernel pada versi image booting, kecuali jika Anda menggabungkan {i>boot image <i}ke biner {i> kernel<i} baru di masa mendatang.
Sebelum update OTA, klien OTA memeriksa versi booting image dengan cara yang sama seperti partisi lainnya.