Android 12'de Bootconfig'i uygulama

Android 12'de bootconfig özelliği, Android 11 ve önceki sürümlerde kullanılan androidboot.* çekirdek cmdline seçeneklerinin yerini alır. Bootconfig özelliği, yapılandırma ayrıntılarını derleme ve bootloader'dan Android 12'ye geçirmek için kullanılan bir mekanizmadır.

Bu özellik, Android kullanıcı alanı yapılandırma parametrelerini çekirdekteki parametrelerden ayırmak için bir yol sunar. Uzun androidboot.* çekirdek parametrelerini bootconfig dosyasına taşımak, çekirdek cmdline'ında alan oluşturur ve bunu gelecekteki genişletmeler için kullanılabilir hale getirir.

Hem çekirdek hem de Android kullanıcı alanı, bootconfig öğesini desteklemelidir.

  • Bu desteğe sahip ilk sürüm: Android 12
  • Şu desteğe sahip ilk çekirdek sürümü: 12-5.4.xx çekirdek

12-5.10.xx çekirdek sürümüyle kullanıma sunulan yeni cihazlar için bootconfig özelliğini uygulayın. Cihazları yeni sürüme geçiriyorsanız bu API'yi uygulamanız gerekmez.

Örnekler ve kaynak

Bu bölümdeki örnekleri ve kaynak kodunu görüntülerken bootconfig kodunun biçiminin, Android 11 ve önceki sürümlerde kullanılan çekirdek cmdline'ının biçiminden yalnızca biraz farklı olduğunu unutmayın. Ancak kullanımınız açısından aşağıdaki fark önemlidir:

  • Parametreler boşlukla değil, yeni satır çıkış sırası \n ile ayrılmalıdır.

Bootloader örneği

Bootloader örneği için Cuttlefish U başlatma referansı bootloader uygulamasına bakın. Referanstaki iki kaydetme aşağıda listelenmiştir. İlki, başlatma başlığı sürümü desteğini en yeni sürüme yükseltir. Bu örnekte, ilk taahhüt, sürüm desteğini bir sonraki v4'e günceller. İkincisi ise iki şey yapar: bootconfig işlemeyi ekler ve çalışma zamanında parametre eklemeyi gösterir:

Derleme örneği

Tedarikçi firma başlatma başlığı v4 ile vendor_boot.img derlemesinde yapılan mkbootimg değişikliklerini gösteren derleme örneği için mkbootimg changes for bootconfig bölümüne bakın. Aşağıdakileri yapmak için Mürekkep balığı değişikliklerini görün:

Uygulama

İş ortakları, bootloader'larına destek eklemeli ve derleme zamanı androidboot.* parametrelerini çekirdek cmdline'sından bootconfig dosyasına taşımalıdır. Bu değişikliği uygulamanın en iyi yolu, kademeli olarak yapmaktır. Artımlı bir süreci takip etme hakkında bilgi için Artımlı uygulama ve doğrulama bölümünü inceleyin.

/proc/cmdline dosyasında androidboot.* parametrelerini arayan değişiklikleriniz varsa bunları /proc/bootconfig dosyasına yönlendirin. ro.boot.* özellikleri yeni bootconfig değerleriyle ayarlandığından, bu özellikleri kullanan kodlarda değişiklik yapmanız gerekmez.

Derleme değişiklikleri

İlk olarak, başlatma başlığı sürümünüzü sürüm 4'e yükseltin:

- BOARD_BOOT_HEADER_VERSION := 3

+ BOARD_BOOT_HEADER_VERSION := 4

bootconfig çekirdeği cmdline parametresini ekleyin. Bu, çekirdeğin bootconfig bölümünü aramasını sağlar:

BOARD_KERNEL_CMDLINE += bootconfig

bootconfig parametreleri, çekirdek cmdline'ının BOARD\_KERNEL\_CMDLINE kaynağından oluşturulduğuna çok benzer şekilde, BOARD_BOOTCONFIG değişkenindeki parametrelerden oluşturulur.

androidboot.* parametreleri, aşağıdakine benzer şekilde olduğu gibi taşınabilir:

- BOARD_KERNEL_CMDLINE += androidboot..selinux=enforcing

+ BOARD_BOOTCONFIG += androidboot..selinux=enforcing

Bootloader değişiklikleri

Bootloader, çekirdeğe atlamadan önce initramfs öğesini ayarlar. Çekirdek başlatma yapılandırması, bootconfig bölümünü arar ve beklenen fragmanın bulunduğu initramfs, bölümünün en sonunda olmasını sağlar.

Bootloader, vendor_boot.img düzen bilgilerini tedarikçi firma başlatma görüntüsü başlığından alır.

Bootconfig bellek ayırma düzeninin şeması

Şekil 1. Android 12 bootconfig bellek ayırma

Bootloader, bellekte bootconfig bölümünü oluşturur. bootconfig bölümü, aşağıdakiler için bellek ayırmaları içerir:

  • Parametreler
  • 4 B boyutu parameters size
  • 4 B boyutu parameters checksum
  • 12 B bootconfig sihirli dizesi (#BOOTCONFIG\n)

Parametreler iki kaynaktan gelir: Derleme zamanında bilinen parametreler ve derleme sırasında bilinmeyen parametreler. Bilinmeyen parametreler eklenmelidir.

Derleme zamanında bilinen parametreler, bootconfig bölümündeki vendor_boot görüntüsünün sonuna paketlenir. Bölümün boyutu tedarikçi başlatma başlığı alanında (vendor_bootconfig_size) depolanır (bayt olarak).

Derleme sırasında bilinmeyen parametreler, yalnızca bootloader'daki çalışma zamanında bilinir. Bunlar, bootconfig fragmanı uygulanmadan önce bootconfig parametreleri bölümünün sonuna eklenmelidir.

bootconfig fragmanı uygulandıktan sonra parametre eklemeniz gerekirse fragmanın üzerine yazın ve yeniden uygulayın.

Artımlı uygulama ve doğrulama

Bu bölümde verilen işlemi izleyerek bootconfig özelliğini aşamalı olarak uygulayın. Bootconfig parametreleri eklenirken çekirdek cmdline parametrelerini olduğu gibi bırakın.

Aşağıda, doğrulamalı artımlı uygulama için adımlar verilmiştir:

  1. Bootloader'ı ve derleme ayarlarını yapın, ardından aşağıdakileri yapın:
    1. Yeni bir bootconfig parametresi eklemek için BOARD_BOOTCONFIG değişkenini kullanın.
    2. Cihazın doğru şekilde açılmaya devam edebilmesi için çekirdek cmdline parametrelerini olduğu şekilde tutun. Bu sayede hata ayıklama ve doğrulama çok daha kolay hale gelir.
  2. /proc/bootconfig içeriğini kontrol ederek çalışmanızı doğrulayın. Cihaz başlatıldıktan sonra yeni eklenen parametreyi gördüğünüzü doğrulayın.
  3. BOARD_BOOTCONFIG değişkenini ve bootloader'ı kullanarak androidboot.* parametrelerini çekirdek cmdline'dan bootconfig'e taşıyın.
  4. Parametrelerin her birinin /proc/bootconfig içinde olduğunu VE /proc/cmdline içinde olmadığını doğrulayın. Bunu doğrulayabiliyorsanız uygulamanız başarılı demektir.

OTA'yı yeni sürüme ve eski sürüme geçirmeyle ilgili dikkat edilmesi gereken noktalar

Android'in farklı sürümleri veya farklı çekirdek sürümleri arasında OTA yükseltme ve düşürme işlemlerini yönetirken özellikle dikkatli olmanız gerekir.

Android 12, bootconfig destekli ilk sürümdür. Eski bir sürüme geçiyorsanız bootconfig yerine çekirdek cmdline parametreleri kullanılmalıdır.

12-5.4 ve sonraki çekirdek sürümleri bootconfig'i destekler. Bundan önceki herhangi bir sürüme(11-5.4 dahil) geçiyorsanız çekirdek cmdline parametreleri kullanılmalıdır.

Android 11 ve önceki sürümlerden Android 12 ve sonraki sürümlere yükseltmeler çekirdek cmdline parametrelerini kullanmaya devam edebilir. Aynı durum çekirdek sürümlerini yükseltme için de geçerlidir.

Sorun giderme

Doğrulama adımını gerçekleştirirken /proc/bootconfig ürününde beklenen parametreleri görmüyorsanız logcat tablosundaki çekirdek günlüklerini kontrol edin. Çekirdek destekliyorsa bootconfig için her zaman bir günlük girişi vardır.

Örnek günlük çıkışı

$ adb logcat | grep bootconfig
02-24 17:00:07.610     0     0 I Load bootconfig: 128 bytes 9 nodes

Bir hata günlüğü döndürülmesi, bootconfig yüklenirken bir sorun olduğu anlamına gelir. Farklı hata türlerini görmek için init/main.c'yi görüntüleyin.