Administra los roles de la aplicación

La función de roles de aplicación permite que un administrador de TI otorgue privilegios especiales a una aplicación administrada en un dispositivo con Android. Si se le asigna un rol específico, se puede eximir a una app de las restricciones de energía y en segundo plano, la suspensión, la hibernación (en Android 14 y versiones posteriores) y se pueden inhabilitar los controles del usuario (es decir, se incluyen acciones del usuario, como detener la app de forma forzada y borrar los datos de la app) (en Android 11 y versiones posteriores), lo que permite que realice su función crítica sin interrupciones. Además, la app puede recibir notificaciones sobre los roles que se le asignaron, lo que le permite inicializarse sin intervención del usuario.

Requisitos previos

El dispositivo está administrado por un EMM basado en la AMAPI (no se admiten EMM que usen un DPC personalizado).

Prepara tu app para usar la función

La integración con el SDK de AMAPI solo es necesaria si la app desea recibir notificaciones sobre los roles que se le asignaron, lo que le permite inicializarse (es decir, iniciarse automáticamente sin interacción del usuario).

Integra el SDK de la AMAPI en tu app

Puedes encontrar más información sobre el SDK de la AMAPI y cómo agregarlo a tu app en la guía de integración del SDK de la AMAPI.

Agrega los metadatos requeridos al manifiesto de la app

Android Device Policy (ADP) necesita conocer el ComponentName de tu clase, que implementa NotificationReceiverService para notificar a tu app sobre sus roles asignados. Debes etiquetar tu servicio en AndroidManifest.xml de forma adecuada para que ADP lo pueda detectar automáticamente.

  • Tu app debe tener exactamente un servicio que sea enabled y que tenga meta-data con android:name igual a com.google.android.managementapi.notification.NotificationReceiverService.SERVICE_APP_ROLES.
  • Este servicio debe tener android:exported establecido en true.
  • El android:value del meta-data debe establecerse en una cadena vacía.
<service
 android:name=".MyNotificationReceiverService"
 android:exported="true">
    <meta-data android:name="com.google.android.managementapi.notification.NotificationReceiverService.SERVICE_APP_ROLES" android:value="" />
</service>

Si estás probando el rol de COMPANION_APP, también debes agregar el siguiente meta-data a tu servicio para que Android Device Policy pueda enviar actualizaciones locales del estado de los comandos a tu app:

<meta-data android:name="com.google.android.managementapi.notification.NotificationReceiverService.SERVICE_COMMAND_STATUS" android:value="" />

Crea un servicio que extienda NotificationReceiverService (o actualiza el existente)

Crea o actualiza tu NotificationReceiverService existente y, luego, implementa un AppRolesListener para detectar los roles asignados a tu app. Solo se requiere getAppRolesListener() para detectar los roles asignados a tu app. Si a tu app se le asigna un rol de COMPANION_APP, también debes implementar 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"
  }
}

Se puede notificar a tu app varias veces si sus roles cambian varias veces. Si se quitan todos los roles, tu app seguirá recibiendo notificaciones con una lista de roles vacía. Esta notificación sacará a tu app del estado detenido y, junto con las exenciones otorgadas para tu app, esta podrá inicializarse sin ninguna interacción del usuario. Gracias a las notificaciones y exenciones de roles de la app, tu app puede escuchar transmisiones de ACTION_BOOT_COMPLETED. Si tu app depende de sus configuraciones administradas para inicializarse, consulta Cómo configurar configuraciones administradas para obtener información sobre cómo leer y escuchar los cambios.

Aprovisiona el dispositivo con políticas de roles de la app

Los desarrolladores de apps pueden probar la asignación de roles de la app a su aplicación con un EMM o siguiendo la guía de inicio rápido de la API de Android Management. El notebook de Colab de la AMAPI te permite inscribir una empresa, crear una política y aprovisionar un dispositivo.

Cómo establecer la política de tu app con roles de la app

Configura un policy con los roles de la app que esta debe tener con ApplicationPolicy.roles.

En el siguiente ejemplo, se muestra cómo configurar el rol para las apps de MTD:

{
  "applications": [

    {
      "packageName": "com.example.mtd",
      "installType": "FORCE_INSTALLED",
      "roles": [
        { "roleType": "MOBILE_THREAT_DEFENSE_ENDPOINT_DETECTION_RESPONSE" }
      ]
    }
  ]
}

Antes de asignar los roles según lo especificado en la política, el sistema verificará que la huella digital del certificado de la clave de firma de la app en el dispositivo coincida con la de Play Store. Si la huella digital es diferente, no se asignarán los roles a la app y se informará el incumplimiento de NonComplianceReason.APP_SIGNING_CERT_MISMATCH al EMM.

{
  "applications": [

    {
      "packageName": "com.example.mtd",
      "installType": "FORCE_INSTALLED",
      "signingKeyCerts": [
         { "signingKeyCertFingerprintSha256": "base64-encoded-sha256" }
       ],
      "roles": [
        { "roleType": "MOBILE_THREAT_DEFENSE_ENDPOINT_DETECTION_RESPONSE" }
      ]
    }
  ]
}

Si tu app tiene configuración administrada, el administrador de TI puede establecer una configuración inicial para los restrictions pertinentes en la política de la aplicación:

{
  "applications": [

    {
      "packageName": "com.example.mtd",
      "installType": "FORCE_INSTALLED",
      "roles": [
        { "roleType": "MOBILE_THREAT_DEFENSE_ENDPOINT_DETECTION_RESPONSE" }
      ],
      "managedConfiguration": {
        "<key>": "<value>"
      }
    }
  ]
}