A/B sistem güncellemelerini uygulamak isteyen OEM'ler ve SoC tedarikçileri, bootloader'larının sağlandığından emin olmalıdır. boot_control HAL'yi uygular ve doğru parametreleri, Search Ads 360'a kernel'e gidin.
Başlatma denetimi HAL'sini uygulama
A/B özellikli bootloader'lar boot_control
HAL'yi şurada uygulamalıdır:
hardware/libhardware/include/hardware/boot_control.h
. Uygulamaları kontrol etmek için
system/extras/bootctl
.
ve
system/extras/tests/bootloader/
.
Aşağıda gösterilen durum makinesini de uygulamanız gerekir:
.Çekirdek oluşturma
A/B sistem güncellemelerini uygulamak için:
-
Aşağıdaki çekirdek yaması serisini Cherrypick'leyin (gerekirse):
- Ramdisk olmadan başlatılıyor ve "kurtarma olarak başlat"ı kullanıyorsanız, cherrypick android-review.googlesource.com/#/c/158491/
- Ramdisk olmadan dm-verity'yi ayarlamak için cherrypick android-review.googlesource.com/#/q/status:merged+project:kernel/common+branch:android-3.18+topic:A_B_Changes_3.18 adresini ziyaret edin.
-
Çekirdek komut satırı bağımsız değişkenlerinin aşağıdaki ekstra bağımsız değişkenleri içerdiğinden emin olun:
...skip_initramfs rootwait ro init=/init root="/dev/dm-0 dm=system none ro,0 1 android-verity <public-key-id> <path-to-system-partition>"
<public-key-id>
değeri, bu işlem için kullanılan ortak anahtarın kimliğidir. doğrulama tablosu imzasını doğrulayın (ayrıntılar için bkz. dm-verity) girin. -
Ortak anahtarı içeren .X509 sertifikasını sistem anahtarlığına ekleyin:
-
.der
biçiminde biçimlendirilmiş .X509 sertifikasınıkernel
dizini. .X509 sertifikası.pem
dosyası için aşağıdakiopenssl
komutunu kullanın:.pem
-.der
biçimi:openssl x509 -in <x509-pem-certificate> -outform der -out <x509-der-certificate>
-
Sertifikayı sistem anahtarlığının bir parçası olarak içerecek şekilde
zImage
oluşturun. Doğrulamak içinprocfs
girişini kontrol edin (KEYS_CONFIG_DEBUG_PROC_KEYS
etkinleştirilecek): .X509 sertifikasının başarıyla eklenmesi, ortak anahtarın bulunduğunu gösterir eklemesi gerekir (vurgu, ortak anahtar kimliğini belirtir).angler:/# cat /proc/keys 1c8a217e I------ 1 perm 1f010000 0 0 asymmetri Android: 7e4333f9bba00adfe0ede979e28ed1920492b40f: X509.RSA 0492b40f [] 2d454e3e I------ 1 perm 1f030000 0 0 keyring .system_keyring: 1/4
-
Alanı
#
ile değiştir ve şu şekilde ilet:<public-key-id>
değerini ekleyin. Örneğin,Android:#7e4333f9bba00adfe0ede979e28ed1920492b40f
<public-key-id>
.
-
Derleme değişkenlerini ayarlama
A/B özellikli bootloader'lar aşağıdaki derleme değişkeni ölçütlerini karşılamalıdır:
A/B hedefi için tanımlanmalıdır |
/device/google/marlin/+/android-7.1.0_r1/device-common.mk . İsteğe bağlı olarak, şurada açıklanan yükleme sonrası (ancak yeniden başlatma öncesi) dex2oat adımını uygulayabilirsiniz:
Derleniyor.
|
---|---|
A/B hedefi için önemle tavsiye edilir |
|
A/B hedefi için tanımlanamıyor |
|
Hata ayıklama derlemeleri için isteğe bağlı | PRODUCT_PACKAGES_DEBUG += update_engine_client |
Bölümleri (alanlar) ayarlama
Android artık A/B cihazlarını kullanmadığından A/B cihazlarında kurtarma bölümü veya önbellek bölümü gerekmez
yardımcı olabilir. Veri bölümü artık indirilen OTA paketi için kullanılır ve
kurtarma görüntüsü kodu başlatma bölümündedir. A/B-ed olan tüm bölümler adlandırılmalıdır
aşağıdaki gibidir (alanlar her zaman a
, b
vb. olarak adlandırılır): boot_a
,
boot_b
, system_a
, system_b
, vendor_a
,
vendor_b
.
Önbellek
A/B olmayan güncellemelerde önbellek bölümü, indirilen OTA paketlerini depolamak ve Güncellemeleri uygularken engellemeleri geçici olarak saklayın. Önbelleği boyutlandırmanın iyi bir yolu yoktu bölüm: hangi güncellemeleri uygulamak istediğinize bağlı olması gereken boyut. En kötü sistem görüntüsü kadar büyük bir önbellek bölümü olacaktır. A/B güncellemeleriyle gerek yok (çünkü her zaman o anda kullanılmayan bir bölüme yazarsınız) ve A/B akışıyla, uygulamadan önce tüm OTA paketini indirmenize gerek yoktur.
Kurtarma
Kurtarma RAM diski artık boot.img
dosyasında yer alıyor. Bu nedenle,
bootloader, skip_initramfs
seçeneğini etkinleştiremez
ekleyebilirsiniz.
A/B olmayan güncellemelerde kurtarma bölümü, güncellemeleri uygulamak için kullanılan kodu içerir. A/B
güncellemeler, normal başlatılan sistem görüntüsünde çalışan update_engine
tarafından uygulanır.
Fabrika verilerine sıfırlama işlemi ve güncellemeleri başka cihazdan yüklemek için kullanılan bir kurtarma modu hâlâ vardır.
("kurtarma" adının geldiği yer). Kurtarma moduna ilişkin kod ve veriler
bir RAM'deki normal başlatma bölümünde saklanır; başlatılması için
bootloader, çekirdeğe ramdisk'i atlamasını söyler (aksi takdirde cihaz kurtarma işlemini başlatır)
yatırım yapmanız önemlidir. Kurtarma modu küçüktür (ve bunların büyük bir kısmı başlatma bölümündedir), bu nedenle
bölüm boyutu artmaz.
Fstab
slotselect
bağımsız değişkeni, A/B-ed parametresi için olmalıdır.
her bölüm için geçerlidir. Örnek:
<path-to-block-device>/vendor /vendor ext4 ro wait,verify=<path-to-block-device>/metadata,slotselect
Hiçbir bölüm vendor
olarak adlandırılmamalıdır. Bunun yerine, bölüm vendor_a
veya
vendor_b
seçilip /vendor
ekleme noktasına eklenecek.
Çekirdek yuvası bağımsız değişkenleri
Geçerli alan son eki, belirli bir cihaz ağacı (DT) düğümünden iletilmelidir
(/firmware/android/slot_suffix
) veya
androidboot.slot_suffix
çekirdek komut satırı veya bootconfig bağımsız değişkeni.
Varsayılan olarak, fastboot özelliği bir A/B cihazındaki geçerli yuvayı yanıp söner. Güncelleme paketi diğer güncel olmayan alan için resimleri içeriyorsa, fastboot bu resimleri de yanıp söndürür. Kullanılabilir seçenekler şunlardır:
-
--slot SLOT
. Varsayılan davranışı geçersiz kıl ve fastboot komutunu, tartışma. -
--set-active [SLOT]
. Zaman aralığını etkin olarak ayarlayın. İsteğe bağlı bağımsız değişken yoksa belirtildiğinde, geçerli aralık etkin olarak ayarlanır. fastboot --help
Komutlarla ilgili ayrıntıları öğrenin.
Bootloader fastboot'u uyguluyorsa şu komutu desteklemelidir:
Mevcut etkin zaman aralığını verilen zaman aralığına ayarlayan set_active <slot>
ayrıca, söz konusu alan için başlatılamayan bayrağını temizlemeli ve yeniden deneme sayısını varsayılana sıfırlamalıdır
) sağlar. Bootloader aşağıdaki değişkenleri de desteklemelidir:
-
has-slot:<partition-base-name-without-suffix>
. Verilen değer "evet" ise "evet" değerini döndürür bölüm, yuvaları destekler, aksi takdirde "hayır" değerini alır. current-slot
Sonrakinden başlatılacak alan son ekini döndürür.-
slot-count
. Kullanılabilir yuva sayısını temsil eden bir tam sayı döndürür. Şu anda iki alan desteklenmektedir, bu nedenle bu değer2
şeklindedir. -
slot-successful:<slot-suffix>
. "Evet" değerini döndürür verilen zaman aralığı başarıyla başlatılıyor olarak işaretlendi, "hayır" aksi takdirde. -
slot-unbootable:<slot-suffix>
. Belirtilen alan işaretlenmişse "yes" değerini döndürür. "no" (hayır) şeklinde olabilir. aksi takdirde. -
slot-retry-count:<slot-suffix>
. Denemek için kalan yeniden deneme sayısı başlatın.
Tüm değişkenleri görüntülemek için
fastboot getvar all
OTA paketleri oluşturma
OTA paketi araçları
komutlarının sayısını azaltır. target_files.zip
dosyası şu tarihe kadar oluşturulmalıdır:
A/B hedefi için derleme değişkenlerini tanımlama. OTA paketi araçları, verileri
ve A/B güncelleyici biçiminde paketler oluşturun.
Örnekler:
-
Tam OTA oluşturmak için:
./build/make/tools/releasetools/ota_from_target_files \ dist_output/tardis-target_files.zip \ ota_update.zip
-
Artımlı bir OTA oluşturmak için:
./build/make/tools/releasetools/ota_from_target_files \ -i PREVIOUS-tardis-target_files.zip \ dist_output/tardis-target_files.zip \ incremental_ota_update.zip
Bölümleri yapılandırma
update_engine
, aynı diskte tanımlanan herhangi bir A/B bölümü çiftini güncelleyebilir.
Bir bölüm çifti, ortak bir ön eke sahiptir (system
veya boot
gibi)
ve alan başına sonek (_a
gibi). Yükün ait olduğu bölümlerin listesi
oluşturucu bir güncellemenin AB_OTA_PARTITIONS
marka değişkeni tarafından yapılandırıldığını tanımlar.
Örneğin, bir bölüm çifti bootloader_a
ve
booloader_b
dahil (_a
ve _b
aralıktır
sonekleri varsa ürün veya panoda aşağıdakileri belirterek bu bölümleri güncelleyebilirsiniz.
yapılandırma:
AB_OTA_PARTITIONS := \ boot \ system \ bootloader
update_engine
tarafından güncellenen hiçbir bölüm,
bahsedeceğim. Artımlı veya delta güncellemeler sırasında, mevcut aralıktaki ikili veriler
yeni alandaki verileri oluşturmak için kullanılır. Herhangi bir değişiklik, yeni alan verilerinin
başarısız olabilir ve bu nedenle güncelleme de başarısız olabilir.
Yükleme sonrası yapılandırma
Yükleme sonrası adımını, güncellenen her bölüm için
anahtar/değer çiftleri. /system/usr/bin/postinst
adresinde bulunan bir programı yeni bir
görüntüsü içeriyorsa sistem bölümündeki dosya sisteminin köküne göre yolu belirtin.
Örneğin, usr/bin/postinst
system/usr/bin/postinst
(değilse)
bir RAM diski kullanarak). Ayrıca,
mount(2)
sistem çağrısı. Aşağıdakileri ürüne veya cihaza ekleyin
.mk
dosya (varsa):
AB_OTA_POSTINSTALL_CONFIG += \ RUN_POSTINSTALL_system=true \ POSTINSTALL_PATH_system=usr/bin/postinst \ FILESYSTEM_TYPE_system=ext4
Uygulamaları derleyin
Uygulamalar yeni sistem görüntüsüyle yeniden başlatmadan önce arka planda derlenebilir. Derlemek için arka planda kullandığınızda, aşağıdakini ürünün cihaz yapılandırmasına ekleyin ( ürünün device.mk):
-
Derleme komut dosyasının ve ikili programların doğru olduğundan emin olmak için yerel bileşenleri derlemeye ekleyin
derlenip sistem görüntüsüne eklenir.
# A/B OTA dexopt package PRODUCT_PACKAGES += otapreopt_script
-
Derleme komut dosyasını şu şekilde çalışan
update_engine
uygulamasına bağlayın: adımına geçelim.# A/B OTA dexopt update_engine hookup AB_OTA_POSTINSTALL_CONFIG += \ RUN_POSTINSTALL_system=true \ POSTINSTALL_PATH_system=system/bin/otapreopt_script \ FILESYSTEM_TYPE_system=ext4 \ POSTINSTALL_OPTIONAL_system=true
Önceden optimize edilen dosyaların kullanılmayan ikinci sistem bölümüne yüklenmesiyle ilgili yardım için şuraya bakın: DEX_PREOPT dosyalarının ilk başlatma yüklemesi.