Android 10'da, kullanıcı verileri kontrol noktası (UDC)
Android kablosuz ağa bağlıyken önceki durumuna dönmesini sağlar.
(OTA) güncellemesi başarısız oldu. UDC sayesinde, Android OTA güncellemesi başarısız olursa cihaz güvenli bir şekilde önceki durumuna geri dönebilir. Her ne kadar
A/B güncellemeleri erken başlatma, geri alma için bu sorunu çözer
kullanıcı verileri bölümü (/data
üzerine eklenir) değiştirildiğinde desteklenmemektedir.
UDC, cihazın değiştirildikten sonra bile kullanıcı verileri bölümünü geri almasını sağlar. UDC özelliği bunu kullanıldığında, dosya sistemi kontrol noktaları, bootloader A/B mekanizmasıyla entegrasyon ve aynı zamanda A/B olmayan güncellemeler, anahtar sürümü bağlama ve anahtar geri alma desteği önlemede çok etkilidir.
Kullanıcıya etkisi
UDC özelliği, daha az kullanıcı kaybettiği için kullanıcılar için OTA güncelleme deneyimini iyileştirir. OTA güncellemesi başarısız olduğunda bu kullanıcıların verilerini görebilirsiniz. Bu, destek çağrılarının sayısını azaltabilir güncelleme sürecinde sorunla karşılaşan kullanıcılardan. Ancak OTA güncellemesi başarısız olduğunda kullanıcılar cihazın birden çok kez yeniden başlatıldığını fark edebilir.
İşleyiş şekli
Farklı dosya sistemlerinde kontrol noktası işlevi
UDC, F2FS dosya sistemi için yukarı akışa kontrol noktası işlevini ekler. 4.20 Linux çekirdeği ve cihazlar tarafından desteklenen tüm yaygın çekirdeklere geri bağlantı verir Android 10 yüklü halde.
Diğer dosya sistemlerinde UDC, kontrol noktası işlevi için dm_bow
adlı bir cihaz eşleyici sanal cihazı kullanır. dm_bow
, cihaz ile dosya arasında durur
bahsedeceğim. Bir bölüm monte edildiğinde, dosya sisteminin tüm boş bloklarda trim komutları yayınlamasına neden olan bir kırpma işlemi gerçekleştirilir. dm_bow
bu kırpmaları durdurur ve ücretsiz bir engellenenler listesi oluşturmak için kullanır. Ardından okuma ve yazma işlemleri, değiştirilmeden cihaza gönderilir. Ancak yazma işlemine izin verilmeden önce, geri yükleme için gereken veriler boş bir bloğa yedeklenir.
Kontrol noktası süreci
checkpoint=fs/block
işareti içeren bir bölüm eklendiğinde, Android çağrıları
cihazın mevcut verileri geri yüklemesine izin vermek için sürücüde restoreCheckpoint
kontrol noktası olabilir. init
, daha sonraneedsCheckpoint
cihaz bootloader A/B durumundadır veya güncellemeyi yeniden deneme seçeneğini ayarlamıştır
sayısı. İkisinden biri doğruysa Android, ekleme eklemek için createCheckpoint
öğesini çağırır
işaretleyin veya dm_bow
cihazı oluşturun.
Bölüm eklendikten sonra, kırpma işlemlerini yapmak için kontrol noktası kodu çağrılır.
Ardından, önyükleme işlemi normal şekilde devam eder. LOCKED_BOOT_COMPLETE
noktasında Android, mevcut kontrol noktasını kaydetmek için commitCheckpoint
'ı çağırır ve güncelleme normal şekilde devam eder.
Keymaster anahtarlarını yönetme
Anahtar yöneticisi anahtarları, cihaz şifreleme veya başka amaçlar için kullanılır. Android, bu anahtarları yönetmek için anahtar silme çağrılarını kontrol noktası kaydedilene kadar geciktirir.
Sağlığı izleme
Sağlık hizmetli, kontrol noktası oluşturmak için yeterli disk alanı olup olmadığını doğrular. Health arka plan programı şu konumdadır:
cp_healthDaemon
Checkpoint.cpp
içinde.
Durum arka plan programı, yapılandırılabilen aşağıdaki davranışlara sahiptir:
ro.sys.cp_msleeptime
: Cihazın disk kullanımını ne sıklıkta kontrol ettiğini kontrol eder.ro.sys.cp_min_free_bytes
: Sağlık hizmetlisinin aradığı minimum değeri kontrol eder.ro.sys.cp_commit_on_full
: Sağlık hizmetlisinin cihazı yeniden başlatıp başlatmayacağını veya disk dolduğunda kontrol noktasını kaydedip devam edip etmeyeceğini kontrol eder.
Kontrol noktası API'leri
Kontrol noktası API'leri, UDC özelliği tarafından kullanılır. UDC tarafından kullanılan diğer API'ler için IVold.aidl
bölümüne bakın.
void startCheckpoint(int retry)
Kontrol noktası oluşturur.
Çerçeve, güncelleme başlatmaya hazır olduğunda bu yöntemi çağırır. Kontrol noktası, userdata gibi kontrol noktası atanmış dosya sistemleri yeniden başlatıldıktan sonra R/W olarak bağlanmadan önce oluşturulur. Yeniden deneme sayısı pozitifse API, yeniden denemelerin izlenmesini yönetir ve güncelleyici, güncellemenin geri alınması gerekip gerekmediğini kontrol etmek için needsRollback
'ü çağırır. Yeniden deneme sayısı -1
ise API A/B'ye ertelenir
bootloader'ı dikkate alın.
Bu yöntem normal A/B güncellemesi yaparken çağrılmaz.
void commitChanges()
Değişiklikleri kaydeder.
Çerçeve, yeniden başlatma sonrasında değişiklikler hazır olduğunda bu yöntemi çağırır
azımsayabilirsiniz. Bu işlev, veriler (ör. resim, video, SMS, sunucu makbuzu) userdata'ya yazılmadan ve BootComplete
çağrılmadan önce çağrılır.
Etkin bir kontrol noktası güncellemesi yoksa bu yöntemin hiçbir etkisi olmaz.
abortChanges()
Yeniden başlatmaya zorlar ve kontrol noktasına geri döner. İlk yeniden başlatmadan sonraki tüm kullanıcı verisi değişikliklerini terk eder.
Çerçeve bu yöntemi yeniden başlatma işleminden sonra ancak commitChanges
'ten önce çağırır.
Bu yöntem çağrıldığında retry_counter
azalır. Günlük girişleri oluşturulur.
bool needsRollback()
Geri alma işleminin gerekli olup olmadığını belirler.
Kontrol noktası olmayan cihazlarda false
değerini döndürür. Kontrol noktası cihazlarında, kontrol noktası olmayan bir önyükleme sırasında true
döndürür.
UDC'yi uygulama
Referans uygulaması
UDC'nin nasıl uygulanabileceğine dair bir örnek için dm-bow.c dosyasına bakın. Özellikle ilgili ek dokümanlar için dm-bow.txt dosyasına bakın.
Kurulum
init.hardware.rc
dosyanızdaki on fs
öğesinde şunlara sahip olduğunuzdan emin olun:
mount_all /vendor/etc/fstab.${ro.boot.hardware.platform} --early
init.hardware.rc
dosyanızdaki on late-fs
öğesinde şunlara sahip olduğunuzdan emin olun:
mount_all /vendor/etc/fstab.${ro.boot.hardware.platform} --late
fstab.hardware
dosyanızda, /data
öğesinin latemount
olarak etiketlendiğinden emin olun.
/dev/block/bootdevice/by-name/userdata /data f2fs noatime,nosuid,nodev,discard,reserve_root=32768,resgid=1065,fsync_mode=nobarrier latemount,wait,check,fileencryption=ice,keydirectory=/metadata/vold/metadata_encryption,quota,formattable,sysfs_path=/sys/devices/platform/soc/1d84000.ufshc,reservedsize=128M,checkpoint=fs
Meta veri bölümü ekle
UDC, önyükleme dışındaki yeniden deneme sayısını ve anahtarları depolamak için bir meta veri bölümü gerektirir. Bir meta veri bölümü oluşturun ve /metadata
adresinde erken ekleyin.
fstab.hardware
dosyanızda, /metadata
adlı dosyanın earlymount
olarak etiketlendiğinden emin olun
veya first_stage_mount
.
/dev/block/by-name/metadata /metadata ext4 noatime,nosuid,nodev,discard,sync wait,formattable,first_stage_mount
Bölümlendirmeyi tüm sıfırlarla başlatın.
Aşağıdaki satırları BoardConfig.mk
hedefine ekleyin:
BOARD_USES_METADATA_PARTITION := true BOARD_ROOT_EXTRA_FOLDERS := existing_folders metadata
Sistemleri güncelleme
F2FS sistemleri
Verileri biçimlendirmek için F2FS kullanan sistemlerde F2FS sürümünüzün kontrol noktalarını destekler. Daha fazla bilgi için Farklı dosya sistemlerindeki kontrol noktası işlevi başlıklı makaleyi inceleyin.
checkpoint=fs
işaretini<fs_mgr_flags>
cihaz /data
konumuna takıldı.
F2FS harici sistemler
F2FS olmayan sistemler için çekirdek yapılandırmasında dm-bow
etkinleştirilmelidir.
/data
adresinde monte edilen cihaz için fstab'ın <fs_mgr_flags>
bölümüne checkpoint=block
işaretini ekleyin.
Günlükleri kontrol etme
Checkpoint API'leri çağrıldığında günlük girişleri oluşturulur.
Doğrulama
UDC uygulamanızı test etmek için VtsKernelCheckpointTest
VTS grubunu çalıştırın
testler.