Mendukung mode Direct Boot

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:

      Peringatan: Metode konversi ke enkripsi berbasis file akan menghapus total semua data pengguna di perangkat.

    • 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
      
  • 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.