Gerenciar funções de aplicativos

Com o recurso de funções de aplicativo, um administrador de TI pode conceder privilégios especiais a um aplicativo gerenciado em um dispositivo Android. Ao atribuir uma função específica, um app pode ser isento de restrições de energia e segundo plano, suspensão, hibernação (no Android 14 ou mais recente) e ter controles do usuário (ou seja, inclui ações do usuário, como interrupção forçada e limpeza de dados do app) desativados (no Android 11 ou mais recente), permitindo que ele execute sua função crítica sem interrupção. Além disso, o app pode ser notificado sobre as funções atribuídas, o que permite que ele se inicialize sem intervenção do usuário.

Pré-requisitos

O dispositivo é gerenciado por um EMM baseado na AMAPI. Não há suporte para EMMs que usam um DPC personalizado.

Preparar o app para usar o recurso

A integração com o SDK da AMAPI só é necessária se o app quiser ser notificado das funções atribuídas a ele, o que permite a inicialização automática (ou seja, o lançamento automático sem interação do usuário).

Integrar com o SDK da AMAPI no seu app

Para mais informações sobre o SDK da AMAPI e como adicioná-lo ao seu app, consulte o guia de integração do SDK da AMAPI.

Adicionar os metadados necessários ao manifesto do app

O Android Device Policy (ADP) precisa saber o ComponentName da sua classe que implementa NotificationReceiverService para notificar o app sobre as funções atribuídas. É preciso marcar seu serviço em AndroidManifest.xml adequadamente para que ele possa ser descoberto automaticamente pelo ADP.

  • O app precisa ter exatamente um serviço que seja enabled e tenha meta-data com android:name igual a com.google.android.managementapi.notification.NotificationReceiverService.SERVICE_APP_ROLES
  • O serviço precisa ter android:exported definido como true.
  • O android:value do meta-data precisa ser definido como uma string vazia.
<service
 android:name=".MyNotificationReceiverService"
 android:exported="true">
    <meta-data android:name="com.google.android.managementapi.notification.NotificationReceiverService.SERVICE_APP_ROLES" android:value="" />
</service>

Se você estiver testando a função COMPANION_APP, adicione também a seguinte meta-data ao seu serviço para que o Android Device Policy possa enviar atualizações de status de comando local ao seu app:

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

Criar um serviço que estenda NotificationReceiverService (ou atualizar o existente)

Crie ou atualize seu NotificationReceiverService atual e implemente um AppRolesListener para detectar papéis atribuídos ao seu app. Apenas getAppRolesListener() é necessário para detectar papéis atribuídos ao seu app. Se o app receber um papel COMPANION_APP, implemente também 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"
  }
}

Seu app pode receber várias notificações se as funções mudarem várias vezes. Se todas as funções forem removidas, o app ainda vai receber uma notificação com uma lista vazia de funções. Essa notificação vai tirar o app do estado parado e, junto com as isenções concedidas, ele poderá se inicializar sem qualquer interação do usuário. Graças à notificação e às exenções de papéis do app, ele pode detectar transmissões ACTION_BOOT_COMPLETED. Se o app depender das configurações gerenciadas para inicializar, consulte Configurar configurações gerenciadas para saber como ler e detectar mudanças.

Provisionar o dispositivo com políticas de funções do app

Os desenvolvedores de apps podem testar a atribuição de funções ao aplicativo usando um EMM ou seguindo o guia de início rápido da API Android Management. Com o notebook do Colab da AMAPI, é possível registrar uma empresa,criar uma política e provisionar um dispositivo.

Definir a política do app com funções de app

Configure um policy com as funções que seu app deve ter usando o ApplicationPolicy.roles.

O exemplo a seguir mostra como configurar a função para apps de MTD:

{
  "applications": [

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

Antes de atribuir as funções conforme especificado na política, o sistema vai verificar se a impressão digital do certificado da chave de assinatura do app no dispositivo corresponde à da Play Store. Se o fingerprint for diferente, as funções não serão atribuídas ao app e a não conformidade com NonComplianceReason.APP_SIGNING_CERT_MISMATCH será informada ao EMM.

{
  "applications": [

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

Se o app tiver uma configuração gerenciada, o admin de TI poderá definir uma configuração inicial para os restrictions relevantes na política do aplicativo:

{
  "applications": [

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