Android 12'de Bootconfig'i Uygulamak

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 önyükleyiciden Android 12'ye geçirmek için bir mekanizmadır.

Bu özellik, Android kullanıcı alanı için yapılandırma parametrelerini çekirdek için olanlardan ayırmanın bir yolunu sağlar. Uzun androidboot.* çekirdek parametrelerini bootconfig dosyasına taşımak, çekirdek cmdline'da alan yaratır ve onu gelecekte kolay genişletme için kullanılabilir hale getirir.

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

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

12-5.10.xx çekirdek sürümüyle başlatılan yeni aygıtlar için önyükleme yapılandırma özelliğini uygulayın. Cihazları yükseltiyorsanız 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 daha düşük sürümlerde kullanılan çekirdek cmdline biçiminden yalnızca biraz farklı olduğunu unutmayın. Ancak, aşağıdaki fark kullanımınız için önemlidir:

  • Parametreler, boşluklarla değil yeni satır kaçış dizisi \n ile ayrılmalıdır.

Önyükleyici Örneği

Bir önyükleyici örneği için Cuttlefish U-boot referans önyükleyici uygulamasına bakın. Referanstaki iki taahhüt aşağıda listelenmiştir. İlki, önyükleme başlığı sürümü desteğini en son sürüme yükseltir. Örnekte, ilk taahhüt sürüm desteğini bir sonraki v4'e günceller (veya yükseltir). İkincisi iki şey yapar; bootconfig işleme ekler ve çalışma zamanında parametre eklemeyi gösterir:

Yapı Örneği

Satıcı önyükleme başlığı v4 ile vendor_boot.img oluşturmak için mkbootimg değişikliklerini gösteren bir derleme örneği için, bkz. mkbootimg changes for bootconfig . Aşağıdakileri yapmak için Mürekkep Balığı değişikliklerine bakın:

uygulama

Ortaklar, önyükleyicilerine destek eklemeli ve derleme zamanı androidboot.* parametrelerini çekirdek cmdline'dan bootconfig dosyasına taşımalıdır. Bu değişikliği uygulamanın en iyi yolu, bunu aşamalı olarak yapmaktır; Artımlı bir işlemin izlenmesi hakkında bilgi için Artımlı uygulama ve doğrulama bölümüne bakın.

/proc/cmdline dosyasında androidboot.* parametreleri için arama yapan değişiklikleriniz varsa, bunları bunun yerine /proc/bootconfig dosyasına yönlendirin. ro.boot.* özellikleri yeni bootconfig değerleriyle ayarlanır, bu nedenle bu özellikleri kullanarak kod için değişiklik yapmanız gerekmez.

Değişiklikleri Oluştur

İlk olarak, önyükleme 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 kernel cmdline parametresini ekleyin. Bu, çekirdeğin bootconfig bölümünü aramasını sağlar:

BOARD_KERNEL_CMDLINE += bootconfig

Bootconfig parametreleri, BOARD_BOOTCONFIG değişkenindeki parametrelerden oluşturulur, tıpkı çekirdek BOARD\_KERNEL\_CMDLINE oluşturulmasına benzer.

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

- BOARD_KERNEL_CMDLINE += androidboot..selinux=enforcing

+ BOARD_BOOTCONFIG += androidboot..selinux=enforcing

Önyükleyici Değişiklikleri

Önyükleyici, çekirdeğe atlamadan önce initramfs kurar. Çekirdek önyükleme yapılandırması , önyükleme yapılandırma bölümünü arar ve beklenen fragmanla initramfs, en sonunda olmasını arar.

Önyükleyici, satıcı önyükleme görüntüsü başlığından vendor_boot.img düzeni bilgilerini alır.

Diagram of bootconfig memory allocation layout

Ş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ını 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 zamanında bilinmeyen parametreler. Bilinmeyen parametreler eklenmelidir.

Derleme sırasında bilinen parametreler, bootconfig bölümündeki vendor_boot görüntüsünün sonuna paketlenir. Bölümün boyutu (bayt olarak) satıcı önyükleme üstbilgisi alanında vendor_bootconfig_size olarak depolanır.

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

Bootconfig fragmanı uygulandıktan sonra herhangi bir 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 adım adım uygulayın. Bootconfig parametreleri eklenirken çekirdek cmdline parametrelerine dokunmayın.

Doğrulama ile artımlı bir uygulama için adımlar şunlardır:

  1. Önyükleyiciyi yapın ve değişiklikleri oluşturun, ardından aşağıdakileri yapın:
    1. Yeni bir bootconfig parametresi eklemek için BOARD_BOOTCONFIG değişkenini kullanın.
    2. Aygıtın doğru şekilde önyüklemeye devam edebilmesi için çekirdek cmdline parametrelerini oldukları gibi tutun. Bu, hata ayıklamayı ve doğrulamayı çok daha kolay hale getirir.
  2. /proc/bootconfig içeriğini kontrol ederek çalışmanızı doğrulayın . Cihaz açıldıktan sonra yeni eklenen parametreyi gördüğünüzü doğrulayın.
  3. BOARD_BOOTCONFIG değişkenini ve önyükleyiciyi kullanarak BOARD_BOOTCONFIG androidboot.* parametrelerini çekirdek cmdline'dan bootconfig'e taşıyın.
  4. Parametrelerin her birinin /proc/bootconfig içinde bulunduğunu VE /proc/cmdline içinde olmadığını doğrulayın . Bunu doğrulayabilirseniz, uygulamanız başarılı olmuştur.

OTA yükseltme ve düşürme konuları

Android'in farklı sürümleri veya farklı çekirdek sürümleri arasında OTA yükseltmelerini ve düşürmelerini yönetirken, özel dikkat gösterilmelidir.

Android 12, bootconfig desteğine sahip ilk sürümdür. Bundan önceki herhangi bir sürüme geçiş yapılıyorsa, bootconfig yerine kernel cmdline parametreleri kullanılmalıdır.

Çekirdek sürümleri 12-5.4 ve üstü, önyükleme yapılandırmasını destekler. Bundan önceki herhangi bir sürüme (11-5.4 dahil) indirilirse, çekirdek cmdline parametreleri kullanılmalıdır.

Android 11 ve daha eski sürümlerden Android 12 ve sonraki sürümlere yükseltmeler, çekirdek cmdline parametrelerini kullanmaya devam edebilir. Aynı şey çekirdek sürümlerini yükseltmek için de geçerlidir.

Sorun giderme

Doğrulama adımını gerçekleştirdiğinizde, /proc/bootconfig içinde beklenen parametreleri görmüyorsanız, logcat içindeki çekirdek günlüklerini kontrol edin. Çekirdek destekliyorsa, her zaman bootconfig için bir günlük girişi bulunur.

Örnek günlük çıktısı

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

Döndürülen bir hata günlüğü görürseniz, bootconfig yüklenirken bir sorun olmuştur. Farklı hata türlerini görmek için init/main.c dosyasını görüntüleyin.