A/B sistem güncellemeleri uygulamak isteyen OEM'ler ve SoC tedarikçileri, bootloader'larının boot_control HAL'ini uyguladığından ve doğru parametreleri çekirdeğe ilettiğinden emin olmalıdır.
Başlatma kontrolü HAL'sini uygulama
A/B uyumlu önyükleyenler, hardware/libhardware/include/hardware/boot_control.h
adresinde boot_control
HAL'i uygulamalıdır. system/extras/bootctl
aracını ve system/extras/tests/bootloader/
'ı kullanarak uygulamaları test edebilirsiniz.
Aşağıda gösterilen durum makinesini de uygulamanız gerekir:

Çekirdeği ayarlama
A/B sistem güncellemelerini uygulamak için:
-
Aşağıdaki çekirdek yaması serilerini seçin (gerekirse):
- Ramdisk olmadan önyükleme yapıyor ve "kurtarma olarak önyükleme"yi kullanıyorsanız android-review.googlesource.com/#/c/158491/ adresinden 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 ilgili değişiklikleri seçin.
-
Çekirdek komut satırı bağımsız değişkenlerinin aşağıdaki ek 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, Verity 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üne 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 anahtar zincirinin bir parçası olarak içerecek şekilde
zImage
'ü derleyin. Doğrulamak içinprocfs
girişini kontrol edin (KEYS_CONFIG_DEBUG_PROC_KEYS
'ın etkinleştirilmesi gerekir): .X509 sertifikasının başarılı bir şekilde eklenmesi, ortak anahtarın sistem anahtar zincirinde bulunduğunu gösterir (ortak anahtar kimliği vurgulanmıştır).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
değerini gönderin.
-
Derleme değişkenlerini ayarlama
A/B uyumlu önyükleme programları 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 bölümüne bakın. İsteğe bağlı olarak, Derleme bölümünde açıklanan dex2oat adımını yükleme sonrası (ancak yeniden başlatma öncesi) 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 (slotları) ayarlama
Android artık bu bölümleri kullanmadığından 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ır ve kurtarma resmi kodu, önyükleme bölümündedir. A/B testi yapılan tüm bölümler 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, önbellek bölümü indirilen OTA paketlerini depolamak ve güncellemeleri uygularken blokları geçici olarak saklamak için 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ü durum, sistem görüntüsüyle aynı büyüklükte bir önbellek bölümüdür. A/B güncellemelerinde, blokları gizlemeye gerek yoktur (çünkü her zaman kullanılmayan bir bölüme yazarsınız) ve A/B aktarımında, OTA paketinin tamamını uygulamadan önce indirmeniz gerekmez.
Kurtarma
Kurtarma RAM diski artık boot.img
dosyasında yer alır. Kurtarma moduna girerken önyükleme skip_initramfs
seçeneğini çekirdek komut satırına koyamaz.
A/B olmayan güncellemeler için güncellemeleri uygulamak üzere kullanılan kod, kurtarma bölümünde bulunur. A/B güncellemeleri, update_engine
normal olarak başlatılmış sistem görüntüsünde çalıştırılarak uygulanır.
Fabrika verilerini sıfırlamak ve güncelleme paketlerini harici olarak yüklemek için kullanılan bir kurtarma modu Kurtarma modu kodu ve verileri, normal önyükleme bölümündeki bir ramdisk'te saklanır. Sistem görüntüsüne önyükleme yapmak için önyükleme yükleyici, ç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ündedir) bu nedenle önyükleme bölümünün boyutu artmaz.
Fstab
A/B testine tabi bölümler için slotselect
bağımsız değişkeni satırda olmalıdır. Ö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, vendor_a
veya vendor_b
bölümü seçilir ve /vendor
bağlama noktasına monte edilir.
Çekirdek yuvası bağımsız değişkenleri
Mevcut yuva son eki, 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 üzerinden iletilmelidir.
Varsayılan olarak fastboot, A/B cihazdaki mevcut yuvayı yanıp söner. Güncelleme paketi, mevcut olmayan diğer yuvayla ilgili resimler de içeriyorsa fastboot bu resimleri de işler. Kullanılabilir seçenekler şunlardır:
-
--slot SLOT
. Varsayılan davranışı geçersiz kılın ve fastboot'tan bağımsız değişken olarak iletilen yuvayı yanıp sönmesini isteyin. -
--set-active [SLOT]
. Yuvayı etkin olarak ayarlayın. İsteğe bağlı bir bağımsız değişken belirtilmezse mevcut slot etkin olarak ayarlanır. fastboot --help
. Komutlarla ilgili ayrıntıları öğrenin.
Önyükleme yükleyicisi hızlı önyüklemeyi uygularsa geçerli etkin yuvayı belirli bir yuvaya ayarlayan set_active <slot>
komutunu desteklemelidir (bu komut, ilgili yuvanın önyükleme yapılamaz işaretini de temizleyip yeniden deneme sayısını varsayılan değerlere sıfırlamalıdır). Önyükleyici aşağıdaki değişkenleri de desteklemelidir:
-
has-slot:<partition-base-name-without-suffix>
. Belirtilen bölüm yuvaları destekliyorsa "yes", aksi takdirde "no" değerini döndürür. current-slot
. Bir sonrakinde başlatılacak yuva son ekini döndürür.-
slot-count
. Kullanılabilir alanların sayısını temsil eden bir tam sayı döndürür. Şu anda iki slot desteklenmektedir. Bu nedenle bu değer2
'tür. -
slot-successful:<slot-suffix>
. Belirtilen yuva başarıyla önyükleme yaptığına dair işaretlenmişse "evet", aksi takdirde "hayır" değerini döndürür. -
slot-unbootable:<slot-suffix>
. Belirtilen yuva önyükleme yapılamaz olarak işaretlenmişse "evet", aksi takdirde "hayır" değerini döndürür. -
slot-retry-count:<slot-suffix>
. Belirtilen yuvayı başlatmak 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 paket araçları, A/B olmayan cihazlara yönelik 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 paket araçları, A/B güncelleyicinin biçiminde paketleri otomatik olarak 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üm çiftlerini güncelleyebilir.
Bir çift bölüm ortak bir ön ek (system
veya boot
gibi) ve _a
gibi bir yuva başına son ek içerir. Yük oluşturucunun güncelleme tanımladığı bölümlerin listesi, AB_OTA_PARTITIONS
make değişkeni tarafından yapılandırılır.
Örneğin, bootloader_a
ve booloader_b
adlı bir bölüm çifti dahil edilmişse (_a
ve _b
, yuva eklerinden oluşur) ü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 yuvada verileri oluşturmak için mevcut yuvadaki ikili veriler kullanılır. Herhangi bir değişiklik, yeni slot verilerinin güncelleme işlemi sırasında doğrulama işlemini geçememesine ve dolayısıyla güncellemenin başarısız olmasına neden olabilir.
Sonraki kurulumu yapılandırma
Bir dizi anahtar/değer çifti kullanarak güncellenen her bölüm için yükleme sonrası adımını farklı şekilde yapılandırabilirsiniz. /system/usr/bin/postinst
adresindeki bir programı yeni bir görüntüde ç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
'tır (RAM disk kullanılmıyorsa). Ayrıca, mount(2)
sistem çağrısına iletilecek dosya sistemi türünü de belirtin. Ürün veya cihaz .mk
dosyalarına (varsa) aşağıdakileri ekleyin:
AB_OTA_POSTINSTALL_CONFIG += \ RUN_POSTINSTALL_system=true \ POSTINSTALL_PATH_system=usr/bin/postinst \ FILESYSTEM_TYPE_system=ext4
Uygulamaları derleme
Uygulamalar, yeni sistem resmiyle yeniden başlatmadan ö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ın derlenip sistem görüntüsüne dahil edilmesini sağlamak için doğal bileşenleri derlemeye dahil edin.
# A/B OTA dexopt package PRODUCT_PACKAGES += otapreopt_script
-
Derleme komut dosyasını, kurulum sonrası adım olarak çalışacak şekilde
update_engine
'e 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çilen dosyaları kullanılmayan ikinci sistem bölümüne yüklemeyle ilgili yardım için DEX_PREOPT dosyalarının ilk önyükleme yüklemesi başlıklı makaleyi inceleyin.