La funzionalità dei ruoli applicazione consente a un amministratore IT di concedere privilegi speciali a un'applicazione gestita su un dispositivo Android. Assegnando un ruolo specifico, un'app può essere esentata dalle limitazioni di alimentazione e in background, dalla sospensione, dall'ibernazione (su Android 14 e versioni successive) e avere i controlli utente (ovvero include azioni utente come l'interruzione forzata e la cancellazione dei dati dell'app) disattivati (su Android 11 e versioni successive), consentendole di svolgere la sua funzione critica senza interruzioni. Inoltre, l'app può ricevere una notifica dei ruoli assegnati, il che le consente di eseguire il bootstrap senza l'intervento dell'utente.
Prerequisiti
Il dispositivo è gestito da un EMM basato sull'API Android Management (gli EMM che utilizzano un DPC personalizzato non sono supportati).
Preparare l'app per l'utilizzo della funzionalità
L'integrazione con l'SDK AMAPI è necessaria solo se l'app vuole ricevere una notifica dei ruoli assegnati che le consentono di avviarsi automaticamente (ovvero l'avvio automatico senza interazione dell'utente).
Eseguire l'integrazione con l'SDK AMAPI nella tua app
Per saperne di più sull'SDK AMAPI e su come aggiungerlo alla tua app, consulta la guida all'integrazione dell'SDK AMAPI.
Aggiungere i metadati richiesti al manifest dell'app
Android Device Policy (ADP) deve conoscere l'ComponentName
della tua classe
che implementa NotificationReceiverService
per comunicare alla tua app i ruoli
assegnati. Devi taggare il tuo servizio in AndroidManifest.xml
in modo appropriato
affinché possa essere rilevato automaticamente da ADP.
- La tua app deve avere esattamente un servizio che sia
enabled
e abbiameta-data
conandroid:name
uguale acom.google.android.managementapi.notification.NotificationReceiverService.SERVICE_APP_ROLES
- Questo servizio deve avere
android:exported
impostato sutrue
- Il
android:value
dimeta-data
deve essere impostato su una stringa vuota
<service
android:name=".MyNotificationReceiverService"
android:exported="true">
<meta-data android:name="com.google.android.managementapi.notification.NotificationReceiverService.SERVICE_APP_ROLES" android:value="" />
</service>
Se stai testando il ruolo COMPANION_APP
, devi anche aggiungere il seguente
meta-data
al tuo servizio in modo che Android Device Policy possa inviare aggiornamenti di stato dei comandi locali alla tua app:
<meta-data android:name="com.google.android.managementapi.notification.NotificationReceiverService.SERVICE_COMMAND_STATUS" android:value="" />
Crea un servizio che estenda NotificationReceiverService (o aggiorna quello esistente)
Crea o aggiorna il tuo NotificationReceiverService
esistente e implementa un
AppRolesListener
per rilevare i ruoli assegnati alla tua app. Per rilevare i ruoli assegnati alla tua
app è necessario solo getAppRolesListener()
. Se alla tua app viene assegnato un ruolo COMPANION_APP
, devi implementare anche
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"
}
}
La tua app può ricevere più notifiche se i suoi ruoli cambiano più volte. Se
vengono rimossi tutti i ruoli, l'app riceverà comunque una notifica con un elenco vuoto di
ruoli. Questa notifica farà uscire l'app dallo stato di arresto e, insieme
alle esenzioni concesse per l'app, l'app potrà avviarsi senza alcuna
interazione dell'utente. Grazie alle notifiche e alle esenzioni dei ruoli dell'app, la tua app
può ascoltare le trasmissioni ACTION_BOOT_COMPLETED
. Se la tua app dipende
dalle configurazioni gestite per l'avvio automatico, consulta
Configurare le configurazioni gestite per scoprire come leggere e ascoltare
le modifiche.
Esegui il provisioning del dispositivo con i criteri dei ruoli delle app
Gli sviluppatori di app possono testare l'assegnazione di ruoli app alla propria applicazione utilizzando un EMM o seguendo la guida rapida all'API Android Management. Il notebook Colab AMAPI ti consente di registrare un'azienda, creare un criterio e eseguire il provisioning di un dispositivo.
Impostare i criteri per l'app con i ruoli app
Configura un policy
con i ruoli app che la tua app deve avere utilizzando
ApplicationPolicy.roles
.
L'esempio seguente mostra come configurare il ruolo per le app MTD:
{
"applications": [
{
"packageName": "com.example.mtd",
"installType": "FORCE_INSTALLED",
"roles": [
{ "roleType": "MOBILE_THREAT_DEFENSE_ENDPOINT_DETECTION_RESPONSE" }
]
}
]
}
Prima di assegnare i ruoli come specificato nelle norme, il sistema verificherà che
l'impronta del certificato della chiave di firma dell'app sul dispositivo corrisponda a quella del
Play Store.
Se l'impronta è diversa, i ruoli non verranno assegnati all'app e NonComplianceReason.APP_SIGNING_CERT_MISMATCH
verrà segnalata la mancata conformità all'EMM.
{
"applications": [
{
"packageName": "com.example.mtd",
"installType": "FORCE_INSTALLED",
"signingKeyCerts": [
{ "signingKeyCertFingerprintSha256": "base64-encoded-sha256" }
],
"roles": [
{ "roleType": "MOBILE_THREAT_DEFENSE_ENDPOINT_DETECTION_RESPONSE" }
]
}
]
}
Se la tua app ha una configurazione gestita, l'amministratore IT può impostare una configurazione iniziale per i restriction
pertinenti nelle norme dell'applicazione:
{
"applications": [
{
"packageName": "com.example.mtd",
"installType": "FORCE_INSTALLED",
"roles": [
{ "roleType": "MOBILE_THREAT_DEFENSE_ENDPOINT_DETECTION_RESPONSE" }
],
"managedConfiguration": {
"<key>": "<value>"
}
}
]
}