Android 10, bir Android kablosuz (OTA) güncellemesi başarısız olduğunda Android'in önceki durumuna geri dönmesine olanak tanıyan Kullanıcı Veri Kontrol Noktasını (UDC) sunar. UDC ile Android OTA güncellemesi başarısız olursa cihaz güvenli bir şekilde önceki durumuna geri dönebilir. A/B güncellemeleri bu sorunu erken önyükleme için çözse de, kullanıcı veri bölümü ( /data
üzerine kurulu) değiştirildiğinde geri alma desteklenmez.
UDC, cihazın değiştirildikten sonra bile kullanıcı verileri bölümünü geri döndürmesine olanak tanır. UDC özelliği bunu dosya sistemindeki kontrol noktası yetenekleriyle, dosya sistemi kontrol noktalarını desteklemediğinde alternatif bir uygulamayla, önyükleyici A/B mekanizmasıyla entegrasyonla ve A/B olmayan güncellemeleri de desteklerken ve anahtar sürüm bağlama desteğiyle gerçekleştirir. ve anahtar geri alma önleme.
Kullanıcı etkisi
UDC özelliği, bir OTA güncellemesi başarısız olduğunda daha az kullanıcı verilerini kaybettiğinden kullanıcıların OTA güncelleme deneyimini geliştirir. Bu, güncelleme işlemi sırasında sorunlarla karşılaşan kullanıcılardan gelen destek çağrılarının sayısını azaltabilir. Ancak bir OTA güncellemesi başarısız olduğunda kullanıcılar cihazın birden çok kez yeniden başlatıldığını fark edebilir.
Nasıl çalışır
Farklı dosya sistemlerinde denetim noktası işlevselliği
F2FS dosya sistemi için UDC, kontrol noktası işlevini yukarı akış 4.20 Linux çekirdeğine ekler ve bunu Android 10 çalıştıran cihazlar tarafından desteklenen tüm ortak çekirdeklere destekler.
Diğer dosya sistemlerinde UDC, denetim noktası işlevselliği için dm_bow
adı verilen bir aygıt eşleyici sanal aygıtı kullanır. dm_bow
cihaz ile dosya sistemi arasında bulunur. Bir bölüm monte edildiğinde, dosya sisteminin tüm boş bloklarda trim komutları vermesine neden olan bir trim verilir. dm_bow
bu kesimleri yakalar ve bunları ücretsiz bir engellenenler listesi oluşturmak için kullanır. Okuma ve yazma işlemleri daha sonra cihaza değiştirilmeden gönderilir, ancak yazmaya izin verilmeden önce geri yükleme için gereken veriler boş bir bloğa yedeklenir.
Kontrol noktası süreci
checkpoint=fs/block
bayrağına sahip bir bölüm bağlandığında Android, cihazın mevcut herhangi bir kontrol noktasını geri yüklemesine izin vermek için sürücüdeki restoreCheckpoint
çağırır. init
daha sonra aygıtın önyükleyici A/B durumunda olup olmadığını veya güncelleme yeniden deneme sayısını ayarlayıp ayarlamadığını belirlemek için needsCheckpoint
işlevini çağırır. Bunlardan herhangi biri doğruysa Android, bağlama bayrakları eklemek veya bir dm_bow
aygıtı oluşturmak için createCheckpoint
çağırır.
Bölüm takıldıktan sonra, kesimleri düzenlemek için denetim noktası kodu çağrılır. Önyükleme işlemi daha sonra normal şekilde devam eder. LOCKED_BOOT_COMPLETE
konumunda Android, mevcut kontrol noktasını işlemek için commitCheckpoint
çağırır ve güncelleme normal şekilde devam eder.
Anahtar yöneticisi anahtarlarını yönet
Keymaster anahtarları cihaz şifrelemesi veya başka amaçlar için kullanılır. Bu anahtarları yönetmek için Android, kontrol noktası taahhüt edilene kadar anahtar silme çağrılarını geciktirir.
Sağlığı izleyin
Bir sağlık arka plan programı, bir denetim noktası oluşturmak için yeterli disk alanı olduğunu doğrular. Sağlık arka plan programı Checkpoint.cpp
cp_healthDaemon
bulunur.
Sistem durumu 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ıkla kontrol ettiğini kontrol eder. -
ro.sys.cp_min_free_bytes
: Sistem durumu arka plan programının aradığı minimum değeri kontrol eder. -
ro.sys.cp_commit_on_full
: Sistem durumu arka plan programının cihazı yeniden başlatıp başlatmayacağını veya denetim noktasını tamamlayıp disk dolduğunda devam edip etmeyeceğini kontrol eder.
Denetim Noktası API'leri
Denetim Noktası API'leri UDC özelliği tarafından kullanılır. UDC tarafından kullanılan diğer API'ler için bkz. IVold.aidl
.
void startCheckpoint(int yeniden deneme)
Bir kontrol noktası oluşturur.
Çerçeve, bir güncellemeyi başlatmaya hazır olduğunda bu yöntemi çağırır. Denetim noktası, kullanıcı verileri gibi denetim noktalı dosya sistemlerinin yeniden başlatma sonrasında R/W bağlanmasından önce oluşturulur. Yeniden deneme sayısı pozitifse API, yeniden denemeleri izlemeyi yönetir ve güncelleyici, güncellemenin geri alınmasının gerekli olup olmadığını kontrol etmek için needsRollback
çağrısını yapar. Yeniden deneme sayısı -1
ise API, A/B önyükleyicinin kararına göre hareket eder.
Normal bir A/B güncellemesi yapılırken bu yöntem çağrılmaz.
void commitChanges()
Değişiklikleri taahhüt eder.
Çerçeve, yeniden başlatmanın ardından değişiklikler uygulanmaya hazır olduğunda bu yöntemi çağırır. Bu, verilerin (resimler, video, SMS, alınan sunucunun alınması gibi) kullanıcı verilerine yazılmasından önce ve BootComplete
önce çağrılır.
Etkin bir denetim noktası güncellemesi yoksa bu yöntemin hiçbir etkisi yoktur.
Değişiklikleri iptal et()
Yeniden başlatmayı zorlar ve kontrol noktasına geri döner. İlk yeniden başlatmadan bu yana tüm kullanıcı verisi değişikliklerini iptal eder.
Çerçeve, yeniden başlatmanın ardından ancak commitChanges
önce bu yöntemi çağırır. Bu yöntem çağrıldığında retry_counter
azalır. Günlük girişleri oluşturulur.
bool'un Rollback()'e ihtiyacı var
Geri almanın gerekli olup olmadığını belirler.
Denetim noktası olmayan cihazlarda false
değerini döndürür. Denetim noktası aygıtlarında, denetim noktası olmayan önyükleme sırasında true
değerini döndürür.
UDC'yi uygulayın
Referans uygulaması
UDC'nin nasıl uygulanabileceğine dair bir örnek için bkz. dm-bow.c . Özelliklere ilişkin ek belgeler için bkz. dm-bow.txt .
Kurmak
init.hardware.rc
dosyanızdaki on fs
sahip olduğunuzdan emin olun:
mount_all /vendor/etc/fstab.${ro.boot.hardware.platform} --early
init.hardware.rc
dosyanızdaki on late-fs
sahip olduğunuzdan emin olun:
mount_all /vendor/etc/fstab.${ro.boot.hardware.platform} --late
fstab.hardware
dosyanızda /data
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ükleyici olmayan yeniden deneme sayısını ve anahtarlarını depolamak için bir meta veri bölümü gerektirir. Bir meta veri bölümü oluşturun ve bunu /metadata
konumuna önceden bağlayın.
fstab.hardware
dosyanızda /metadata
earlymount
veya first_stage_mount
olarak etiketlendiğinden emin olun.
/dev/block/by-name/metadata /metadata ext4 noatime,nosuid,nodev,discard,sync wait,formattable,first_stage_mount
Bölümü tamamen sıfırlarla başlatın.
BoardConfig.mk
aşağıdaki satırları ekleyin:
BOARD_USES_METADATA_PARTITION := true BOARD_ROOT_EXTRA_FOLDERS := existing_folders metadata
Sistemleri güncelle
F2FS sistemleri
Verileri biçimlendirmek için F2FS kullanan sistemlerde F2FS sürümünüzün denetim noktalarını desteklediğinden emin olun. Daha fazla bilgi için bkz. Farklı dosya sistemlerinde Denetim Noktası işlevi .
/data
konumuna bağlanan aygıt için fstab'ın <fs_mgr_flags>
bölümüne checkpoint=fs
bayrağını ekleyin.
F2FS olmayan sistemler
F2FS olmayan sistemler için, çekirdek yapılandırmasında dm-bow
etkinleştirilmesi gerekir.
/data
konumuna bağlanan aygıt için fstab'ın <fs_mgr_flags>
bölümüne checkpoint=block
bayrağını ekleyin.
Günlükleri kontrol edin
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 testleri kümesini çalıştırın.