Android 10 memperkenalkan Titik Pemeriksaan Data Pengguna (UDC), yang memungkinkan Android melakukan roll back ke status sebelumnya jika update over-the-air (OTA) Android gagal. Dengan UDC, jika update OTA Android gagal, perangkat dapat di-roll back dengan aman ke status sebelumnya. Meskipun
update A/B memecahkan masalah ini untuk booting awal, rollback
tidak didukung saat partisi data pengguna (dipasang di /data
) diubah.
UDC memungkinkan perangkat mengembalikan partisi data pengguna meskipun setelah dimodifikasi. Fitur UDC mencapai hal ini dengan kemampuan titik pemeriksaan ke sistem file, penerapan alternatif saat sistem file tidak mendukung titik pemeriksaan, integrasi dengan mekanisme A/B bootloader sekaligus mendukung update non-A/B, serta dukungan untuk pengikatan versi kunci dan pencegahan rollback kunci.
Dampak bagi 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 titik pemeriksaan di sistem file yang berbeda
Untuk sistem file F2FS, UDC menambahkan fungsi titik pemeriksaan ke kernel Linux 4.20 upstream dan mem-backport-nya 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 titik pemeriksaan. dm_bow
berada di antara perangkat dan sistem
file. Saat partisi dipasang, trim akan dikeluarkan sehingga sistem file akan mengeluarkan perintah trim pada semua blok kosong. dm_bow
mencegat pemangkasan ini dan menggunakannya untuk menyiapkan daftar blok gratis. 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 tanda checkpoint=fs/block
di-mount, 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 di-mount, kode titik pemeriksaan dipanggil untuk mengeluarkan perintah trim.
Proses booting kemudian dilanjutkan seperti biasa. Pada LOCKED_BOOT_COMPLETE
, Android
memanggil commitCheckpoint
untuk melakukan checkpoint saat ini dan update
berlanjut 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 titik pemeriksaan dilakukan.
Memantau kesehatan
Daemon kesehatan memverifikasi bahwa ada cukup ruang disk untuk membuat titik pemeriksaan. Daemon health terletak di
cp_healthDaemon
di 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 health.ro.sys.cp_commit_on_full
: Mengontrol apakah daemon health melakukan reboot perangkat atau melakukan checkpoint dan melanjutkan saat disk penuh.
Checkpoint API
API Checkpoint digunakan oleh fitur UDC. Untuk API lain yang digunakan oleh UDC, lihat
IVold.aidl
.
void startCheckpoint(int retry)
Membuat titik pemeriksaan.
Framework memanggil metode ini saat siap memulai update. Titik pemeriksaan dibuat sebelum sistem file yang diperiksa seperti userdata dipasang R/W setelah dimulai ulang. Jika jumlah percobaan ulang positif, API akan menangani
pelacakan percobaan ulang, dan pengupdate memanggil needsRollback
untuk memeriksa apakah rollback
update diperlukan. Jika jumlah percobaan ulang adalah -1
, API akan mengikuti pertimbangan bootloader A/B.
Metode ini tidak dipanggil saat melakukan update A/B normal.
void commitChanges()
Melakukan commit pada perubahan.
Framework memanggil metode ini setelah reboot saat perubahan siap untuk di-commit. Fungsi ini dipanggil sebelum data (seperti gambar, video, SMS, tanda terima penerimaan server) ditulis ke userdata dan sebelum BootComplete
.
Jika tidak ada update yang di-checkpoint yang aktif, metode ini tidak akan berpengaruh.
abortChanges()
Memaksa mulai ulang dan kembali ke checkpoint. Membatalkan semua modifikasi userdata sejak reboot pertama.
Framework memanggil metode ini setelah melakukan booting ulang, tetapi sebelum commitChanges
.
retry_counter
akan berkurang saat metode ini dipanggil. Entri log dibuat.
bool needsRollback()
Menentukan apakah rollback diperlukan.
Pada perangkat non-checkpoint, menampilkan false
. Di perangkat checkpoint, menampilkan true
selama booting non-checkpoint.
Menerapkan UDC
Implementasi referensi
Untuk contoh cara penerapan UDC, lihat dm-bow.c. Untuk dokumentasi tambahan tentang fitur ini, lihat dm-bow.txt.
Penyiapan
Di on fs
dalam file init.hardware.rc
Anda, pastikan Anda memiliki:
mount_all /vendor/etc/fstab.${ro.boot.hardware.platform} --early
Di on late-fs
dalam file init.hardware.rc
Anda, 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
Menambahkan partisi metadata
UDC memerlukan partisi metadata untuk menyimpan jumlah percobaan ulang non-bootloader dan
kunci. Siapkan partisi metadata dan pasang lebih awal di /metadata
.
Di file fstab.hardware
Anda, 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
Lakukan 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 titik pemeriksaan. Untuk mengetahui informasi selengkapnya, lihat Fungsi titik pemeriksaan di sistem file yang berbeda.
Tambahkan tanda checkpoint=fs
ke bagian <fs_mgr_flags>
fstab untuk
perangkat yang di-mount di /data
.
Sistem non-F2FS
Untuk sistem non-F2FS, dm-bow
harus diaktifkan di konfigurasi kernel.
Tambahkan tanda checkpoint=block
ke bagian <fs_mgr_flags>
fstab untuk
perangkat yang di-mount di /data
.
Memeriksa log
Entri log dibuat saat Checkpoint API dipanggil.
Validasi
Untuk menguji penerapan UDC Anda, jalankan rangkaian pengujian VTS VtsKernelCheckpointTest
.