Android 10, Android kablosuz (OTA) güncellemesi başarısız olduğunda Android'in önceki durumuna geri dönmesine olanak tanıyan Kullanıcı Verileri Kontrol Noktası'nı (UDC) sunar. UDC ile Android OTA güncellemesi başarısız olursa cihaz, önceki durumuna güvenli bir şekilde geri dönebilir. A/B güncellemeleri, erken başlatma için bu sorunu çözse de kullanıcı verileri bölümü (/data üzerine monte edilmiş) değiştirildiğinde geri alma işlemi desteklenmez.
UDC, cihazın değiştirildikten sonra bile kullanıcı verileri bölümünü geri döndürmesini sağlar. UDC özelliği, dosya sisteminde kontrol noktası özellikleri, dosya sistemi kontrol noktalarını desteklemediğinde alternatif bir uygulama, önyükleyici A/B mekanizmasıyla entegrasyon (A/B olmayan güncellemeleri de destekler) ve anahtar sürümü bağlama ile anahtar geri alma önleme desteği sayesinde bunu gerçekleştirir.
Kullanıcıya etkisi
UDC özelliği, OTA güncellemesi başarısız olduğunda daha az kullanıcı verilerini kaybettiği için kullanıcıların OTA güncelleme deneyimini iyileştirir. Bu, güncelleme işlemi sırasında sorun yaşayan kullanıcılardan gelen destek çağrılarının sayısını azaltabilir. 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ış 4.20 Linux çekirdeğine kontrol noktası işlevini ekler ve Android 10 çalıştıran cihazlar tarafından desteklenen tüm ortak çekirdeklere geri taşır.
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 sistemi arasında yer alır. Bir bölüm bağlandığında, dosya sisteminin tüm boş bloklarda trim komutları vermesine neden olan bir trim işlemi gerçekleştirilir. dm_bow bu kırpmaları 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 yazma işlemine izin verilmeden önce geri yükleme için gereken veriler ücretsiz bir bloğa yedeklenir.
Kontrol noktası süreci
checkpoint=fs/block işaretli bir bölüm bağlandığında Android, cihazın mevcut kontrol noktalarını geri yüklemesine izin vermek için sürücüde restoreCheckpoint işlevini çağırır. Ardından init, cihazı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. Bu koşullardan biri geçerliyse Android, bağlama işaretleri eklemek veya dm_bow cihazı oluşturmak için createCheckpoint işlevini çağırır.
Bölüm bağlandıktan sonra, kırpma işlemleri için kontrol noktası kodu çağrılır.
Önyükleme işlemi normal şekilde devam eder. LOCKED_BOOT_COMPLETE konumunda Android, mevcut kontrol noktasını işlemek için commitCheckpoint işlevini çağırır ve güncelleme normal şekilde devam eder.
KeyMint (eski adıyla Keymaster) anahtarlarını yönetme
KeyMint anahtarları, cihaz şifreleme veya başka amaçlar için kullanılır. Android, bu anahtarları yönetmek için kontrol noktası kaydedilene kadar anahtar silme çağrılarını geciktirir.
Sağlığı izleme
Bir sağlık arka plan programı, kontrol noktası oluşturmak için yeterli disk alanı olduğunu doğrular. Sağlık arka plan programı, cp_healthDaemon
Checkpoint.cpp konumunda bulunur.
Sağlık hizmeti aşağıdaki yapılandırılabilir davranışlara sahiptir:
ro.sys.cp_msleeptime: Cihazın disk kullanımını ne sıklıkta kontrol edeceğini belirler.ro.sys.cp_min_free_bytes: Sağlık hizmetinin aradığı minimum değeri kontrol eder.ro.sys.cp_commit_on_full: Durum hizmetinin cihazı yeniden başlattığını veya diskin dolu olduğu durumlarda kontrol noktasını kaydedip devam ettiğini kontrol eder.
Checkpoint 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 başlıklı makaleyi inceleyin.
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ı, yeniden başlatma işleminden sonra kullanıcı verileri gibi kontrol noktası oluşturulmuş dosya sistemleri R/W olarak yerleştirilmeden önce oluşturulur. Yeniden deneme sayısı pozitifse API, izleme yeniden denemelerini işler ve güncelleyici, güncellemenin geri alınmasının gerekip gerekmediğini kontrol etmek için needsRollback işlevini çağırır. Yeniden deneme sayısı -1 ise API, A/B önyükleyicisinin kararına uyar.
Bu yöntem, normal bir A/B güncellemesi yapılırken çağrılmaz.
void commitChanges()
Değişiklikleri işler.
Çerçeve, değişiklikler kaydedilmeye hazır olduğunda yeniden başlatma işleminden sonra bu yöntemi çağırır. Bu, kullanıcı verilerine (resimler, videolar, SMS, sunucu alma makbuzu gibi) ve BootComplete yazılmadan önce çağrılır.
Etkin bir kontrol noktalı güncelleme yoksa bu yöntemin etkisi olmaz.
abortChanges()
Yeniden başlatmayı zorlar ve kontrol noktasına geri döner. İlk yeniden başlatmadan bu yana yapılan tüm kullanıcı verisi değişikliklerini bırakır.
Çerçeve, bu yöntemi yeniden başlatmadan sonra ancak commitChanges'dan önce çağırır.
Bu yöntem çağrıldığında retry_counter değeri 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 başlatma sırasında true değerini döndürür.
UDC'yi uygulama
Referans uygulama
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 bölümünde şunların bulunduğundan emin olun:
mount_all /vendor/etc/fstab.${ro.boot.hardware.platform} --early
init.hardware.rc dosyanızdaki on late-fs bölümünde şunların bulunduğundan 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ü ekleme
UDC, önyükleyici olmayan yeniden deneme sayısını ve anahtarları depolamak için bir meta veri bölümü gerektirir. Meta veri bölümü oluşturun ve /metadata konumunda erken bağlayın.
fstab.hardware dosyanızda /metadata öğesinin 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ü sıfırlarla başlatın.
BoardConfig.mk dosyasına aşağıdaki satırları 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ı desteklediğinden emin olun. Daha fazla bilgi için Farklı dosya sistemlerinde kontrol noktası işlevi başlıklı makaleyi inceleyin.
/data konumuna bağlanan cihaz için fstab dosyasının <fs_mgr_flags> bölümüne checkpoint=fs işaretini ekleyin.
Non-F2FS sistemler
F2FS olmayan sistemlerde dm-bow, çekirdek yapılandırmasında etkinleştirilmelidir.
/data konumuna bağlanan cihaz için fstab dosyasının <fs_mgr_flags> bölümüne checkpoint=block işaretini ekleyin.
Günlükleri kontrol etme
Kontrol noktası 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 grubunu çalıştırın.