Profil kerja

Platform Android memungkinkan perangkat memiliki profil kerja (terkadang disebut sebagai profil terkelola). Profil kerja dikontrol oleh admin IT, dan fungsi yang tersedia untuk profil tersebut ditetapkan secara terpisah dari fungsi profil utama pengguna. Pendekatan ini memungkinkan organisasi mengontrol lingkungan tempat dijalankannya aplikasi dan data khusus perusahaan di perangkat pengguna, sekaligus tetap memungkinkan pengguna untuk menggunakan aplikasi dan profil pribadinya.

Tutorial ini menunjukkan cara memodifikasi aplikasi agar dapat berfungsi andal pada perangkat dengan profil kerja. Anda tidak perlu melakukan apa pun selain praktik terbaik pengembangan aplikasi yang biasa. Namun, beberapa praktik terbaik ini menjadi sangat penting pada perangkat dengan profil kerja. Dokumen ini menyoroti masalah yang perlu Anda perhatikan.

Ringkasan

Pengguna sering kali ingin menggunakan perangkat pribadi mereka dalam lingkungan perusahaan. Situasi ini dapat menghadirkan dilema bagi organisasi. Jika pengguna dapat menggunakan perangkatnya sendiri, organisasi harus khawatir bahwa informasi rahasia (seperti email dan kontak karyawan) berada di perangkat yang tidak dikontrol oleh organisasi.

Untuk mengatasi situasi ini, Android 5.0 (API level 21) memungkinkan organisasi menyiapkan profil kerja. Jika perangkat memiliki profil kerja, setelan profil berada di bawah kendali admin IT. Admin IT dapat memilih aplikasi mana yang diizinkan untuk profil tersebut, dan dapat mengontrol fitur perangkat yang tersedia untuk profil tersebut.

Jika perangkat memiliki profil kerja, ada implikasi untuk aplikasi yang berjalan di perangkat, apa pun profil tempat aplikasi berjalan:

  • Secara default, sebagian besar intent tidak menyilang dari satu profil ke profil lainnya. Jika aplikasi yang berjalan di profil mengaktifkan intent, tidak ada pengendali untuk intent tersebut pada profil tersebut, dan intent tersebut tidak diizinkan untuk menyeberang ke profil lain karena pembatasan profil, permintaan akan gagal dan aplikasi dapat dimatikan secara tidak terduga.
  • Admin IT profil dapat membatasi aplikasi sistem yang tersedia di profil kerja. Pembatasan ini juga dapat menyebabkan tidak adanya pengendali untuk beberapa intent umum di profil kerja.
  • Karena profil pribadi dan kerja memiliki area penyimpanan terpisah, URI file yang valid di satu profil tidak akan valid di profil lainnya. Setiap intent yang diaktifkan pada satu profil mungkin akan ditangani di profil lainnya (bergantung pada setelan profil), sehingga tidak aman untuk melampirkan URI file ke intent.

Mencegah intent yang gagal

Pada perangkat dengan profil kerja, ada batasan apakah intent dapat menyeberang dari satu profil ke profil lainnya. Pada umumnya, saat diaktifkan, intent akan ditangani pada profil yang sama tempat intent diaktifkan. Jika tidak ada pengendali untuk intent pada profil tersebut, intent tidak akan ditangani dan aplikasi yang mengaktifkannya dapat mati secara tidak terduga, meskipun terdapat pengendali untuk intent tersebut di profil lainnya.

Admin profil dapat memilih intent yang diizinkan untuk berpindah dari satu profil ke profil lainnya. Karena admin IT membuat keputusan ini, tidak ada cara bagi Anda untuk mengetahui terlebih dahulu intent mana yang diizinkan untuk melewati batas ini. Admin IT menetapkan kebijakan ini, dan dapat mengubahnya kapan saja.

Sebelum aplikasi memulai aktivitas, Anda harus memverifikasi bahwa ada resolusi yang sesuai. Anda dapat memverifikasi bahwa ada resolusi yang dapat diterima dengan memanggil Intent.resolveActivity(). Jika tidak ada cara untuk menyelesaikan intent, metode akan menampilkan null. Jika metode ini menampilkan non-null, setidaknya ada satu cara untuk menyelesaikan intent, dan aman untuk memicu intent tersebut. Dalam hal ini, intent dapat diselesaikan karena ada pengendali di profil saat ini, atau karena intent diizinkan untuk menyeberang ke pengendali di profil lainnya. (Untuk informasi selengkapnya tentang menyelesaikan intent, lihat Intent Umum.)

Misalnya, jika aplikasi Anda perlu menyetel timer, aplikasi harus memeriksa apakah ada pengendali yang valid untuk intent ACTION_SET_TIMER. Jika tidak dapat menyelesaikan intent, aplikasi harus mengambil tindakan yang sesuai (seperti menampilkan pesan error).

Kotlin

fun startTimer(message: String, seconds: Int) {

    // Build the "set timer" intent
    val timerIntent = Intent(AlarmClock.ACTION_SET_TIMER).apply {
        putExtra(AlarmClock.EXTRA_MESSAGE, message)
        putExtra(AlarmClock.EXTRA_LENGTH, seconds)
        putExtra(AlarmClock.EXTRA_SKIP_UI, true)
    }

    // Check if there's a handler for the intent
    if (timerIntent.resolveActivity(packageManager) == null) {

        // Can't resolve the intent! Fail this operation cleanly
        // (perhaps by showing an error message)

    } else {
        // Intent resolves, it's safe to fire it off
        startActivity(timerIntent)

    }
}

Java

public void startTimer(String message, int seconds) {

    // Build the "set timer" intent
    Intent timerIntent = new Intent(AlarmClock.ACTION_SET_TIMER)
            .putExtra(AlarmClock.EXTRA_MESSAGE, message)
            .putExtra(AlarmClock.EXTRA_LENGTH, seconds)
            .putExtra(AlarmClock.EXTRA_SKIP_UI, true);

    // Check if there's a handler for the intent
    if (timerIntent.resolveActivity(getPackageManager()) == null) {

        // Can't resolve the intent! Fail this operation cleanly
        // (perhaps by showing an error message)

    } else {
        // Intent resolves, it's safe to fire it off
        startActivity(timerIntent);

    }
}

Berbagi file di seluruh profil

Terkadang aplikasi perlu memberikan akses ke filenya sendiri kepada aplikasi lain. Misalnya, aplikasi galeri gambar mungkin ingin membagikan gambarnya dengan editor gambar. Biasanya ada dua cara untuk membagikan file: dengan URI file atau URI konten.

URI file dimulai dengan awalan file:, yang diikuti dengan jalur absolut file tersebut di penyimpanan perangkat. Namun, karena profil kerja dan profil pribadi menggunakan area penyimpanan terpisah, URI file yang valid di satu profil tidak akan valid di profil lainnya. Situasi ini berarti bahwa jika Anda melampirkan URI file ke sebuah intent, dan intent tersebut ditangani di profil lain, pengendali tidak akan dapat mengakses file tersebut.

Sebagai gantinya, Anda harus berbagi file dengan URI konten. URI konten mengidentifikasi file dengan cara yang lebih aman dan dapat dibagikan. URI konten berisi jalur file, tetapi juga otoritas yang menyediakan file, dan nomor ID yang mengidentifikasi file. Anda dapat membuat ID konten untuk file apa pun menggunakan FileProvider. Kemudian, Anda dapat membagikan ID konten tersebut ke aplikasi lain (bahkan di profil lainnya). Penerima dapat menggunakan ID konten untuk mendapatkan akses ke file yang sebenarnya.

Misalnya, berikut cara mendapatkan URI konten untuk URI file tertentu:

Kotlin

// Open File object from its file URI
val fileToShare = File(fileUriToShare)

val contentUriToShare: Uri = FileProvider.getUriForFile(
        context,
        "com.example.myapp.fileprovider",
        fileToShare
)

Java

// Open File object from its file URI
File fileToShare = new File(fileUriToShare);

Uri contentUriToShare = FileProvider.getUriForFile(getContext(),
        "com.example.myapp.fileprovider", fileToShare);

Saat memanggil metode getUriForFile(), Anda harus menyertakan otoritas penyedia file (dalam contoh ini, "com.example.myapp.fileprovider"), yang ditentukan dalam elemen <provider> manifes aplikasi Anda. Untuk informasi selengkapnya tentang berbagi file dengan URI konten, lihat Berbagi File.

Mendengarkan notifikasi

Aplikasi biasanya menyediakan subclass NotificationListenerService untuk menerima callback dari sistem tentang perubahan pada notifikasi. Perangkat dengan profil kerja dapat memengaruhi cara kerja NotificationListenerService dengan aplikasi Anda.

Di profil kerja

Anda tidak dapat menggunakan NotificationListenerService dari aplikasi yang berjalan di profil kerja. Saat aplikasi Anda berjalan di profil kerja, sistem akan mengabaikan NotificationListenerService aplikasi. Namun, aplikasi yang berjalan di profil pribadi dapat memproses notifikasi.

Di profil pribadi

Saat aplikasi berjalan di profil pribadi, Anda mungkin tidak mendapatkan notifikasi untuk aplikasi yang berjalan di profil kerja. Secara default, semua aplikasi profil pribadi menerima callback, tetapi admin IT dapat mengizinkan satu atau beberapa aplikasi profil pribadi yang mereka izinkan untuk memproses perubahan notifikasi. Sistem kemudian akan memblokir aplikasi yang tidak diizinkan. Di Android 8.0 (API level 26) atau yang lebih baru, pengontrol kebijakan perangkat (DPC) yang mengelola profil kerja dapat memblokir aplikasi agar tidak memproses notifikasi profil kerja menggunakan metode DevicePolicyManager setPermittedCrossProfileNotificationListeners(). Aplikasi Anda masih menerima callback tentang notifikasi yang diposting di profil pribadi.

Menguji Kompatibilitas Aplikasi dengan Profil Kerja

Anda harus menguji aplikasi di lingkungan profil kerja untuk menemukan masalah yang akan menyebabkan aplikasi gagal di perangkat dengan profil kerja. Secara khusus, pengujian pada perangkat profil kerja merupakan cara yang baik untuk memastikan aplikasi Anda menangani intent dengan benar: tidak mengaktifkan intent yang tidak dapat ditangani, tidak melampirkan URI yang tidak berfungsi lintas profil, dan selanjutnya.

Kami telah menyediakan aplikasi contoh, TestDPC, yang dapat Anda gunakan untuk menyiapkan profil kerja di perangkat Android yang menjalankan Android 5.0 (API level 21) dan yang lebih tinggi. Aplikasi ini menawarkan cara sederhana untuk menguji aplikasi Anda di lingkungan profil kerja. Anda juga dapat menggunakan aplikasi ini untuk mengonfigurasi profil kerja sebagai berikut:

  • Menentukan aplikasi default yang tersedia di profil terkelola
  • Mengonfigurasi intent yang diizinkan untuk menyilang dari satu profil ke profil lainnya

Jika Anda menginstal aplikasi secara manual melalui kabel USB ke perangkat yang memiliki profil kerja, aplikasi akan diinstal di profil pribadi dan kerja. Setelah menginstal aplikasi, Anda dapat menguji aplikasi dalam kondisi berikut:

  • Jika intent biasanya ditangani oleh aplikasi default (misalnya, aplikasi kamera), coba nonaktifkan aplikasi default tersebut di profil kerja, dan pastikan aplikasi menanganinya dengan tepat.
  • Jika Anda memicu intent yang mengharapkannya ditangani oleh beberapa aplikasi lain, coba aktifkan dan nonaktifkan izin intent tersebut untuk berpindah dari satu profil ke profil lainnya. Verifikasi bahwa aplikasi berperilaku dengan baik dalam kedua situasi tersebut. Jika intent tidak diizinkan untuk berganti profil, verifikasi perilaku aplikasi saat ada pengendali yang sesuai di profil aplikasi, dan saat tidak ada. Misalnya, jika aplikasi Anda mengaktifkan intent terkait peta, coba setiap skenario berikut:
    • Perangkat memungkinkan intent peta menyilang dari satu profil ke profil lainnya, dan ada pengendali yang sesuai di profil lainnya (profil yang tidak digunakan aplikasi untuk berjalan)
    • Perangkat tidak mengizinkan intent peta berpindah antar-profil, tetapi ada pengendali yang sesuai di profil aplikasi
    • Perangkat tidak mengizinkan intent peta saling bersilangan antar-profil, dan tidak ada pengendali yang cocok untuk intent peta di profil perangkat
  • Jika Anda melampirkan konten ke suatu intent, pastikan intent tersebut berperilaku dengan baik saat ditangani di profil aplikasi maupun saat melintasi profil.

Uji profil kerja: tips dan trik

Ada beberapa trik yang mungkin berguna dalam pengujian di perangkat profil kerja.

  • Seperti yang telah disebutkan, saat Anda melakukan sideload aplikasi di perangkat profil kerja, aplikasi tersebut akan diinstal di kedua profil. Jika mau, Anda dapat menghapus aplikasi dari satu profil dan membiarkannya di profil lainnya.
  • Sebagian besar perintah pengelola aktivitas yang tersedia di shell Android Debug Bridge (adb) mendukung flag --user, yang memungkinkan Anda menentukan pengguna yang akan dijalankan. Dengan menentukan pengguna, Anda dapat memilih apakah akan dijalankan sebagai pengguna utama atau profil kerja yang tidak dikelola. Untuk informasi selengkapnya, lihat Perintah Shell ADB.
  • Untuk menemukan pengguna aktif di perangkat, gunakan perintah list users pengelola paket adb. Angka pertama dalam string output adalah ID pengguna, yang dapat Anda gunakan dengan flag --user. Untuk informasi selengkapnya, lihat Perintah ADB Shell.

Misalnya, untuk menemukan pengguna di perangkat, Anda harus menjalankan perintah ini:

$ adb shell pm list users
UserInfo{0:Drew:13} running
UserInfo{10:Work profile:30} running

Dalam hal ini, pengguna utama("Drew") memiliki ID pengguna 0, dan profil kerja memiliki ID pengguna 10. Untuk menjalankan aplikasi di profil kerja, Anda akan menggunakan perintah seperti ini:

$ adb shell am start --user 10 \
-n "com.example.myapp/com.example.myapp.testactivity" \
-a android.intent.action.MAIN -c android.intent.category.LAUNCHER