Android 12'de Bootconfig'in uygulanması

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ı yapıdan ve önyükleyiciden Android 12'ye aktarmaya yönelik bir mekanizmadır.

Bu özellik, Android kullanıcı alanına ilişkin yapılandırma parametrelerini çekirdeğe ait olanlardan ayırmanın bir yolunu sağlar. Uzun androidboot.* çekirdek parametrelerini bootconfig dosyasına taşımak, çekirdek cmdline'ında alan yaratır ve gelecekte kolayca genişletilebilmesini sağlar.

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 çekirdeği

12-5.10.xx çekirdek sürümüyle başlatılan yeni cihazlar için bootconfig özelliğini uygulayın. Cihazları yükseltiyorsanız bunu uygulamanıza gerek yoktur.

Ö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 kullanımınız açısından aşağıdaki fark önemlidir:

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

Önyükleyici Örneği

Bir önyükleyici örneği için Mürekkepbalığı U-önyükleme 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 sürüm olan v4'e günceller (veya yükseltir). İkincisi iki şey yapar; bootconfig yönetimini ekler ve çalışma zamanında parametre eklemeyi gösterir:

Yapı Örneği

Satıcı önyükleme başlığı v4 ile vendor_boot.img dosyasını oluşturmaya yönelik mkbootimg değişikliklerini gösteren bir yapı örneği için bkz mkbootimg changes for bootconfig . Aşağıdakileri yapmak için Mürekkepbalığı değişikliklerine bakın:

Uygulama

İş ortakları, önyükleyicilerine destek eklemeli ve derleme zamanı androidboot.* parametrelerini çekirdek cmdline'ından 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 süreci takip etme hakkında bilgi için Artımlı uygulama ve doğrulama bölümüne bakın.

androidboot.* parametrelerini /proc/cmdline dosyasında arayan değişiklikleriniz varsa, bunları bunun yerine /proc/bootconfig dosyasına yönlendirin. ro.boot.* özellikleri yeni bootconfig değerleriyle ayarlandığından, bu özellikleri kullanarak kodda değişiklik yapmanıza gerek yoktur.

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 çekirdeği 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 cmdline'ının BOARD\_KERNEL\_CMDLINE oluşturulduğu gibi.

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 ayarlar. Çekirdek önyükleme yapılandırması , bootconfig bölümünü arar ve beklenen fragmanla birlikte initramfs, en sonunda olmasını arar.

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

Diagram of bootconfig memory allocation layout

Şekil 1. Android 12 önyükleme yapılandırması bellek tahsisi

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 sırasında bilinen parametreler ve derleme sırası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 satıcı önyükleme başlığı alanında vendor_bootconfig_size saklanır (bayt olarak).

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

Bootconfig fragmanı uygulandıktan sonra herhangi bir parametre eklemeniz gerekirse fragmanın üzerine yazın ve onu yeniden uygulayın.

Artımlı uygulama ve doğrulama

Bu bölümde verilen işlemi takip ederek bootconfig özelliğini aşamalı olarak uygulayın. Bootconfig parametreleri eklenirken çekirdek cmdline parametrelerine dokunmadan bırakın.

Doğrulama ile artımlı uygulamaya yönelik adımlar şunlardır:

  1. Önyükleyiciyi yapın ve değişiklikler 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. 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 başlatıldıktan sonra yeni eklenen parametreyi gördüğünüzü doğrulayın.
  3. BOARD_BOOTCONFIG değişkenini ve önyükleyiciyi kullanarak androidboot.* parametrelerini çekirdek cmdline'ından bootconfig'e taşıyın .
  4. Parametrelerin her birinin /proc/bootconfig dosyasında bulunduğunu VE /proc/cmdline dosyasında bulunmadığını doğrulayın . Bunu doğrulayabiliyorsanız uygulamanız başarılı olmuştur.

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

Android'in farklı sürümleri veya farklı çekirdek sürümleri arasında OTA yükseltmelerini ve sürüm 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 çekirdek cmdline parametrelerinin kullanılması gerekir.

Çekirdek sürümleri 12-5.4 ve sonraki sürümler bootconfig'i destekler. Bundan önceki herhangi bir sürüme (11-5.4 dahil) geçiş yapılıyorsa, çekirdek cmdline parametrelerinin kullanılması gerekir.

Android 11 ve daha eski sürümlerden Android 12 ve daha yeni 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 dosyasında beklenen parametreleri görmüyorsanız logcat dosyasındaki çekirdek günlüklerini kontrol edin. Çekirdek destekliyorsa, bootconfig için her zaman 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

Bir hata günlüğünün döndüğünü görürseniz, bootconfig yüklenirken bir sorun var demektir. Farklı hata türlerini görmek için init/main.c dosyasını görüntüleyin.