A/B sistem güncellemelerini uygulamak isteyen OEM'ler ve SoC tedarikçileri, önyükleyicilerinin boot_control HAL'yi uyguladığından ve çekirdeğe doğru parametreleri ilettiğinden emin olmalıdır.
Başlatma kontrolü HAL'sini uygulama
A/B özellikli önyükleyiciler, boot_control
HAL'yi hardware/libhardware/include/hardware/boot_control.h
konumunda uygulamalıdır. Uygulamaları system/extras/bootctl
yardımcı programını ve system/extras/tests/bootloader/
kullanarak test edebilirsiniz.
Ayrıca aşağıda gösterilen durum makinesini de uygulamanız gerekir:

Çekirdeği ayarlama
A/B sistem güncellemelerini uygulamak için:
-
Gerekirse aşağıdaki çekirdek yama serisini seçin:
- Ramdisk olmadan başlatma ve "boot as recovery" kullanma durumunda android-review.googlesource.com/#/c/158491/ adresindeki değişikliği seçin.
- dm-verity'yi ramdisk olmadan ayarlamak için android-review.googlesource.com/#/q/status:merged+project:kernel/common+branch:android-3.18+topic:A_B_Changes_3.18 adresinden cherrypick yapın.
-
Ç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:
... buradaskip_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, doğruluk tablosu imzasını doğrulamak için kullanılan ortak anahtarın kimliğidir (ayrıntılar için dm-verity bölümüne bakın). -
Ortak anahtarı içeren .X509 sertifikasını sistem anahtar zincirine ekleyin:
-
.der
biçiminde biçimlendirilmiş .X509 sertifikasınıkernel
dizininin kök dizinine kopyalayın. .X509 sertifikası.pem
dosyası olarak biçimlendirilmişse.pem
biçiminden.der
biçimine dönüştürmek için aşağıdakiopenssl
komutunu kullanın:openssl x509 -in <x509-pem-certificate> -outform der -out <x509-der-certificate>
-
Sertifikayı sistem anahtarlığına dahil etmek için
zImage
oluşturun. Doğrulamak içinprocfs
girişini kontrol edin (KEYS_CONFIG_DEBUG_PROC_KEYS
'nin etkinleştirilmesi gerekir): .X509 sertifikasının başarılı bir şekilde eklenmesi, sistem anahtar zincirinde ortak anahtarın bulunduğunu gösterir (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
-
Boşluğu
#
ile değiştirin ve çekirdek komut satırında<public-key-id>
olarak iletin. Örneğin,<public-key-id>
yerineAndroid:#7e4333f9bba00adfe0ede979e28ed1920492b40f
iletin.
-
Derleme değişkenlerini ayarlama
A/B özellikli önyükleyicilerin aşağıdaki derleme değişkeni ölçütlerini karşılaması gerekir:
A/B hedefi için tanımlanmalıdır. |
/device/google/marlin/+/android-7.1.0_r1/device-common.mk bölümüne bakın. İsteğe bağlı olarak, Derleme bölümünde açıklanan yükleme sonrası (ancak yeniden başlatma öncesi) dex2oat adımını gerçekleştirebilirsiniz.
|
---|---|
A/B hedefi için kesinlikle önerilir |
|
A/B hedefi için tanımlanamıyor |
|
Hata ayıklama derlemeleri için isteğe bağlıdır. | PRODUCT_PACKAGES_DEBUG += update_engine_client |
Bölümleri (slot) ayarlama
Android artık bu bölümleri kullanmadığı için A/B cihazlarda kurtarma bölümü veya önbellek bölümü gerekmez. Veri bölümü artık indirilen OTA paketi için kullanılıyor ve kurtarma görüntüsü kodu, önyükleme bölümünde yer alıyor. A/B testi uygulanan tüm bölümlendirmeler aşağıdaki gibi adlandırılmalıdır (slotlar 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, indirilen OTA paketlerini depolamak ve güncellemeler uygulanırken blokları geçici olarak saklamak için önbellek bölümü kullanılıyordu. Önbellek bölümünün boyutunu belirlemenin hiçbir zaman iyi bir yolu olmamıştır: Ne kadar büyük olması gerektiği, uygulamak istediğiniz güncellemelere bağlıydı. En kötü senaryo, sistem görüntüsü kadar büyük bir önbellek bölümü olur. A/B güncellemelerinde blokları saklamanıza gerek yoktur (çünkü her zaman şu anda kullanılmayan bir bölüme yazarsınız). Ayrıca, akışlı A/B'de OTA paketinin tamamını uygulamadan önce indirmeniz gerekmez.
Kurtarma
Kurtarma RAM diski artık boot.img
dosyasında yer alıyor. Kurtarma moduna girerken önyükleyici, skip_initramfs
seçeneğini çekirdek komut satırına koyamaz.
A/B olmayan güncellemelerde, kurtarma bölümü güncellemeleri uygulamak için kullanılan kodu içerir. A/B
güncellemeleri, normal başlatılan sistem görüntüsünde update_engine
çalıştırılarak uygulanır.
Fabrika verilerine sıfırlama ve güncelleme paketlerinin yan yüklemesini gerçekleştirmek için kullanılan bir kurtarma modu hâlâ mevcuttur (Kurtarma adının kaynağı budur). Kurtarma moduyla ilgili kod ve veriler, ramdisk'teki normal önyükleme bölümünde saklanır. Önyükleyici, sistem görüntüsüne önyükleme yapmak için çekirdeğe ramdisk'i atlamasını söyler (aksi takdirde cihaz kurtarma modunda önyüklenir). Kurtarma modu küçüktür (ve büyük bir kısmı zaten önyükleme bölümündeydi). Bu nedenle önyükleme bölümünün boyutu artmaz.
Fstab
slotselect
bağımsız değişkeni, A/B testi yapılan bölümler için satırda olmalıdır. Örneğin:
<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, vendor_a
veya vendor_b
bölümü seçilip /vendor
bağlama noktasına bağlanır.
Çekirdek yuvası bağımsız değişkenleri
Mevcut yuva soneki, belirli bir cihaz ağacı (DT) düğümü (/firmware/android/slot_suffix
) veya androidboot.slot_suffix
çekirdek komut satırı ya da bootconfig bağımsız değişkeni aracılığıyla iletilmelidir.
Varsayılan olarak, fastboot, A/B cihazlarda mevcut yuvanın içeriğini yükler. Güncelleme paketi, diğer, geçerli olmayan yuva için de resimler içeriyorsa fastboot bu resimleri de yükler. Kullanılabilir seçenekler şunlardır:
-
--slot SLOT
. Varsayılan davranışı geçersiz kılın ve fastboot'u, bağımsız değişken olarak iletilen yuvanın yanıp sönmesini istemeye zorlayın. -
--set-active [SLOT]
. Slotu etkin olarak ayarlayın. İsteğe bağlı bir bağımsız değişken belirtilmezse mevcut yuva etkin olarak ayarlanır. fastboot --help
. Komutlarla ilgili ayrıntıları öğrenin.
Önyükleyici, fastboot'u uyguluyorsa geçerli etkin yuvanın belirtilen yuvaya ayarlanmasını sağlayan komutu desteklemelidir (bu işlem, söz konusu yuvanın önyüklenebilir olmayan işaretini de temizlemeli ve yeniden deneme sayısını varsayılan değerlere sıfırlamalıdır).set_active <slot>
Önyükleyici aşağıdaki değişkenleri de desteklemelidir:
-
has-slot:<partition-base-name-without-suffix>
. Belirtilen bölüm alanları destekliyorsa "yes", aksi takdirde "no" değerini döndürür. current-slot
. Bir sonraki başlatma işleminde kullanılacak yuva sonekini döndürür.-
slot-count
. Kullanılabilir alan sayısını temsil eden bir tam sayı döndürür. Şu anda iki yer desteklendiği için bu değer2
'dır. -
slot-successful:<slot-suffix>
. Belirtilen yuva başarılı şekilde başlatılmışsa "yes", aksi takdirde "no" değerini döndürür. -
slot-unbootable:<slot-suffix>
. Belirtilen yuva başlatılamaz olarak işaretlenmişse "evet", aksi takdirde "hayır" değerini döndürür. -
slot-retry-count:<slot-suffix>
. Belirli bir yuvanın başlatılması için kalan yeniden deneme sayısı.
Tüm değişkenleri görüntülemek için fastboot getvar all
komutunu çalıştırın.
OTA paketleri oluşturma
OTA paketi araçları, A/B olmayan cihazlardaki komutlarla aynı komutları kullanır. target_files.zip
dosyası, A/B hedefi için derleme değişkenleri tanımlanarak oluşturulmalıdır. OTA paketi araçları, A/B güncelleyici için otomatik olarak paketleri tanımlar ve oluşturur.
Ö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ı 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 tüm A/B bölümleri çiftini güncelleyebilir.
Bir bölüm çiftinin ortak bir öneki (ör. system
veya boot
) ve yuva başına soneki (ör. _a
) vardır. Yük oluşturucunun güncelleme tanımladığı bölümlerin listesi, AB_OTA_PARTITIONS
make değişkeniyle yapılandırılır.
Örneğin, bootloader_a
ve booloader_b
bölümleri dahil edilmişse (_a
ve _b
, yuva sonekleridir) ürün veya kart yapılandırmasında aşağıdakileri belirterek bu bölümleri güncelleyebilirsiniz:
AB_OTA_PARTITIONS := \ boot \ system \ bootloader
update_engine
tarafından güncellenen tüm bölümler, sistemin geri kalanı tarafından değiştirilmemelidir. Artımlı veya delta güncellemeleri sırasında, yeni alandaki verileri oluşturmak için mevcut alandaki ikili veriler kullanılır. Yapılan değişiklikler, yeni yer verilerinin güncelleme işlemi sırasında doğrulanmamasına ve dolayısıyla güncellemenin başarısız olmasına neden olabilir.
Yükleme sonrası yapılandırmayı ayarlama
Yükleme sonrası adımı, bir dizi anahtar/değer çifti kullanarak güncellenen her bölüm için farklı şekilde yapılandırabilirsiniz. /system/usr/bin/postinst
konumundaki bir programı yeni bir resimde çalıştırmak için sistem bölümündeki dosya sisteminin köküne göre yolu belirtin.
Örneğin, usr/bin/postinst
, system/usr/bin/postinst
olur (RAM diski kullanılmıyorsa). Ayrıca, mount(2)
sistem çağrısına iletilecek dosya sistemi türünü belirtin. Ürüne veya cihaza aşağıdaki bilgileri ekleyin
.mk
dosyaları (varsa):
AB_OTA_POSTINSTALL_CONFIG += \ RUN_POSTINSTALL_system=true \ POSTINSTALL_PATH_system=usr/bin/postinst \ FILESYSTEM_TYPE_system=ext4
Uygulamaları derleme
Uygulamalar, yeni sistem görüntüsüyle yeniden başlatılmadan önce arka planda derlenebilir. Uygulamaları arka planda derlemek için ürünün cihaz yapılandırmasına (ürünün device.mk dosyasında) aşağıdakileri ekleyin:
-
Derleme komut dosyasının ve ikili dosyaların derlenip sistem görüntüsüne dahil edilmesini sağlamak için yerel bileşenleri derlemeye ekleyin.
# A/B OTA dexopt package PRODUCT_PACKAGES += otapreopt_script
-
Derleme komut dosyasını, yükleme sonrası adım olarak çalışacak şekilde
update_engine
'ya bağlayın.# 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 seçilmiş dosyaları kullanılmayan ikinci sistem bölümüne yükleme konusunda yardım için DEX_PREOPT dosyalarının ilk başlatma kurulumu başlıklı makaleye bakın.