Android 10, kablosuz (OTA) güncellemeleri 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, OTA istemcilerinin, dinamik bölüm desteği olmadan kullanıma sunulan A/B cihazlarda güncelleme sırasında dinamik bölümleri nasıl yeniden boyutlandırdığı ve Android 10'a nasıl yükselttiği açıklanmaktadır.
Arka plan
Bir A/B cihazı dinamik bölümleri destekleyecek şekilde güncellenirken cihazdaki GUID bölüm tablosu (GPT) korunur. Bu nedenle cihazda super
bölümü yoktur. Meta veriler system_a
ve system_b
konumlarında depolanır ancak BOARD_SUPER_PARTITION_METADATA_DEVICE
değiştirilerek özelleştirilebilir.
Her blok cihazda iki meta veri yuvası bulunur. Her blok cihazda yalnızca bir
meta veri yuvası kullanılır. Örneğin, system_a
konumundaki Meta veri 0 ve system_b
konumundaki Meta veri 1 sırasıyla A ve B yuvalarındaki bölümlere karşılık gelir. Çalışma zamanında hangi yuvanın güncellendiği önemli değildir.
Bu sayfada, meta veri yuvaları Meta Veri K (kaynak) ve Meta Veri H (hedef) olarak adlandırılır. Benzer şekilde, bölümler system_s
, vendor_t
vb. olarak adlandırılır.
Derleme sistemi yapılandırmaları hakkında daha fazla bilgi için Cihazları yükseltme başlıklı makaleyi inceleyin.
Bölümlerin güncelleme gruplarına ait olması hakkında daha fazla bilgi için yeni cihazlarda kart yapılandırma değişiklikleri başlıklı makaleyi inceleyin.
Cihazdaki meta verilere örnek:
- Fiziksel blok cihaz
system_a
- Meta veri 0
- Grup
foo_a
- Mantıksal (dinamik) bölüm
system_a
- Mantıksal (dinamik) bölüm
product_services_a
- Foo tarafından güncellenen diğer bölümler
- Mantıksal (dinamik) bölüm
- Grup
bar_a
- Mantıksal (dinamik) bölüm
vendor_a
- Mantıksal (dinamik) bölüm
product_a
- Bard tarafından güncellenen diğer bölümler
- Mantıksal (dinamik) bölüm
- Grup
- Meta veri 1 (kullanılmıyor)
- Meta veri 0
- Fiziksel blok cihaz
system_b
- Meta veri 0 (kullanılmıyor)
- Meta veri 1
- foo_b grubu
- Mantıksal (dinamik) bölüm
system_b
- Mantıksal (dinamik) bölüm
product_services_b
- Foo tarafından güncellenen diğer bölümler
- Mantıksal (dinamik) bölüm
- Grup bar_b
- Mantıksal (dinamik) bölüm
vendor_b
- Mantıksal (dinamik) bölüm
product_b
- Bard tarafından güncellenen diğer bölümler
- Mantıksal (dinamik) bölüm
- foo_b grubu
Cihazınızdaki meta verileri boşaltmak için lpdump
bölümündeki system/extras/partition_tools
aracını kullanabilirsiniz. Örneğin:
lpdump --slot 0 /dev/block/by-name/system_a
lpdump --slot 1 /dev/block/by-name/system_b
Güncellemeyi uyarlama
Android 9 ve önceki sürümlerin yüklü olduğu 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 grubu oluşturulur.
OTA oluşturucu, tüm dinamik bölümlerin içeriğini içeren son super.img
dosyasını oluşturur. Ardından, resmi sistem, satıcı vb. ile ilgili fiziksel blok cihazların boyutlarına uygun birden fazla resme böler. Bu resimler super_system.img
, super_vendor.img
vb. olarak adlandırılır.
OTA istemcisi, bu görüntüleri mantıksal (dinamik) bölümler için uygulamak yerine 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 yükleme sonrası tüm adımlar otomatik olarak devre dışı bırakılır. Daha fazla bilgi için Yükleme sonrası yapılandırma bölümüne bakın.
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
Retrofit işleminden sonraki güncellemeler
Retrofit güncellemesinden sonra OTA istemcisi, dinamik bölümlerle çalışacak şekilde güncellenir. Kaynak bölümlerin kapsamları hiçbir zaman hedef fiziksel bölümleri kapsamaz.
Normal güncelleme paketi kullanılarak yapılan güncelleme akışı
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, engellenen cihazlar olarak [
system_s
,vendor_s
,product_s
] kullanıyorsa yeni meta veri M, engellenen cihazlar olarak [system_t
,vendor_t
,product_t
] kullanır. M'de tüm gruplar ve bölümler atılır. -
Güncelleme manifest dosyasındaki
dynamic_partition_metadata
alanına göre hedef gruplar ve bölümler ekleyin. Her bölümün boyutununew_partition_info
içinde bulabilirsiniz. - Write M to Metadata T.
- Eklenen bölümleri, cihaz eşleyici üzerinde yazılabilir olarak eşleyin.
-
Meta Veri S'den (kaynak meta veriler) yeni meta veriler M oluşturun.
Örneğin, meta veri S, engellenen cihazlar olarak [
- Güncellemeyi engellenen cihazlarda uygulayın.
- Gerekirse cihaz eşleyicideki kaynak bölümleri salt okunur olarak eşleyin. Güncellemeden önce kaynak bölümler eşlenmediği için bu, yan yükleme için gereklidir.
- Hedef yuvadaki tüm blok cihazlara tam veya delta güncelleme uygulayın.
- Yükleme sonrası komut dosyasını çalıştırmak için bölümleri bağlayın, ardından bölümleri ayırın.
- Hedef bölümlerin eşlemesini kaldırın.
Retrofit güncelleme paketi kullanarak güncelleme akışı
Retrofit güncelleme paketi, dinamik bölümleri zaten etkinleştirmiş bir cihaza uygulanırsa OTA istemcisi, bölünmüş super.img
dosyasını doğrudan blok cihazlara uygular. Güncelleme akışı, sonradan eklenen bir güncellemeye benzer. Ayrıntılar için Güncellemeyi geriye dönük olarak uygulama başlıklı makaleyi inceleyin.
Örneğin, aşağıdakileri varsayalım:
- A yuvası etkin yuvadır.
-
system_a
, 0. yuvadaki etkin meta verileri içerir. -
system_a
,vendor_a
veproduct_a
, engelleme cihazı olarak kullanılır.
OTA istemcisi bir uyarlama güncelleme paketi aldığında fiziksel system_b
üzerinde super_system.img
'yı, fiziksel vendor_b
üzerinde super_vendor.img
'yi ve fiziksel product_b
üzerinde super_product.img
'i uygular.
Fiziksel blok cihaz system_b
, önyükleme sırasında mantıksal system_b
, vendor_b
ve product_b
'yi eşlemek için doğru meta verileri içerir.
Güncelleme paketleri oluşturma
Artımlı OTA
Retrofit cihazlar için artımlı OTA'lar oluşturulurken güncellemeler, temel derlemenin PRODUCT_USE_DYNAMIC_PARTITIONS
ve PRODUCT_RETROFIT_DYNAMIC_PARTITIONS
tanımlayıp tanımlamadığına bağlıdır.
-
Temel derleme değişkenleri tanımlamıyorsa bu, geriye dönük bir güncellemedir. Güncelleme paketi, bölünmüş
super.img
dosyasını içerir ve yükleme sonrası adımı devre dışı bırakır. - Temel derleme değişkenleri tanımlıyorsa bu, dinamik bölümler içeren normal bir güncellemeye eşdeğerdir. Güncelleme paketi, mantıksal (dinamik) bölümlerin görüntülerini içerir. Yükleme sonrası adım etkinleştirilebilir.
Tam OSA
Retrofit cihazlar için iki tam OTA paketi oluşturulur.
-
$(PRODUCT)-ota-retrofit-$(TAG).zip
her zamansuper.img
bölmesini içerir ve geriye dönük güncelleme için yükleme sonrası adımı devre dışı bırakır.-
--retrofit_dynamic_partitions
komut dosyasına ek bir bağımsız değişkenle--retrofit_dynamic_partitions
oluşturulur.ota_from_target_files
- Tüm derlemelere uygulanabilir.
-
-
$(PRODUCT)-ota-$(TAG).zip
, gelecekteki güncellemeler için mantıksal resimler içeriyor.- Bu yalnızca dinamik bölümlerin etkinleştirildiği derlemeler için geçerlidir. Bunun uygulanmasıyla ilgili ayrıntıları aşağıda bulabilirsiniz.
Eski derlemelerde retrofite uygun olmayan güncellemeyi reddetme
Normal tam OTA paketini yalnızca dinamik bölümlerin etkin olduğu derlemelere uygulayın. OTA sunucusu yanlış yapılandırılırsa ve bu paketleri Android 9 veya daha eski bir sürümü çalıştıran cihazlara gönderirse cihazlar başlatılamaz. Android 9 ve önceki sürümlerdeki OTA istemcisi, retrofit OTA paketi ile normal tam OTA paketi arasındaki farkı anlayamaz. Bu nedenle istemci, tam paketi reddetmez.
Cihazın tam OTA paketini kabul etmesini önlemek için mevcut cihaz yapılandırmasını kontrol etmek üzere yükleme sonrası bir adım isteyebilirsiniz. Ö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 \
Normal OTA paketi, dinamik bölümlerin etkinleştirilmediği bir cihaza uygulandığında OTA istemcisi, check_dynamic_partitions
'yı yükleme sonrası adım olarak çalıştırır ve güncellemeyi reddeder.