Android Dev Summit, October 23-24: two days of technical content, directly from the Android team. Sign-up for livestream updates.

Mendukung mode Direct Boot

Android 7.0 berjalan dalam mode Direct Boot yang aman ketika perangkat telah dinyalakan namun pengguna tidak 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 hanya tersedia setelah pengguna berhasil membuka kunci perangkat, hingga sampai pengguna memulai ulang perangkat. Jika pengguna mengaktifkan layar kunci setelah membuka kunci perangkat, hal ini tidak akan mengunci penyimpanan yang dienkripsi dengan kredensial.

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 pada sistem dengan menandai komponen sebagai peka enkripsi. Untuk menandai komponen Anda sebagai peka enkripsi, setel atribut android:directBootAware ke true dalam manifes Anda.

Komponen yang peka enkripsi dapat mendaftar untuk menerima pesan siaran ACTION_LOCKED_BOOT_COMPLETED dari sistem ketika perangkat telah dimulai ulang. Pada tahap ini, penyimpanan yang dienkripsi dengan perangkat akan tersedia, dan komponen Anda bisa mengeksekusi tugas yang perlu dijalankan 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 serta 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 Storage API 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.

Agar mendapatkan notifikasi jika pengguna membuka kunci perangkat setelah di-reboot, daftarkan BroadcastReceiver dari komponen yang berjalan untuk mendengarkan pesan notifikasi saat membuka kunci. Jika pengguna membuka kunci perangkat setelah booting:

  • Jika aplikasi Anda memiliki proses latar depan yang membutuhkan notifikasi segera, dengarkan pesan ACTION_USER_UNLOCKED.
  • Jika aplikasi Anda hanya menggunakan proses latar belakang yang dapat bertindak pada notifikasi yang tertunda, dengarkan 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 untuk menggunakan mode Direct Boot, data Anda yang ada mungkin perlu dipindahkan ke penyimpanan yang dienkripsi dengan perangkat. Gunakan Context.moveSharedPreferencesFrom() dan Context.moveDatabaseFrom() untuk memigrasikan data preferensi dan database antara penyimpanan yang dienkripsi dengan kredensial dan penyimpanan yang dienkripsi dengan perangkat.

Pertimbangkan dengan baik saat memutuskan data apa yang akan dipindahkan dari penyimpanan yang dienkripsi dengan kredensial ke penyimpanan yang dienkripsi dengan perangkat. Anda sebaiknya tidak memindahkan informasi pengguna yang bersifat rahasia, seperti kata sandi atau token otorisasi, ke penyimpanan yang dienkripsi dengan perangkat. Dalam beberapa kejadian, Anda mungkin perlu mengelola kumpulan data terpisah pada dua tempat penyimpanan yang dienkripsi.

Menguji aplikasi yang peka enkripsi

Uji aplikasi Anda yang peka enkripsi dengan mengaktifkan mode Direct Boot. Ada dua cara untuk mengaktifkan Direct Boot.

Perhatian: Mengaktifkan Direct Boot akan menghapus semua data pengguna pada perangkat.

Pada perangkat yang didukung dengan Android 7.0 terinstal, aktifkan Direct Boot dengan melakukan salah satu hal berikut:

  • Pada perangkat, aktifkan Opsi Developer jika Anda belum melakukannya dengan membuka Setelan > Tentang telepon, dan tap Nomor versi tujuh kali. Setelah layar Opsi developer terbuka, buka Setelan > Opsi developer dan pilih Konversikan ke enkripsi file.
  • Gunakan perintah shell adb berikut untuk mengaktifkan mode Direct Boot:
        $ adb reboot-bootloader
        $ fastboot --wipe-and-use-fbe
        

Mode emulasi Direct Boot juga tersedia, jika Anda perlu mengganti mode pada perangkat pengujian. Mode emulasi sebaiknya hanya digunakan selama pengembangan dan bisa menyebabkan kehilangan data. Untuk mengaktifkan mode emulasi Direct Boot, setel pola kunci pada perangkat, pilih "Lain kali" jika ditanya mengenai layar mulai aman saat menyetel pola kunci, kemudian gunakan perintah shell adb berikut:

    $ adb shell sm set-emulate-fbe true
    

Untuk menonaktifkan mode emulasi Direct Boot, gunakan perintah berikut:

    $ adb shell sm set-emulate-fbe false
    

Menggunakan perintah ini akan menyebabkan perangkat melakukan reboot.

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 24.0 (Android 7.0), 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 terenkripsi saat tidak dipakai. Jika aplikasi Anda menargetkan level API 24.0 atau yang lebih tinggi, getStorageEncryptionStatus() akan menampilkan ENCRYPTION_STATUS_ACTIVE jika perangkat menggunakan enkripsi disk penuh. Hal ini akan menampilkan ENCRYPTION_STATUS_ACTIVE_PER_USER jika perangkat menggunakan enkripsi berbasis file dengan Direct Boot.

Jika Anda membuat aplikasi administrasi perangkat yang menargetkan Android 7.0, pastikan untuk memeriksa ENCRYPTION_STATUS_ACTIVE dan ENCRYPTION_STATUS_ACTIVE_PER_USER untuk menentukan apakah perangkat dienkripsi.

Contoh kode tambahan

Contoh Android DirectBoot lebih lanjut menunjukkan penggunaan API yang tercakup di halaman ini.