Android 10 memperkenalkan User Data Checkpoint (UDC), yang memungkinkan Android mengembalikan ke keadaan sebelumnya ketika pembaruan Android over-the-air (OTA) gagal. Dengan UDC, jika pembaruan Android OTA gagal, perangkat dapat kembali ke keadaan sebelumnya dengan aman. Meskipun pembaruan A/B menyelesaikan masalah ini untuk boot awal, rollback tidak didukung ketika partisi data pengguna (yang terpasang pada /data
) diubah.
UDC memungkinkan perangkat mengembalikan partisi data pengguna bahkan setelah dimodifikasi. Fitur UDC menyelesaikan hal ini dengan kemampuan pos pemeriksaan pada sistem file, implementasi alternatif ketika sistem file tidak mendukung pos pemeriksaan, integrasi dengan mekanisme bootloader A/B sekaligus mendukung pembaruan non-A/B, dan dukungan untuk pengikatan versi kunci dan pencegahan rollback kunci.
Dampak pengguna
Fitur UDC meningkatkan pengalaman pembaruan OTA bagi pengguna karena lebih sedikit pengguna yang kehilangan data ketika pembaruan OTA gagal. Hal ini dapat mengurangi jumlah panggilan dukungan dari pengguna yang mengalami masalah selama proses pembaruan. Namun, ketika pembaruan OTA gagal, pengguna mungkin melihat perangkat melakukan boot ulang beberapa kali.
Bagaimana itu bekerja
Fungsionalitas pos pemeriksaan di sistem file yang berbeda
Untuk sistem file F2FS, UDC menambahkan fungsionalitas checkpoint ke kernel Linux 4.20 upstream dan mem-backportnya ke semua kernel umum yang didukung oleh perangkat yang menjalankan Android 10.
Untuk sistem file lain, UDC menggunakan perangkat virtual pemeta perangkat yang disebut dm_bow
untuk fungsionalitas pos pemeriksaan. dm_bow
berada di antara perangkat dan sistem file. Ketika sebuah partisi dipasang, trim dikeluarkan yang menyebabkan sistem file mengeluarkan perintah trim pada semua blok bebas. dm_bow
mencegat trim ini dan menggunakannya untuk membuat daftar blokir gratis. Pembacaan dan penulisan kemudian dikirim ke perangkat tanpa dimodifikasi, namun sebelum penulisan diperbolehkan, data yang diperlukan untuk pemulihan dicadangkan ke blok bebas.
Proses pos pemeriksaan
Saat partisi dengan flag checkpoint=fs/block
dipasang, Android akan memanggil restoreCheckpoint
di drive untuk mengizinkan perangkat memulihkan checkpoint saat ini. init
kemudian memanggil fungsi needsCheckpoint
untuk menentukan apakah perangkat berada dalam status bootloader A/B atau telah menyetel jumlah percobaan ulang pembaruan. Jika salah satunya benar, Android akan memanggil createCheckpoint
untuk menambahkan flag mount atau membuat perangkat dm_bow
.
Setelah partisi dipasang, kode pos pemeriksaan dipanggil untuk mengeluarkan trim. Proses booting kemudian berlanjut seperti biasa. Di LOCKED_BOOT_COMPLETE
, Android memanggil commitCheckpoint
untuk melakukan pos pemeriksaan saat ini dan pembaruan berlanjut seperti biasa.
Kelola kunci keymaster
Kunci keymaster digunakan untuk enkripsi perangkat atau tujuan lainnya. Untuk mengelola kunci ini, Android menunda panggilan penghapusan kunci hingga pos pemeriksaan dilakukan.
Pantau kesehatan
Daemon kesehatan memverifikasi bahwa ada cukup ruang disk untuk membuat pos pemeriksaan. Daemon kesehatan 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 kesehatan. -
ro.sys.cp_commit_on_full
: Mengontrol apakah daemon kesehatan me-reboot perangkat atau melakukan pos pemeriksaan dan melanjutkan ketika disk penuh.
API pos pemeriksaan
API Checkpoint digunakan oleh fitur UDC. Untuk API lain yang digunakan oleh UDC, lihat IVold.aidl
.
batalkan startCheckpoint (int coba lagi)
Membuat pos pemeriksaan.
Kerangka kerja memanggil metode ini ketika sudah siap untuk memulai pembaruan. Pos pemeriksaan dibuat sebelum sistem file pos pemeriksaan seperti data pengguna dipasang R/W setelah reboot. Jika jumlah percobaan ulang positif, API akan menangani pelacakan percobaan ulang, dan pembaru akan memanggil needsRollback
untuk memeriksa apakah rollback pembaruan diperlukan. Jika jumlah percobaan ulang adalah -1
, API akan tunduk pada penilaian bootloader A/B.
Metode ini tidak dipanggil saat melakukan pembaruan A/B normal.
batalkan commitChanges()
Melakukan perubahan.
Kerangka kerja memanggil metode ini setelah reboot ketika perubahan siap diterapkan. Ini disebut sebelum data (seperti gambar, video, SMS, tanda terima server) ditulis ke data pengguna dan sebelum BootComplete
.
Jika tidak ada pembaruan pos pemeriksaan aktif, metode ini tidak berpengaruh.
batalkanPerubahan()
Memaksa reboot dan kembali ke pos pemeriksaan. Abaikan semua modifikasi data pengguna sejak reboot pertama.
Kerangka kerja memanggil metode ini setelah reboot tetapi sebelum commitChanges
. retry_counter
berkurang ketika metode ini dipanggil. Entri log dihasilkan.
bool membutuhkanRollback()
Menentukan apakah rollback diperlukan.
Pada perangkat noncheckpoint, mengembalikan false
. Pada perangkat checkpoint, mengembalikan nilai true
selama boot noncheckpoint.
Menerapkan UDC
Implementasi referensi
Untuk contoh bagaimana UDC dapat diimplementasikan, lihat dm-bow.c . Untuk dokumentasi tambahan mengenai fitur ini, lihat dm-bow.txt .
Mempersiapkan
Di on fs
di file init.hardware.rc
Anda, pastikan Anda memiliki:
mount_all /vendor/etc/fstab.${ro.boot.hardware.platform} --early
Di on late-fs
di 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
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
Tambahkan partisi metadata
UDC memerlukan partisi metadata untuk menyimpan jumlah dan kunci percobaan ulang nonbootloader. 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
Inisialisasi partisi ke semua nol.
Tambahkan baris berikut ke BoardConfig.mk
:
BOARD_USES_METADATA_PARTITION := true BOARD_ROOT_EXTRA_FOLDERS := existing_folders metadata
Perbarui sistem
sistem F2FS
Untuk sistem yang menggunakan F2FS untuk memformat data, pastikan versi F2FS Anda mendukung pos pemeriksaan. Untuk informasi selengkapnya, lihat Fungsionalitas pos pemeriksaan di sistem file yang berbeda .
Tambahkan tanda 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 di konfigurasi kernel.
Tambahkan tanda checkpoint=block
ke bagian <fs_mgr_flags>
fstab untuk perangkat yang dipasang di /data
.
Periksa log
Entri log dihasilkan ketika API Checkpoint dipanggil.
Validasi
Untuk menguji implementasi UDC Anda, jalankan rangkaian pengujian VTS VtsKernelCheckpointTest
.