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 tengameta-data
conandroid:name
igual acom.google.android.managementapi.notification.NotificationReceiverService.SERVICE_APP_ROLES
. - Este servicio debe tener
android:exported
establecido entrue
. - El
android:value
delmeta-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 restriction
s 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>"
}
}
]
}