Fitur peran aplikasi memungkinkan admin IT memberikan hak istimewa khusus kepada aplikasi terkelola di perangkat yang didukung Android. Dengan menetapkan peran tertentu, aplikasi dapat dikecualikan dari pembatasan daya dan latar belakang, penangguhan, hibernasi (di Android 14+) dan menonaktifkan kontrol pengguna (yaitu mencakup tindakan pengguna seperti menghentikan paksa dan menghapus data aplikasi) (di Android 11+), sehingga aplikasi dapat menjalankan fungsi pentingnya tanpa gangguan. Selain itu, aplikasi dapat diberi tahu tentang peran yang ditetapkan, sehingga dapat melakukan bootstrap sendiri tanpa intervensi pengguna.
Untuk mengetahui daftar peran aplikasi yang tersedia dan hak istimewa khusus yang diberikan ke
setiap peran, lihat RoleType.
Prasyarat
Perangkat dikelola oleh EMM berbasis AMAPI (EMM yang menggunakan DPC kustom tidak didukung).
Menyiapkan aplikasi untuk menggunakan fitur
Integrasi dengan AMAPI SDK hanya diperlukan jika aplikasi ingin diberi tahu tentang peran yang ditetapkan, yang memungkinkannya melakukan bootstrap sendiri (yaitu, peluncuran otomatis tanpa interaksi pengguna).
Mengintegrasikan dengan AMAPI SDK di aplikasi Anda
Anda dapat menemukan informasi selengkapnya tentang AMAPI SDK dan cara menambahkannya ke aplikasi di panduan integrasi AMAPI SDK.
Menambahkan metadata yang diperlukan ke manifes aplikasi
Android Device Policy (ADP) perlu mengetahui ComponentName class Anda
yang mengimplementasikan NotificationReceiverService untuk memberi tahu aplikasi Anda tentang
peran yang ditetapkan. Anda harus memberi tag pada layanan di AndroidManifest.xml dengan tepat agar
dapat ditemukan secara otomatis oleh ADP.
- Aplikasi Anda harus memiliki tepat satu layanan yang merupakan
enableddan memilikimeta-datadenganandroid:namesama dengancom.google.android.managementapi.notification.NotificationReceiverService.SERVICE_APP_ROLES - Layanan ini harus memiliki
android:exportedyang ditetapkan ketrue android:valuedarimeta-dataharus ditetapkan ke string kosong
<service
android:name=".MyNotificationReceiverService"
android:exported="true">
<meta-data android:name="com.google.android.managementapi.notification.NotificationReceiverService.SERVICE_APP_ROLES" android:value="" />
</service>
Jika Anda menguji peran COMPANION_APP, Anda juga harus menambahkan meta-data berikut ke layanan Anda agar kebijakan perangkat Android dapat mengirim update status perintah lokal ke aplikasi Anda:
<meta-data android:name="com.google.android.managementapi.notification.NotificationReceiverService.SERVICE_COMMAND_STATUS" android:value="" />
Buat layanan yang memperluas NotificationReceiverService (atau perbarui yang sudah ada)
Buat atau perbarui NotificationReceiverService yang ada dan terapkan
AppRolesListener untuk memproses peran yang ditetapkan ke aplikasi Anda. Hanya
getAppRolesListener() yang diperlukan untuk memproses peran yang ditetapkan ke
aplikasi Anda. Jika aplikasi Anda diberi peran COMPANION_APP, Anda juga harus menerapkan
getCommandListener():
import android.util.Log
import com.google.android.managementapi.approles.AppRolesListener
import com.google.android.managementapi.approles.model.AppRolesSetRequest
import com.google.android.managementapi.approles.model.AppRolesSetResponse
import com.google.android.managementapi.commands.CommandListener
import com.google.android.managementapi.commands.model.Command
import com.google.android.managementapi.notification.NotificationReceiverService
class MyNotificationReceiverService : NotificationReceiverService() {
// If your app wants to listen for roles assigned
override fun getAppRolesListener(): AppRolesListener =
object : AppRolesListener {
override fun onAppRolesSet(request: AppRolesSetRequest): AppRolesSetResponse {
val roleTypes = request.roles.map { role -> role.roleType }
Log.i(TAG, "onAppRolesSet: $roleTypes")
return AppRolesSetResponse.getDefaultInstance()
}
}
// If your app wants to listen for local command status updates
// Only relevant for COMPANION_APP role
override fun getCommandListener(): CommandListener {
return object : CommandListener {
override fun onCommandStatusChanged(command: Command) {
Log.i(TAG, "onCommandStatusChanged")
}
}
}
private companion object {
const val TAG = "MyNotificationReceiverService"
}
}
Aplikasi Anda dapat diberi tahu beberapa kali jika perannya berubah beberapa kali. Jika
semua peran dihapus, aplikasi Anda akan tetap diberi tahu dengan daftar peran
yang kosong. Notifikasi ini akan mengeluarkan aplikasi Anda dari status dihentikan dan bersama dengan
pengecualian yang diberikan untuk aplikasi Anda, aplikasi Anda dapat melakukan bootstrap sendiri tanpa
interaksi pengguna. Berkat notifikasi dan pengecualian peran aplikasi, aplikasi Anda
dapat memproses siaran ACTION_BOOT_COMPLETED. Jika aplikasi Anda bergantung pada
konfigurasi terkelolanya untuk melakukan bootstrap, lihat
Menyiapkan konfigurasi terkelola tentang cara membaca dan memproses
perubahan.
Mulai AMAPI SDK 1.9.0, setiap peran dalam
AppRolesSetRequest juga menyertakan Role.ExtraCapabilities yang diberikan admin
IT dalam kebijakan. Misalnya, aplikasi pendamping dapat memeriksa apakah
aplikasi tersebut diizinkan untuk mengeluarkan perintah penghapusan total lokal:
import com.google.android.managementapi.approles.model.AppRolesSetRequest
import com.google.android.managementapi.approles.model.AppRolesSetResponse
import com.google.android.managementapi.common.model.Role
...
override fun onAppRolesSet(request: AppRolesSetRequest): AppRolesSetResponse {
val canWipeLocally =
request.roles.any { role ->
role.roleType == Role.RoleType.COMPANION_APP &&
role.extraCapabilities.localDeviceWipeCommand ==
Role.ExtraCapabilities.LocalDeviceWipeCommand.LOCAL_DEVICE_WIPE_COMMAND_ALLOWED
}
Log.i(TAG, "onAppRolesSet: canWipeLocally=$canWipeLocally")
return AppRolesSetResponse.getDefaultInstance()
}
Hanya admin IT yang dapat memberikan kemampuan tambahan. Jika Anda menetapkan extraCapabilities
pada peran yang Anda teruskan ke EnvironmentClient, panggilan akan gagal dengan
InvalidArgumentException.
Menyediakan perangkat dengan kebijakan peran aplikasi
Developer aplikasi dapat menguji penetapan peran aplikasi ke aplikasi mereka menggunakan EMM atau mengikuti panduan memulai Android Management API. Notebook Colab AMAPI memungkinkan Anda mendaftarkan perusahaan, membuat kebijakan,dan menyediakan perangkat.
Menetapkan kebijakan untuk aplikasi Anda dengan peran aplikasi
Siapkan policy dengan peran aplikasi yang dimaksudkan untuk aplikasi Anda menggunakan
ApplicationPolicy.roles.
Contoh berikut menunjukkan cara mengonfigurasi peran untuk aplikasi MTD:
{
"applications": [
{
"packageName": "com.example.mtd",
"installType": "FORCE_INSTALLED",
"roles": [
{ "roleType": "MOBILE_THREAT_DEFENSE_ENDPOINT_DETECTION_RESPONSE" }
]
}
]
}
Hanya peran COMPANION_APP yang mendukung
extraCapabilities. Untuk mengizinkan aplikasi pendamping
menghapus total perangkat atau profil kerja secara lokal, tetapkan
extraCapabilities.localDeviceWipeCommand ke
LOCAL_DEVICE_WIPE_COMMAND_ALLOWED untuk peran tersebut.
Sebelum menetapkan peran seperti yang ditentukan dalam kebijakan, sistem akan memeriksa apakah
sidik jari sertifikat kunci penandatanganan aplikasi di perangkat cocok dengan yang ada di
Google Play Store.
Jika sidik jari berbeda, peran tidak akan ditetapkan ke
aplikasi dan ketidakpatuhan NonComplianceReason.APP_SIGNING_CERT_MISMATCH
akan dilaporkan ke EMM.
{
"applications": [
{
"packageName": "com.example.mtd",
"installType": "FORCE_INSTALLED",
"signingKeyCerts": [
{ "signingKeyCertFingerprintSha256": "base64-encoded-sha256" }
],
"roles": [
{ "roleType": "MOBILE_THREAT_DEFENSE_ENDPOINT_DETECTION_RESPONSE" }
]
}
]
}
Jika aplikasi Anda memiliki konfigurasi terkelola, admin IT dapat menyiapkan konfigurasi awal untuk restriction yang relevan dalam kebijakan aplikasi:
{
"applications": [
{
"packageName": "com.example.mtd",
"installType": "FORCE_INSTALLED",
"roles": [
{ "roleType": "MOBILE_THREAT_DEFENSE_ENDPOINT_DETECTION_RESPONSE" }
],
"managedConfiguration": {
"<key>": "<value>"
}
}
]
}
Memverifikasi Status Pengecualian Baterai
Aplikasi dengan peran Mobile Threat Defense (MTD) otomatis dikecualikan dari pembatasan daya latar belakang standar. Namun, pengecualian ini diterapkan oleh Bucket Aplikasi Standby, bukan Daftar yang Diizinkan untuk Penggunaan Daya sistem.
Untuk memverifikasi apakah pengecualian aplikasi aktif:
import android.app.usage.UsageStatsManager
import android.content.Context
// UsageStatsManager.STANDBY_BUCKET_EXEMPTED is annotated as a @SystemApi. We can redefine it for clarity.
// Define this at the top level of your file, or inside a companion object
private const val STANDBY_BUCKET_EXEMPTED = 5
private fun isAppExemptedFromAppStandbyBucket(): Boolean =
(getSystemService(Context.USAGE_STATS_SERVICE) as? UsageStatsManager)
?.appStandbyBucket == STANDBY_BUCKET_EXEMPTED