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 tenhameta-data
comandroid:name
igual acom.google.android.managementapi.notification.NotificationReceiverService.SERVICE_APP_ROLES
- O serviço precisa ter
android:exported
definido comotrue
. - O
android:value
dometa-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 restriction
s 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>"
}
}
]
}