Android 10 destekler dinamik bölümler, bir kullanıcı alanı bölümlendirmesi kablosuz güncellemeler sırasında bölümleri oluşturabilen, yeniden boyutlandırabilen ve yok eden bir sistemdir.
Bu sayfada, OTA istemcilerinin A/B cihazları için güncelleme sırasında dinamik bölümleri nasıl yeniden boyutlandırdığı açıklanmaktadır kullanıma sunulan uygulamamızı keşfedin.
Arka plan
Dinamik bölümleri desteklemek için bir A/B cihazının güncellenmesi sırasında
Cihazdaki GUID bölüm tablosu (GPT) korunduğu için
Cihazda super
bölümü. Meta veriler şurada depolanır:
system_a
ve system_b
ancak bu olabilir
BOARD_SUPER_PARTITION_METADATA_DEVICE
değiştirilerek özelleştirilmiş.
Blok cihazların her birinde iki meta veri yuvası bulunur. Yalnızca bir
her blok cihazdaki meta veri yuvası kullanılır. Örneğin, Meta Veri 0,
system_a
ve Meta Veri 1, system_b
sırasıyla A ve B yuvalarındaki bölümlere karşılık gelir. Kuyruklu a işareti
hangi alanın güncellendiği önemli değildir.
Bu sayfada, meta veri yuvaları Metadata S (Meta Veri S) olarak adlandırılır.
(kaynak) ve Meta Veri T (hedef) olur. Benzer şekilde, bölümler
system_s
, vendor_t
vb. olarak değiştirin.
Sistem yapılandırmaları oluşturma hakkında daha fazla bilgi edinmek için Cihazların sürümünü yükseltme.
Bölümlerin güncelleme gruplarına nasıl ait olduğu hakkında daha fazla bilgi edinmek için yeni cihazlardaki Kart yapılandırma değişiklikleri bölümüne bakın.
Bir cihazdaki meta veri örneği:
- Fiziksel blok cihazı
system_a
- Meta Veri 0
- Grup
foo_a
- Mantıksal (dinamik) bölümlendirme
system_a
- Mantıksal (dinamik) bölümlendirme
product_services_a
. - Foo tarafından güncellenen diğer bölümler
- Mantıksal (dinamik) bölümlendirme
- Grup
bar_a
- Mantıksal (dinamik) bölümlendirme
vendor_a
- Mantıksal (dinamik) bölümlendirme
product_a
. - Çubuk tarafından güncellenen diğer bölümler
- Mantıksal (dinamik) bölümlendirme
- Grup
- Meta veri 1 (kullanılmıyor)
- Meta Veri 0
- Fiziksel blok cihazı
system_b
- Meta veri 0 (kullanılmıyor)
- Meta veri 1
- Grup foo_b
- 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 çubuğu_b
- Mantıksal (dinamik) bölümlendirme
vendor_b
. - Mantıksal (dinamik) bölüm
product_b
- Çubuk tarafından güncellenen diğer bölümler
- Mantıksal (dinamik) bölümlendirme
- Grup foo_b
Cihazınızdaki meta verileri dökmek için system/extras/partition_tools
altındaki lpdump
aracını kullanabilirsiniz. Örnek:
lpdump --slot 0 /dev/block/by-name/system_a
lpdump --slot 1 /dev/block/by-name/system_b
Güncellemeyi yenileme
Android 9 ve önceki sürümlerin yüklü olduğu cihazlardaki OTA istemcisi, güncellemeden önce dinamik bölümlerin eşlenmesini desteklemez. Eşleme uygulanabilmesi için ek bir yama kümesi oluşturulur doğrudan mevcut fiziksel bölümlere yönlendirme yapabilirsiniz.
OTA oluşturucu, tüm dinamik bölümlerin içeriğini içeren nihai super.img
dosyasını oluşturur, ardından resmi sistem, tedarikçi vb.'ye karşılık gelen fiziksel blok cihazlarının boyutlarına uygun birden fazla resme böler. Bu resimler super_system.img
, super_vendor.img
vb. şeklinde adlandırılır.
OTA istemcisi, bu resimleri mantıksal (dinamik) bölümlere uygulamak yerine fiziksel bölümlere uygular.
OTA istemcisi dinamik bölümleri nasıl eşleyeceğini bilmediği için güncelleme paketi oluşturulduğunda bu bölümler için tüm yükleme sonrası adımlar otomatik olarak devre dışı bırakılır. Görüntüleyin Yükleme sonrası yapılandırma inceleyebilirsiniz.
Güncelleme akışı, Android 9 ile aynıdır.
Güncellemeden önce:
ro.boot.dynamic_partitions= ro.boot.dynamic_partitions_retrofit=
Güncelleme sonrasında:
ro.boot.dynamic_partitions=true ro.boot.dynamic_partitions_retrofit=true
Düzeltme sonrası yapılacak güncellemeler
Güçlendirme güncellemesinden sonra OTA istemcisi dinamik bölümlerle gösterilir. Kaynak bölümlerin kapsamları hiçbir zaman hedef fiziksel bölümlere yayılmaz.
Normal güncelleme paketi kullanarak akışı güncelleme
super
bölümü meta verilerini başlatın.-
S meta verisi (kaynak meta veri) ile yeni M meta verisi oluşturun.
Örneğin, S meta verisi engelleme cihazları olarak [
system_s
,vendor_s
,product_s
] kullanıyorsa yeni M meta verisi, engelleme cihazları olarak [system_t
,vendor_t
,product_t
] kullanır. M'de tüm gruplar ve bölümler silinir. -
Şuna göre hedef grupları ve bölümleri ekleyin:
Güncellemedeki
dynamic_partition_metadata
alanı manifest'ini kullanabilirsiniz. Her bölümün boyutu şurada bulunabilir:new_partition_info
- M'yi T meta verilerine yazın.
- Cihaz haritalayıcısına eklenen bölümleri yazılabilir olarak eşleyin.
-
S meta verisi (kaynak meta veri) ile yeni M meta verisi oluşturun.
Örneğin, S meta verisi engelleme cihazları olarak [
- Güncellemeyi engellenen cihazlara uygulayın.
- Gerekirse kaynak bölümlerini cihaz eşleyicisinde eşleyin salt okunur olarak ayarla. Bu, başka cihazdan yükleme için gereklidir çünkü kaynak bölümleri güncellemeden önce eşlenmez.
- Hedef yuvada tüm engelleme cihazlarına tam veya delta güncellemesi uygulayın.
- Yükleme sonrası komut dosyasını çalıştırmak için bölümleri monte edin ve ardından bölümlerin montesini kaldı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 yapılan güncellemeye benzer. Görüntüleyin
Güncellemeleri yeniden düzenleme
inceleyebilirsiniz.
Örneğin, aşağıdakilerin geçerli olduğunu varsayalım:
- A yuvası etkin yuvadır.
-
system_a
, 0. alanda etkin meta verileri içeriyor. -
system_a
,vendor_a
veproduct_a
engelleme cihazı olarak kullanılır.
OTA istemcisi bir geriye dönük güncelleme güncelleme paketi aldığında,
super_system.img
, fiziksel system_b
,
vendor_b
fiziksel mağazada super_vendor.img
ve
product_b
adlı fiziksel saatte super_product.img
.
system_b
fiziksel blok cihazı doğru
mantıksal system_b
öğesini eşlemek için meta verileri,
Açılış sırasında vendor_b
ve product_b
.
Güncelleme paketleri oluşturma
Artımlı OTA
Koruma amaçlı cihazlar için artımlı OTA'lar oluştururken güncellemeler
temel derlemenin tanımlanıp tanımlanmadığına
PRODUCT_USE_DYNAMIC_PARTITIONS
ve
PRODUCT_RETROFIT_DYNAMIC_PARTITIONS
.
-
Temel derleme değişkenleri tanımlamıyorsa bu
yenileme güncellemesi. 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ümlendirmelere sahip tipik güncelleme. Güncelleme paketi mantıksal (dinamik) bölümlerin resimlerini içerir. Yükleme sonrası adım etkinleştirilebilir.
Tam OTA
Koruma cihazları için iki tam OTA paketi oluşturulur.
-
$(PRODUCT)-ota-retrofit-$(TAG).zip
her zamansuper.img
bölünmüş içerir ve güncellemeyi sonradan uygulamak için yükleme sonrası adımı devre dışı bırakır.-
Komut dosyası,
ota_from_target_files
komut dosyasına ek bir--retrofit_dynamic_partitions
bağımsız değişkeni eklenerek oluşturulur. - Tüm derlemelere uygulanabilir.
-
Komut dosyası,
-
$(PRODUCT)-ota-$(TAG).zip
, şunun için mantıksal resimleri içerir: takip edebilirsiniz.- Bunu yalnızca dinamik bölümlendirmelere sahip derlemelere uygulayın etkin. Bu politikanın uygulanmasıyla ilgili ayrıntıları aşağıda bulabilirsiniz.
Eski derlemelerde geriye dönük olmayan güncellemeyi reddet
Normal tam OTA paketini yalnızca dinamik bölümlerin etkin olduğu derlemelere uygulayın. OTA sunucusu yanlış yapılandırılmışsa ve bu paketleri Android 9 veya daha eski sürümleri çalıştıran cihazlara gönderirse cihazlar başlatılamaz. Android 9 ve önceki sürümlerdeki OTA istemcisi, geriye dönük OTA paketi ile normal tam OTA paketi arasındaki farkı anlayamaz. Bu nedenle istemci, tam paketi reddetmez.
Cihazın OTA paketinin tamamını kabul etmesini önlemek için şunları yapabilirsiniz: Mevcut cihazı kontrol etmek için yükleme sonrası adım yapılması gerekir yapılandırma. Örnek:
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 olmayan bir cihaza normal OTA paketi uygulandığında
bölümleri etkinleştirdiğinizde, OTA istemcisi
check_dynamic_partitions
, yükleme sonrası bir adım olarak
güncellemeyi reddeder.