Функция ролей приложений позволяет ИТ-администратору предоставлять особые привилегии управляемому приложению на устройстве 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>"
}
}
]
}