Android 10, kablosuz (OTA) güncellemeler sırasında bölümler oluşturabilen, yeniden boyutlandırabilen ve yok edebilen bir kullanıcı alanı bölümleme sistemi olan dinamik bölümleri destekler.
Bu sayfada, dinamik bölüm desteği olmadan başlatılan A/B cihazları için bir güncelleme sırasında OTA istemcilerinin dinamik bölümleri nasıl yeniden boyutlandırdığı ve OTA istemcilerinin Android 10'a nasıl yükselttiği açıklanmaktadır.
Arka plan
Dinamik bölümleri desteklemek için bir A/B aygıtının güncellenmesi sırasında, aygıttaki GUID bölümleme tablosu (GPT) korunur, dolayısıyla aygıtta super
bölüm olmaz. Meta veriler system_a
ve system_b
depolanır, ancak bu BOARD_SUPER_PARTITION_METADATA_DEVICE
değiştirilerek özelleştirilebilir.
Blok cihazlarının her birinde iki meta veri yuvası vardır. Her blok cihazında yalnızca bir meta veri yuvası kullanılır. Örneğin, system_a
Meta Veri 0 ve system_b
Meta Veri 1, sırasıyla A ve B yuvalarındaki bölümlere karşılık gelir. Çalışma zamanında hangi slotun güncellendiği önemli değildir.
Bu sayfada meta veri yuvalarına Meta Veri S (kaynak) ve Meta Veri T (hedef) adı verilir. Benzer şekilde bölümlere system_s
, vendor_t
vb. adlar verilir.
Sistem yapılandırmalarını oluşturma hakkında daha fazla bilgi için bkz. Cihazları yükseltme .
Bölümlerin güncelleme gruplarına nasıl ait olduğu hakkında daha fazla bilgi için bkz. Yeni cihazlar için kart yapılandırma değişiklikleri .
Bir cihazdaki meta verilere örnek:
- Fiziksel blok cihazı
system_a
- Meta veriler 0
- Grup
foo_a
- Mantıksal (dinamik) bölümleme
system_a
- Mantıksal (dinamik) bölümleme
product_services_a
- Foo tarafından güncellenen diğer bölümler
- Mantıksal (dinamik) bölümleme
- Grup
bar_a
- Mantıksal (dinamik) bölüm
vendor_a
- Mantıksal (dinamik) bölümleme
product_a
- Bar tarafından güncellenen diğer bölümler
- Mantıksal (dinamik) bölüm
- Grup
- Meta Veri 1 (kullanılmıyor)
- Meta veriler 0
- Fiziksel blok cihazı
system_b
- Meta veri 0 (kullanılmıyor)
- Meta veriler 1
- Foo_b grubu
- Mantıksal (dinamik) bölümleme
system_b
- Mantıksal (dinamik)
product_services_b
- Foo tarafından güncellenen diğer bölümler
- Mantıksal (dinamik) bölümleme
- Grup bar_b
- Mantıksal (dinamik) bölüm
vendor_b
- Mantıksal (dinamik) bölümleme
product_b
- Bar tarafından güncellenen diğer bölümler
- Mantıksal (dinamik) bölüm
- Foo_b grubu
Meta verileri cihazınıza boşaltmak için system/extras/partition_tools
altındaki lpdump
aracını kullanabilirsiniz. Örneğin:
lpdump --slot 0 /dev/block/by-name/system_a
lpdump --slot 1 /dev/block/by-name/system_b
Bir güncellemeyi güçlendirme
Android 9 ve daha önceki sürümleri çalıştıran cihazlarda, cihazdaki OTA istemcisi, güncellemeden önce dinamik bölümlerin eşlenmesini desteklemez. Eşlemenin doğrudan mevcut fiziksel bölümlere uygulanabilmesi için ek bir yama seti oluşturulur.
OTA oluşturucu, tüm dinamik bölümlerin içeriğini içeren son super.img
dosyasını oluşturur ve ardından görüntüyü, sistem, satıcı vb. ile ilgili fiziksel blok cihazlarının boyutlarıyla eşleşen birden fazla görüntüye böler. Bu görüntüler super_system.img
, super_vendor.img
vb. olarak adlandırılır. OTA istemcisi, görüntüleri mantıksal (dinamik) bölümlere uygulamak yerine bu görüntüleri fiziksel bölümlere uygular.
OTA istemcisi dinamik bölümleri nasıl eşleyeceğini bilmediğinden, güncelleme paketi oluşturulduğunda bu bölümler için tüm kurulum sonrası adımlar otomatik olarak devre dışı bırakılır. Daha fazla ayrıntı için bkz . Kurulum sonrası yapılandırma .
Güncelleme akışı Android 9'dakiyle aynıdır.
Güncellemeden önce:
ro.boot.dynamic_partitions= ro.boot.dynamic_partitions_retrofit=
Güncellemeden sonra:
ro.boot.dynamic_partitions=true ro.boot.dynamic_partitions_retrofit=true
Yenileme sonrasında gelecek güncellemeler
Güçlendirme güncellemesinden sonra OTA istemcisi dinamik bölümlerle çalışacak şekilde güncellenir. Kaynak bölümlerinin kapsamları hiçbir zaman hedef fiziksel bölümlere yayılmaz.
Düzenli bir güncelleme paketi kullanarak akışı güncelleyin
-
super
bölüm meta verilerini başlatın.- Meta Veri S'den (kaynak meta veriler) yeni meta veriler M oluşturun. Örneğin, Meta Veri S, blok aygıtları olarak [
system_s
,vendor_s
,product_s
] kullanıyorsa, yeni meta veri M, blok aygıtlar olarak [system_t
,vendor_t
,product_t
] kullanır. M'deki tüm gruplar ve bölümler atılır. - Güncelleme bildirimindeki
dynamic_partition_metadata
alanına göre hedef grupları ve bölümleri ekleyin. Her bölümün boyutunew_partition_info
bulunabilir. - Meta Veri T'ye M yazın.
- Eklenen bölümleri aygıt eşleyicide yazılabilir olarak eşleyin.
- Meta Veri S'den (kaynak meta veriler) yeni meta veriler M oluşturun. Örneğin, Meta Veri S, blok aygıtları olarak [
- Güncellemeyi blok cihazlara uygulayın.
- Gerekirse cihaz eşleyicideki kaynak bölümlerini salt okunur olarak eşleyin. Kaynak bölümler güncellemeden önce eşlenmediğinden bu, yandan yükleme için gereklidir.
- Hedef yuvadaki tüm blok cihazlara tam veya delta güncelleme uygulayın.
- Kurulum sonrası betiği çalıştırmak için bölümleri bağlayın ve ardından bölümlerin bağlantısını kesin.
- Hedef bölümlerin eşlemesini kaldırın.
Retrofit güncelleme paketi kullanarak güncelleme akışı
Güçlendirme güncelleme paketi zaten dinamik bölümleri etkinleştiren bir cihaza uygulanırsa, OTA istemcisi bölünmüş super.img
dosyasını doğrudan blok cihazlara uygular. Güncelleme akışı, güçlendirme güncellemesine benzer. Ayrıntılar için bkz . Güncellemeyi yenileme .
Örneğin aşağıdakileri varsayalım:
- Slot A aktif slottur.
-
system_a
0 yuvasındaki etkin meta verileri içerir. -
system_a
,vendor_a
veproduct_a
blok cihazları olarak kullanılır.
OTA istemcisi bir retrofit güncelleme paketi aldığında, fiziksel system_b
super_system.img
, fiziksel vendor_b
super_vendor.img
ve fiziksel product_b
super_product.img
uygular. Fiziksel blok aygıtı system_b
önyükleme sırasında mantıksal system_b
, vendor_b
ve product_b
eşlemek için doğru meta verileri içerir.
Güncelleme paketleri oluştur
Artımlı OTA
Retrofit cihazlar için artımlı OTA'lar oluştururken güncellemeler, temel yapının PRODUCT_USE_DYNAMIC_PARTITIONS
ve PRODUCT_RETROFIT_DYNAMIC_PARTITIONS
tanımlayıp tanımlamamasına bağlıdır.
- Temel yapı değişkenleri tanımlamıyorsa bu bir güçlendirme güncellemesidir. Güncelleme paketi bölünmüş
super.img
dosyasını içerir ve kurulum sonrası adımı devre dışı bırakır. - Temel yapı değişkenleri tanımlıyorsa bu, dinamik bölümlere sahip tipik bir güncellemeyle aynıdır. Güncelleme paketi mantıksal (dinamik) bölümlere ait görüntüleri içerir. Kurulum sonrası adım etkinleştirilebilir.
Tam OTA
Yenileme cihazları için iki tam OTA paketi oluşturulur.
-
$(PRODUCT)-ota-retrofit-$(TAG).zip
her zaman splitsuper.img
içerir ve güncellemeyi yenilemek için kurulum sonrası adımını devre dışı bırakır.-
ota_from_target_files
betiğine--retrofit_dynamic_partitions
ek argümanıyla oluşturulur. - Tüm yapılara uygulanabilir.
-
-
$(PRODUCT)-ota-$(TAG).zip
gelecekteki güncellemeler için mantıksal görseller içerir.- Bunu yalnızca dinamik bölümlerin etkin olduğu yapılara uygulayın. Bunu uygulamaya ilişkin aşağıdaki ayrıntılara bakın.
Eski yapılarda retrofit olmayan güncellemeyi reddet
Normal tam OTA paketini yalnızca dinamik bölümlerin etkin olduğu yapılara uygulayın. OTA sunucusu yanlış yapılandırılırsa ve bu paketleri Android 9 veya daha düşük sürüm çalıştıran cihazlara gönderirse cihazlar önyükleme yapamaz. Android 9 ve önceki sürümlerdeki OTA istemcisi, retrofit OTA paketi ile normal tam OTA paketi arasındaki farkı anlayamaz, dolayısıyla müşteri tam paketi reddetmez.
Cihazın tam OTA paketini kabul etmesini önlemek için, mevcut cihaz yapılandırmasını kontrol etmek üzere kurulum sonrası bir adıma ihtiyaç duyabilirsiniz. Örneğin:
device/ device_name /dynamic_partitions/check_dynamic_partitions
#!/system/bin/sh DP_PROPERTY_NAME="ro.boot.dynamic_partitions" DP_RETROFIT_PROPERTY_NAME="ro.boot.dynamic_partitions_retrofit" DP_PROPERTY=$(getprop ${DP_PROPERTY_NAME}) DP_RETROFIT_PROPERTY=$(getprop ${DP_RETROFIT_PROPERTY_NAME}) if [ "${DP_PROPERTY}" != "true" ] || [ "${DP_RETROFIT_PROPERTY}" != "true" ] ; then echo "Error: applied non-retrofit update on build without dynamic" \ "partitions." echo "${DP_PROPERTY_NAME}=${DP_PROPERTY}" echo "${DP_RETROFIT_PROPERTY_NAME}=${DP_RETROFIT_PROPERTY}" exit 1 fi
device/ device_name /dynamic_partitions/Android.mk
LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE:= check_dynamic_partitions LOCAL_MODULE_TAGS := optional LOCAL_MODULE_CLASS := EXECUTABLES LOCAL_SRC_FILES := check_dynamic_partitions LOCAL_PRODUCT_MODULE := true include $(BUILD_PREBUILT)
device/ device_name /device.mk
PRODUCT_PACKAGES += check_dynamic_partitions # OPTIONAL=false so that the error in check_dynamic_partitions will be # propagated to OTA client. AB_OTA_POSTINSTALL_CONFIG += \ RUN_POSTINSTALL_product=true \ POSTINSTALL_PATH_product=bin/check_dynamic_partitions \ FILESYSTEM_TYPE_product=ext4 \ POSTINSTALL_OPTIONAL_product=false \
Dinamik bölümlerin etkin olmadığı bir cihaza normal OTA paketi uygulandığında, OTA istemcisi kurulum sonrası adım olarak check_dynamic_partitions
çalıştırır ve güncellemeyi reddeder.