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 güvenli bir şekilde önceki durumuna geri dönebilir. A/B güncellemeleri, erken başlatma sırasında 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 başarır.
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 blok 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 hizmetinin yapılandırılabilen aşağıdaki davranışları vardır:
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
: Sağlık hizmetinin, cihazı yeniden başlattığını veya disk dolu olduğunda 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 userdata gibi kontrol noktası oluşturulmuş dosya sistemleri R/W olarak monte edilmeden ö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, veriler (ör. resimler, videolar, SMS, sunucuya alma makbuzu) userdata'ya yazılmadan ve BootComplete
'dan ö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 azaltılı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 test grubunu çalıştırın.