Android 10 memperkenalkan {i>User Data Checkpoint <i}(UDC), yang
memungkinkan Android melakukan roll back ke keadaan sebelumnya saat Android over the air (OTA)
Update (OTA) gagal. Dengan UDC, jika pembaruan OTA Android gagal, perangkat dapat
dapat dikembalikan ke keadaan sebelumnya dengan aman. Meskipun
Update A/B memecahkan masalah ini untuk booting awal, rollback
tidak didukung jika partisi data pengguna (yang terpasang di /data
) diubah.
UDC memungkinkan perangkat untuk mengembalikan partisi data pengguna bahkan setelah diubah. Fitur UDC melakukannya dengan kemampuan pos pemeriksaan ke sistem file, implementasi alternatif ketika sistem file tidak mendukung checkpoint, integrasi dengan mekanisme A/B bootloader dan juga update non-A/B, dan dukungan untuk binding versi kunci dan rollback kunci pencegahan.
Dampak terhadap pengguna
Fitur UDC meningkatkan pengalaman update OTA untuk pengguna karena lebih sedikit pengguna yang kehilangan data mereka ketika pembaruan OTA gagal. Hal ini dapat mengurangi jumlah panggilan dukungan dari pengguna yang mengalami masalah selama proses pembaruan. Namun, ketika OTA update gagal, pengguna mungkin akan melihat perangkat dimulai ulang beberapa kali.
Cara kerjanya
Fungsionalitas checkpoint di berbagai sistem file
Untuk sistem file F2FS, UDC menambahkan fungsi checkpoint ke upstream 4.20 Kernel Linux dan melakukan backport ke semua kernel umum yang didukung oleh perangkat menjalankan Android 10.
Untuk sistem file lainnya, UDC menggunakan perangkat virtual mapper perangkat yang disebut dm_bow
untuk fungsionalitas checkpoint. dm_bow
berada di antara perangkat dan file
sistem file. Ketika partisi terpasang, {i>trim<i} dikeluarkan
yang menyebabkan sistem file untuk
memberikan perintah {i>trim<i} pada
semua blok yang bebas digunakan. dm_bow
mencegat pemangkasan dan penggunaan ini
mereka untuk membuat
daftar blokir gratis. Operasi baca dan tulis kemudian dikirim ke perangkat
tidak dimodifikasi, tetapi sebelum operasi tulis diizinkan, data yang diperlukan untuk pemulihan akan
hingga satu blok gratis.
Proses checkpoint
Saat partisi dengan tanda checkpoint=fs/block
dipasang, Android akan memanggil
restoreCheckpoint
di drive agar perangkat dapat memulihkan data saat ini
pos pemeriksaan. init
kemudian memanggil fungsi needsCheckpoint
untuk menentukan apakah
perangkat dalam status A/B bootloader atau telah menetapkan percobaan ulang update
penghitungan. Jika salah satunya benar, Android akan memanggil createCheckpoint
untuk menambahkan pemasangan
flag atau build perangkat dm_bow
.
Setelah partisi terpasang, kode checkpoint dipanggil untuk melakukan trim.
Proses {i>booting<i} kemudian berlanjut seperti biasa. Di LOCKED_BOOT_COMPLETE
, Android
memanggil commitCheckpoint
untuk meng-commit checkpoint saat ini dan update
berlanjut seperti biasa.
Kelola kunci keymaster
Kunci Keymaster digunakan untuk enkripsi perangkat atau tujuan lain. Untuk mengelola Android akan menunda panggilan penghapusan tombol hingga checkpoint di-commit.
Pantau kondisi
Daemon kesehatan memverifikasi bahwa ada cukup kapasitas {i>disk<i} untuk membuat
pos pemeriksaan. {i>Daemon<i} kesehatan terletak di
cp_healthDaemon
dalam Checkpoint.cpp
.
Daemon kesehatan memiliki perilaku berikut yang dapat dikonfigurasi:
ro.sys.cp_msleeptime
: Mengontrol seberapa sering perangkat memeriksa penggunaan disk.ro.sys.cp_min_free_bytes
: Mengontrol nilai minimum yang dicari daemon kesehatan.ro.sys.cp_commit_on_full
: Mengontrol apakah daemon kesehatan memulai ulang perangkat atau meng-commit {i>checkpoint<i} dan melanjutkan ketika {i>disk<i} penuh.
API Checkpoint
Checkpoint API digunakan oleh fitur UDC. Untuk API lain yang digunakan oleh UDC, lihat
IVold.aidl
void startCheckpoint(int percobaan ulang)
Membuat checkpoint.
Framework akan memanggil metode ini setelah siap untuk memulai update. Tujuan
dibuat sebelum sistem file yang
diperiksa, seperti data pengguna,
terpasang R/W setelah {i>reboot<i}. Jika jumlah percobaan ulang positif, API akan menangani
melacak percobaan ulang, dan updater memanggil needsRollback
untuk memeriksa apakah rollback
update diperlukan. Jika jumlah percobaan ulangnya adalah -1
, API akan mengalihkan ke A/B
penilaian {i>bootloader<i}.
Metode ini tidak dipanggil saat melakukan update A/B normal.
void commitChanges()
Meng-commit perubahan.
Framework ini memanggil metode ini setelah reboot saat perubahan siap
berkomitmen. Ini dipanggil sebelum data (seperti gambar, video, SMS, server
tanda terima penerimaan) ditulis ke data pengguna dan sebelum BootComplete
.
Jika tidak ada update dengan checkpoint yang aktif, metode ini tidak akan berpengaruh.
abortChanges()
Memaksa {i>reboot<i} dan mengembalikan ke {i>checkpoint<i}. Mengabaikan semua modifikasi data pengguna sejak {i>reboot <i}pertama.
Framework ini memanggil metode ini setelah reboot, tetapi sebelum commitChanges
.
retry_counter
diturunkan saat metode ini dipanggil. Entri log
dibuat.
bool needsRollback()
Menentukan apakah rollback diperlukan.
Pada perangkat non-checkpoint, menampilkan false
. Di perangkat pos pemeriksaan, mengembalikan true
selama {i>booting<i} di luar {i>checkpoint<i}.
Mengimplementasikan UDC
Penerapan referensi
Untuk contoh bagaimana UDC dapat diimplementasikan, lihat dm-bow.c. Untuk dokumentasi tambahan tentang fitur, lihat dm-bow.txt.
Penyiapan
Di on fs
dalam file init.hardware.rc
, pastikan Anda memiliki:
mount_all /vendor/etc/fstab.${ro.boot.hardware.platform} --early
Di on late-fs
dalam file init.hardware.rc
, pastikan Anda memiliki:
mount_all /vendor/etc/fstab.${ro.boot.hardware.platform} --late
Di file fstab.hardware
Anda, pastikan /data
diberi tag sebagai latemount
.
/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
Tambahkan partisi metadata
UDC memerlukan partisi metadata untuk menyimpan jumlah percobaan ulang nonbootloader dan
tombol. Siapkan partisi metadata dan pasang lebih awal di /metadata
.
Di file fstab.hardware
Anda, pastikan /metadata
diberi tag sebagai earlymount
atau first_stage_mount
.
/dev/block/by-name/metadata /metadata ext4 noatime,nosuid,nodev,discard,sync wait,formattable,first_stage_mount
Lakukan inisialisasi partisi ke semua angka nol.
Tambahkan baris berikut ke BoardConfig.mk
:
BOARD_USES_METADATA_PARTITION := true BOARD_ROOT_EXTRA_FOLDERS := existing_folders metadata
Update sistem
Sistem F2FS
Untuk sistem yang menggunakan F2FS untuk memformat data, pastikan bahwa versi F2FS Anda mendukung checkpoint. Untuk informasi selengkapnya, lihat Fungsi checkpoint dalam sistem file yang berbeda.
Tambahkan flag checkpoint=fs
ke bagian <fs_mgr_flags>
fstab untuk
perangkat dipasang pada /data
.
Sistem non-F2FS
Untuk sistem non-F2FS, dm-bow
harus diaktifkan dalam konfigurasi kernel.
Tambahkan flag checkpoint=block
ke bagian <fs_mgr_flags>
fstab untuk
perangkat dipasang pada /data
.
Periksa log
Entri log dibuat saat Checkpoint API dipanggil.
Validasi
Untuk menguji implementasi UDC, jalankan kumpulan VTS VtsKernelCheckpointTest
pengujian.