Gestire i ruoli dell'applicazione

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 abbia meta-data con android:name uguale a com.google.android.managementapi.notification.NotificationReceiverService.SERVICE_APP_ROLES
  • Questo servizio deve avere android:exported impostato su true
  • Il android:value di meta-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>"
      }
    }
  ]
}