Android 10 memperkenalkan User Data Checkpoint (UDC), yang memungkinkan Android melakukan rollback ke status sebelumnya saat update Android over-the-air (OTA) gagal. Dengan UDC, jika update OTA Android gagal, perangkat dapat melakukan rollback ke status sebelumnya dengan aman. Meskipun
update A/B menyelesaikan masalah ini untuk booting awal, rollback
tidak didukung saat partisi data pengguna (yang dipasang di /data) diubah.
UDC memungkinkan perangkat mengembalikan partisi data pengguna meskipun setelah diubah. Fitur UDC mencapai hal ini dengan kemampuan checkpoint ke sistem file, penerapan alternatif saat sistem file tidak mendukung checkpoint, integrasi dengan mekanisme A/B bootloader sekaligus mendukung update non-A/B, dan dukungan untuk binding versi kunci dan pencegahan rollback kunci.
Dampak terhadap pengguna
Fitur UDC meningkatkan pengalaman update OTA bagi pengguna karena lebih sedikit pengguna yang kehilangan data saat update OTA gagal. Hal ini dapat mengurangi jumlah panggilan dukungan dari pengguna yang mengalami masalah selama proses update. Namun, saat update OTA gagal, pengguna mungkin melihat perangkat melakukan reboot beberapa kali.
Cara kerjanya
Fungsi checkpoint di sistem file yang berbeda
Untuk sistem file F2FS, UDC menambahkan fungsi checkpoint ke kernel Linux 4.20 upstream dan melakukan backport ke semua kernel umum yang didukung oleh perangkat yang menjalankan Android 10.
Untuk sistem file lainnya, UDC menggunakan perangkat virtual pemeta perangkat yang disebut dm_bow untuk fungsi checkpoint. dm_bow berada di antara perangkat dan sistem file. Saat partisi dipasang, trim akan dikeluarkan sehingga sistem file mengeluarkan perintah trim pada semua blok kosong. dm_bow mencegat trim ini dan menggunakannya untuk menyiapkan daftar blok kosong. Operasi baca dan tulis kemudian dikirim ke perangkat tanpa diubah, tetapi sebelum operasi tulis diizinkan, data yang diperlukan untuk pemulihan dicadangkan ke blok kosong.
Proses checkpoint
Saat partisi dengan flag checkpoint=fs/block dipasang, Android memanggil restoreCheckpoint di drive untuk memungkinkan perangkat memulihkan checkpoint saat ini. init kemudian memanggil fungsi needsCheckpoint untuk menentukan apakah perangkat berada dalam status A/B bootloader atau telah menetapkan jumlah percobaan ulang update. Jika salah satunya benar, Android akan memanggil createCheckpoint untuk menambahkan flag pemasangan atau membuat perangkat dm_bow.
Setelah partisi dipasang, kode checkpoint akan dipanggil untuk mengeluarkan trim.
Proses booting kemudian dilanjutkan seperti biasa. Di LOCKED_BOOT_COMPLETE, Android memanggil commitCheckpoint untuk melakukan checkpoint saat ini dan update akan dilanjutkan seperti biasa.
Mengelola kunci KeyMint (sebelumnya Keymaster)
Kunci KeyMint digunakan untuk enkripsi perangkat atau tujuan lainnya. Untuk mengelola kunci ini, Android menunda panggilan penghapusan kunci hingga checkpoint dilakukan.
Memantau kondisi
Daemon kondisi memverifikasi bahwa ada cukup ruang disk untuk membuat checkpoint. Daemon kondisi terletak di
cp_healthDaemon
di Checkpoint.cpp.
Daemon kondisi memiliki perilaku berikut yang dapat dikonfigurasi:
ro.sys.cp_msleeptime: Mengontrol frekuensi perangkat memeriksa penggunaan disk.ro.sys.cp_min_free_bytes: Mengontrol nilai minimum yang dicari oleh daemon kondisi.ro.sys.cp_commit_on_full: Mengontrol apakah daemon kondisi melakukan reboot perangkat atau melakukan checkpoint dan melanjutkan saat disk penuh.
Checkpoint API
Checkpoint API digunakan oleh fitur UDC. Untuk API lain yang digunakan oleh UDC, lihat
IVold.aidl.
void startCheckpoint(int retry)
Membuat checkpoint.
Framework memanggil metode ini saat siap memulai update. Checkpoint dibuat sebelum sistem file yang di-checkpoint seperti userdata dipasang R/W setelah reboot. Jika jumlah percobaan ulang positif, API akan menangani pelacakan percobaan ulang, dan updater akan memanggil needsRollback untuk memeriksa apakah rollback update diperlukan. Jika jumlah percobaan ulang adalah -1, API akan menangguhkan ke pertimbangan bootloader A/B.
Metode ini tidak dipanggil saat melakukan update A/B normal.
void commitChanges()
Melakukan perubahan.
Framework memanggil metode ini setelah reboot saat perubahan siap dilakukan. Metode ini dipanggil sebelum data (seperti gambar, video, SMS, tanda terima server) ditulis ke userdata dan sebelum BootComplete.
Jika tidak ada update yang di-checkpoint aktif, metode ini tidak akan berpengaruh.
abortChanges()
Memaksa reboot dan kembali ke checkpoint. Meninggalkan semua modifikasi userdata sejak reboot pertama.
Framework memanggil metode ini setelah reboot, tetapi sebelum commitChanges.
retry_counter akan dikurangi saat metode ini dipanggil. Entri log dibuat.
bool needsRollback()
Menentukan apakah rollback diperlukan.
Pada perangkat non-checkpoint, menampilkan false. Pada perangkat checkpoint, menampilkan true selama booting non-checkpoint.
Mengimplementasikan UDC
Penerapan referensi
Untuk contoh cara mengimplementasikan UDC, lihat dm-bow.c.
Untuk dokumentasi tambahan tentang fitur ini, 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, pastikan /data ditandai 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
Menambahkan partisi metadata
UDC memerlukan partisi metadata untuk menyimpan jumlah percobaan ulang dan kunci non-bootloader. Siapkan partisi metadata dan pasang lebih awal di /metadata.
Di file fstab.hardware, pastikan /metadata ditandai sebagai earlymount atau first_stage_mount.
/dev/block/by-name/metadata /metadata ext4 noatime,nosuid,nodev,discard,sync wait,formattable,first_stage_mount
Inisialisasi partisi ke semua nol.
Tambahkan baris berikut ke BoardConfig.mk:
BOARD_USES_METADATA_PARTITION := true BOARD_ROOT_EXTRA_FOLDERS := existing_folders metadata
Memperbarui sistem
Sistem F2FS
Untuk sistem yang menggunakan F2FS untuk memformat data, pastikan versi F2FS Anda mendukung checkpoint. Untuk mengetahui informasi selengkapnya, lihat Fungsi checkpoint di sistem file yang berbeda.
Tambahkan flag checkpoint=fs ke bagian <fs_mgr_flags> fstab untuk
perangkat yang dipasang di /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 yang dipasang di /data.
Memeriksa log
Entri log dibuat saat Checkpoint API dipanggil.
Validasi
Untuk menguji penerapan UDC, jalankan kumpulan pengujian VTS VtsKernelCheckpointTest.