Android 7.0 berjalan dalam mode Direct Boot yang aman saat perangkat telah dinyalakan, tetapi pengguna belum membuka kunci perangkat. Untuk mendukung hal ini, sistem menyediakan dua lokasi penyimpanan data:
- Penyimpanan yang dienkripsi dengan kredensial, yang merupakan lokasi penyimpanan default dan hanya tersedia setelah pengguna membuka kunci perangkat.
- Penyimpanan yang dienkripsi dengan perangkat, yang merupakan lokasi penyimpanan yang tersedia selama mode Direct Boot dan setelah pengguna membuka kunci perangkat.
Secara default, aplikasi tidak berjalan selama mode Direct Boot. Jika aplikasi Anda perlu melakukan tindakan selama mode Direct Boot, Anda bisa mendaftarkan komponen aplikasi yang harus dijalankan selama mode ini. Beberapa kasus penggunaan umum yang perlu dijalankan aplikasi selama mode Direct Boot antara lain:
- Aplikasi yang menjadwalkan notifikasi, seperti aplikasi jam alarm.
- Aplikasi yang menyediakan notifikasi pengguna yang penting, seperti aplikasi SMS.
- Aplikasi yang menyediakan layanan aksesibilitas, seperti TalkBack.
Jika aplikasi Anda perlu mengakses data saat dijalankan dalam mode Direct Boot, gunakan penyimpanan yang dienkripsi dengan perangkat. Penyimpanan yang dienkripsi dengan perangkat berisi data terenkripsi dengan kunci yang hanya tersedia setelah perangkat melakukan booting yang berhasil diverifikasi.
Untuk data yang harus dienkripsi dengan kunci yang terkait dengan kredensial pengguna, seperti PIN atau sandi, gunakan penyimpanan yang dienkripsi dengan kredensial. Penyimpanan yang dienkripsi dengan kredensial tersedia setelah pengguna berhasil membuka kunci perangkat dan hingga pengguna memulai ulang perangkat. Jika pengguna mengaktifkan layar kunci setelah membuka kunci perangkat, penyimpanan yang dienkripsi dengan kredensial akan tetap tersedia.
Meminta akses untuk berjalan selama Direct Boot
Aplikasi harus mendaftarkan komponennya pada sistem agar
bisa berjalan selama mode Direct Boot atau mengakses penyimpanan yang dienkripsi
dengan perangkat. Aplikasi mendaftar ke sistem dengan menandai komponen sebagai
peka enkripsi. Untuk menandai komponen Anda sebagai peka enkripsi, setel
atribut android:directBootAware
ke nilai benar dalam manifes Anda.
Komponen yang peka enkripsi dapat mendaftar untuk menerima
pesan siaran ACTION_LOCKED_BOOT_COMPLETED
dari
sistem ketika perangkat telah dimulai ulang. Di tahap ini, penyimpanan yang dienkripsi dengan perangkat
akan tersedia, dan komponen Anda dapat menjalankan tugas yang diperlukan
selama mode Direct Boot, seperti memicu alarm yang terjadwal.
Cuplikan kode berikut adalah contoh cara mendaftarkan
BroadcastReceiver
sebagai peka enkripsi, dan menambahkan
filter intent untuk ACTION_LOCKED_BOOT_COMPLETED
dalam manifes aplikasi:
<receiver android:directBootAware="true" > ... <intent-filter> <action android:name="android.intent.action.LOCKED_BOOT_COMPLETED" /> </intent-filter> </receiver>
Setelah pengguna membuka kunci perangkat, semua komponen dapat mengakses penyimpanan yang dienkripsi dengan perangkat maupun penyimpanan yang dienkripsi dengan kredensial.
Mengakses penyimpanan yang dienkripsi dengan perangkat
Untuk mengakses penyimpanan yang dienkripsi dengan perangkat, buat
instance Context
kedua dengan memanggil
Context.createDeviceProtectedStorageContext()
. Semua panggilan API
penyimpanan yang dilakukan menggunakan konteks ini mengakses penyimpanan yang dienkripsi dengan perangkat. Contoh
berikut mengakses penyimpanan yang dienkripsi dengan perangkat dan membuka file data
aplikasi yang ada:
Kotlin
val directBootContext: Context = appContext.createDeviceProtectedStorageContext() // Access appDataFilename that lives in device encrypted storage val inStream: InputStream = directBootContext.openFileInput(appDataFilename) // Use inStream to read content...
Java
Context directBootContext = appContext.createDeviceProtectedStorageContext(); // Access appDataFilename that lives in device encrypted storage FileInputStream inStream = directBootContext.openFileInput(appDataFilename); // Use inStream to read content...
Gunakan penyimpanan yang dienkripsi dengan perangkat hanya untuk informasi yang harus dapat diakses selama mode Direct Boot. Jangan gunakan penyimpanan yang dienkripsi dengan perangkat sebagai penyimpanan terenkripsi untuk tujuan umum. Untuk informasi pribadi pengguna, atau data terenkripsi yang tidak diperlukan selama mode Direct Boot, gunakan penyimpanan yang dienkripsi dengan kredensial.
Mendapatkan notifikasi saat pengguna membuka kunci
Jika pengguna membuka kunci perangkat setelah dimulai ulang, aplikasi Anda dapat beralih untuk mengakses penyimpanan yang dienkripsi dengan kredensial dan menggunakan layanan sistem biasa yang bergantung pada kredensial pengguna.
Untuk mendapatkan notifikasi saat pengguna membuka kunci perangkat setelah reboot,
daftarkan BroadcastReceiver
dari komponen yang berjalan
untuk memproses pesan notifikasi saat membuka kunci. Jika pengguna membuka kunci perangkat
setelah booting:
- Jika aplikasi Anda memiliki proses latar depan yang memerlukan notifikasi segera,
proses pesan
ACTION_USER_UNLOCKED
. - Jika aplikasi Anda hanya menggunakan proses latar belakang yang dapat bertindak pada notifikasi
yang tertunda, proses
pesan
ACTION_BOOT_COMPLETED
.
Jika pengguna telah membuka kunci perangkat, Anda dapat mengetahuinya dengan memanggil
UserManager.isUserUnlocked()
.
Memigrasikan data yang ada
Jika pengguna mengupdate perangkat mereka agar dapat menggunakan mode Direct Boot, data Anda yang ada mungkin
perlu dimigrasikan ke penyimpanan yang dienkripsi dengan perangkat. Gunakan
Context.moveSharedPreferencesFrom()
dan
Context.moveDatabaseFrom()
, dengan konteks tujuan sebagai pemanggil metode dan konteks sumber sebagai argumen, untuk memigrasikan data preferensi dan
database antara penyimpanan yang dienkripsi dengan kredensial dan penyimpanan yang dienkripsi dengan perangkat.
Jangan migrasikan informasi pengguna yang bersifat pribadi, seperti sandi atau token otorisasi, dari penyimpanan yang dienkripsi dengan kredensial ke penyimpanan yang dienkripsi dengan perangkat. Pertimbangkan dengan baik saat memutuskan data lain yang akan dimigrasikan ke penyimpanan yang dienkripsi dengan perangkat. Dalam beberapa skenario, Anda mungkin perlu mengelola kumpulan data terpisah dalam dua penyimpanan yang dienkripsi.
Menguji aplikasi yang peka enkripsi
Uji aplikasi Anda yang peka enkripsi dengan mengaktifkan mode Direct Boot.
Sebagian besar perangkat yang menjalankan Android versi terbaru mengaktifkan mode Direct Boot setiap kali kredensial layar kunci (PIN, pola, atau sandi) telah disetel. Secara khusus, hal ini terjadi di semua perangkat yang menggunakan enkripsi berbasis file. Untuk memeriksa apakah perangkat menggunakan enkripsi berbasis file, jalankan perintah shell berikut:
adb shell getprop ro.crypto.type
Jika output-nya adalah file
, berarti perangkat mengaktifkan
enkripsi berbasis file.
Di perangkat yang tidak menggunakan enkripsi berbasis file secara default, mungkin ada opsi lain untuk menguji mode Direct Boot:
-
Beberapa perangkat yang menggunakan enkripsi disk penuh (
ro.crypto.type=block
) dan menjalankan Android 7.0 hingga Android 12 dapat dikonversi menjadi enkripsi berbasis file. Ada 2 cara untuk melakukannya:- Di perangkat, aktifkan Developer options jika Anda belum melakukannya dengan membuka Settings > About phone lalu mengetuk Build number tujuh kali. Lalu buka Settings > Developer options lalu pilih Convert to file encryption.
- Bisa juga dengan menjalankan perintah shell berikut:
adb reboot-bootloader
fastboot --wipe-and-use-fbe
Peringatan: Metode konversi ke enkripsi berbasis file akan menghapus total semua data pengguna di perangkat.
-
Perangkat yang menjalankan Android 13 atau yang lebih rendah mendukung mode Direct Boot "teremulasi" yang menggunakan izin file untuk menyimulasikan efek file terenkripsi yang dikunci dan tidak terkunci. Hanya gunakan mode emulasi selama pengembangan karena dapat menyebabkan kehilangan data. Untuk mengaktifkan mode emulasi Direct Boot, setel pola kunci di perangkat, pilih "No thanks" jika diminta menggunakan layar start-up yang aman saat menyetel pola kunci, kemudian jalankan perintah shell berikut:
adb shell sm set-emulate-fbe true
Untuk menonaktifkan mode Direct Boot yang diemulasi, jalankan perintah shell berikut:
adb shell sm set-emulate-fbe false
Menjalankan salah satu perintah ini akan menyebabkan perangkat dimulai ulang.
Memeriksa status enkripsi kebijakan perangkat
Aplikasi administrasi perangkat dapat menggunakan DevicePolicyManager.getStorageEncryptionStatus()
untuk memeriksa status enkripsi perangkat saat ini.
Jika aplikasi Anda menargetkan level API yang lebih rendah dari Android 7.0 (API 24),
getStorageEncryptionStatus()
akan menampilkan
ENCRYPTION_STATUS_ACTIVE
jika perangkat menggunakan enkripsi disk penuh
atau enkripsi berbasis file dengan Direct Boot. Dalam kedua kasus ini, data
selalu disimpan dengan kondisi terenkripsi saat tidak digunakan.
Jika aplikasi Anda menargetkan Android 7.0 (API 24) atau yang lebih tinggi,
getStorageEncryptionStatus()
akan menampilkan
ENCRYPTION_STATUS_ACTIVE
jika perangkat menggunakan enkripsi disk penuh. Metode ini menampilkan
ENCRYPTION_STATUS_ACTIVE_PER_USER
jika perangkat menggunakan enkripsi berbasis file
dengan Direct Boot.
Jika Anda membangun aplikasi administrasi perangkat
yang menargetkan Android 7.0, pastikan Anda memeriksa
ENCRYPTION_STATUS_ACTIVE
dan
ENCRYPTION_STATUS_ACTIVE_PER_USER
untuk menentukan apakah perangkat
telah dienkripsi atau belum.
Contoh kode lainnya
Contoh DirectBoot lebih lanjut menunjukkan penggunaan API yang tercakup dalam halaman ini.