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 mengizinkan pengguna untuk menggunakan aplikasi dan profil pribadi mereka.

Tutorial ini menunjukkan cara memodifikasi aplikasi Anda agar dapat berfungsi dengan andal di 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 yang memiliki profil kerja. Dokumen ini menyoroti masalah yang perlu Anda ketahui.

Ringkasan

Pengguna sering kali ingin menggunakan perangkat pribadi mereka dalam lingkungan perusahaan. Situasi ini dapat menimbulkan dilema bagi organisasi. Jika pengguna dapat menggunakan perangkatnya sendiri, organisasi harus khawatir jika 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 kontrol admin IT. Admin IT dapat memilih aplikasi 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 memicu intent, tidak ada pengendali untuk intent tersebut pada profil tersebut, dan intent tidak diizinkan untuk berpindah ke profil lain karena pembatasan profil, permintaan akan gagal dan aplikasi mungkin mati secara tiba-tiba.
  • Admin IT profil dapat membatasi aplikasi sistem yang tersedia di profil kerja. Pembatasan ini juga dapat menyebabkan tidak adanya pengendali untuk beberapa intent umum pada profil kerja.
  • Karena profil pribadi dan kerja memiliki area penyimpanan terpisah, URI file yang valid di satu profil tidak akan valid di profil lainnya. Intent apa pun 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

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

Admin profil dapat memilih intent mana 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. 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 me-resolve 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 bagi aplikasi lain ke filenya sendiri. Misalnya, aplikasi galeri gambar mungkin ingin membagikan gambarnya dengan editor gambar. Ada dua cara untuk membagikan file: dengan URI file atau URI konten.

URI file dimulai dengan awalan file:, diikuti dengan jalur absolut file 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 intent, dan intent tersebut ditangani di profil lain, pengendali tidak 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 tersebut. Anda dapat membuat Content ID untuk file apa pun menggunakan FileProvider. Kemudian, Anda dapat membagikan ID konten tersebut ke aplikasi lain (bahkan di profil lain). 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 mengetahui informasi selengkapnya tentang berbagi file dengan URI konten, lihat Berbagi File.

Mendengarkan notifikasi

Aplikasi biasanya menyediakan subclass NotificationListenerService untuk menerima callback dari sistem terkait 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 Anda. 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 diizinkan untuk memproses perubahan notifikasi. Selanjutnya, sistem 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 mungkin memblokir aplikasi Anda 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 mengetahui 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 antar-profil, dan seterusnya.

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 baru. 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 mana yang tersedia di profil terkelola
  • Mengonfigurasi intent yang diizinkan untuk berpindah 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 profil kerja. Setelah menginstal aplikasi, Anda dapat menguji aplikasi dalam kondisi berikut:

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

Menguji profil kerja: tips dan trik

Ada beberapa trik yang mungkin berguna bagi Anda dalam melakukan 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 mana 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 akan 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