Управление ролями приложений

Функция ролей приложений позволяет ИТ-администратору предоставлять особые привилегии управляемому приложению на устройстве Android. Назначив определённую роль, можно освободить приложение от ограничений по питанию и фоновому режиму, приостановки работы, гибернации (на Android 14+), а также отключить пользовательские элементы управления (включая такие действия пользователя, как принудительная остановка и очистка данных приложения) (на Android 11+), что позволит приложению выполнять свои критически важные функции без прерывания работы. Кроме того, приложение может получать уведомления о назначенных ему ролях, что позволяет ему загружать приложение без вмешательства пользователя.

Предпосылки

Устройство управляется EMM на базе AMAPI (EMM, использующие пользовательский DPC, не поддерживаются).

Подготовьте свое приложение к использованию этой функции

Интеграция с AMAPI SDK требуется только в том случае, если приложение хочет получать уведомления о назначенных ему ролях, что позволяет ему выполнять самозагрузку (т. е. автоматически запускаться без взаимодействия с пользователем).

Интегрируйте AMAPI SDK в свое приложение

Более подробную информацию об AMAPI SDK и о том, как добавить его в свое приложение, можно найти в руководстве по интеграции AMAPI SDK .

Добавьте необходимые метаданные в манифест приложения.

Службе Android Device Policy (ADP) необходимо знать ComponentName вашего класса, реализующего NotificationReceiverService , чтобы уведомлять ваше приложение о назначенных ролях. Необходимо соответствующим образом тегировать службу в AndroidManifest.xml , чтобы ADP автоматически её обнаруживал.

  • В вашем приложении должна быть только одна enabled служба с meta-data , у которых android:name равен com.google.android.managementapi.notification.NotificationReceiverService.SERVICE_APP_ROLES .
  • Для этой службы android:exported должен быть установлен в true
  • Значение android:value meta-data должно быть равно пустой строке.
<service
 android:name=".MyNotificationReceiverService"
 android:exported="true">
    <meta-data android:name="com.google.android.managementapi.notification.NotificationReceiverService.SERVICE_APP_ROLES" android:value="" />
</service>

Если вы тестируете роль COMPANION_APP , вам также следует добавить следующие meta-data в вашу службу, чтобы Android Device Policy могла отправлять обновления статуса локальных команд в ваше приложение:

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

Создайте службу, расширяющую NotificationReceiverService (или обновите существующую)

Создайте или обновите существующий NotificationReceiverService и реализуйте AppRolesListener для прослушивания ролей, назначенных вашему приложению. Для прослушивания ролей, назначенных вашему приложению, требуется только getAppRolesListener() . Если вашему приложению назначена роль COMPANION_APP , необходимо также реализовать 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"
  }
}

Ваше приложение может получать уведомления несколько раз, если его роли меняются несколько раз. Если все роли будут удалены, ваше приложение по-прежнему будет получать уведомления с пустым списком ролей. Это уведомление выведет ваше приложение из состояния остановки, и, благодаря предоставленным ему исключениям, оно сможет загрузиться без взаимодействия с пользователем. Благодаря уведомлениям и исключениям о ролях приложения ваше приложение может прослушивать широковещательные сообщения ACTION_BOOT_COMPLETED . Если загрузка вашего приложения зависит от управляемых конфигураций, о том, как читать и прослушивать изменения, см. раздел Настройка управляемых конфигураций .

Предоставьте устройству политики ролей приложений

Разработчики приложений могут протестировать назначение ролей приложениям, используя EMM или следуя краткому руководству по API управления Android . Блокнот AMAPI Colab позволяет зарегистрировать предприятие, создать политику и подготовить устройство.

Установите политику для своего приложения с помощью ролей приложения

Настройте policy с ролями приложения, которые должно иметь ваше приложение, с помощью ApplicationPolicy.roles .

В следующем примере показано, как настроить роль для приложений MTD:

{
  "applications": [

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

Перед назначением ролей, указанных в политике, система проверит, совпадает ли отпечаток сертификата ключа подписи приложения на устройстве с отпечатком в Play Маркете. Если отпечаток отличается, роли приложению не будут назначены, а в EMM будет отправлено уведомление о несоответствии NonComplianceReason.APP_SIGNING_CERT_MISMATCH .

{
  "applications": [

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

Если ваше приложение имеет управляемую конфигурацию, ИТ-администратор может настроить начальную конфигурацию для соответствующих restriction в политике приложения:

{
  "applications": [

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