Este guia descreve como desenvolver um controlador de políticas de dispositivo (DPC, na sigla em inglês) para dispositivos em uma implantação do Android Enterprise. Um app DPC, antes conhecido como controlador de políticas de trabalho, controla políticas de dispositivos locais e aplicativos do sistema em dispositivos.
Sobre DPCs
Em uma implantação do Android Enterprise, uma empresa mantém o controle sobre vários aspectos dos dispositivos dos usuários, como isolar informações relacionadas ao trabalho dos dados pessoais dos usuários, pré-configurar apps aprovados para o ambiente ou desativar recursos do dispositivo (por exemplo, a câmera).
Como EMM, você desenvolve um app DPC que pode ser usado pelos clientes em conjunto com o console e o servidor de EMM. O cliente implanta o DPC nos dispositivos dos usuários que ele gerencia. A DPC atua como ponte entre o console (e o servidor) de EMM e o dispositivo. Um administrador usa o console de EMM para realizar várias tarefas, incluindo configurar apps e definições do dispositivo.
O DPC cria e gerencia o perfil de trabalho no dispositivo em que ele está instalado. O perfil de trabalho criptografa as informações relacionadas ao trabalho e as mantém separadas dos apps e dados pessoais dos usuários. Antes de criar o perfil de trabalho, o DPC também pode provisionar uma conta do Google Play gerenciado para uso no dispositivo.
Este guia mostra como desenvolver uma DPC que pode criar e gerenciar perfis de trabalho.
Biblioteca de suporte a DPC para EMMs
A biblioteca de suporte a DPC para EMMs inclui classes de utilidade e de ajuda que facilitam o provisionamento e o gerenciamento de dispositivos Android em um ambiente empresarial. A biblioteca permite aproveitar recursos importantes nos apps de DPC:
- Suporte ao provisionamento de contas do Google Play gerenciado: para provisionar contas do Google Play gerenciado no app DPC, os apps do Google Play e do Google Play Services precisam atender aos requisitos mínimos de versão. No entanto, atualizar esses apps pode ser complexo. A biblioteca de suporte do DPC atualiza esses apps e garante a compatibilidade com atualizações futuras do processo de provisionamento de contas gerenciadas do Google Play. Consulte Suporte para provisionamento de contas do Google Play gerenciado para mais detalhes.
- Suporte a configurações gerenciadas: usar a API EMM do Google Play para processar configurações gerenciadas de apps aprovados é a maneira mais fácil de implementar configurações gerenciadas no seu DPC. A biblioteca de suporte a DPC permite delegar ao Google Play a tarefa de aplicar configurações gerenciadas (antigas restrições de apps) definidas pelo administrador usando o console de EMM. Usar a API EMM do Google Play para processar configurações gerenciadas permite que a configuração do app seja aplicada de forma atômica durante a instalação. Consulte Aplicar configurações gerenciadas a apps de trabalho para mais informações sobre como ativar esse recurso no seu DPC.
Siga as etapas abaixo para fazer o download da biblioteca. As tarefas detalhadas neste guia pressupõem o uso da Biblioteca de Suporte do DPC.
Fazer o download da Biblioteca de Suporte do DPC
Para usar a Biblioteca de Suporte do DPC, faça o download dela na comunidade de provedores de EMM do Android Enterprise. Você precisa adicionar a biblioteca ao arquivo build.gradle e cuidar de outras dependências ao criar o app DPC. Por exemplo, a biblioteca exige a biblioteca de cliente de autenticação do Google Play Services 11.4.0.
- Adicione a biblioteca ao arquivo
build.gradle:
Groovy
implementation(name:'dpcsupport-yyyymmdd', ext:'aar')
Kotlin
implementation(name = "dpcsupport-yyyymmdd", ext = "aar")
- Adicione a
biblioteca de cliente de autenticação do Google Play Services 11.4.0 ao arquivo build.gradle:
Groovy
implementation 'com.google.android.gms:play-services-auth:11.4.0'
Kotlin
implementation("com.google.android.gms:play-services-auth:11.4.0")
A biblioteca exige determinadas permissões para ser executada. Por isso, adicione-as ao manifesto do app DPC ao fazer upload para o Google Play:
<uses-permission android:name= "android.permission.DOWNLOAD_WITHOUT_NOTIFICATION"/> <uses-permission android:name= "android.permission.GET_ACCOUNTS"/> <uses-permission android:name= "android.permission.MANAGE_ACCOUNTS"/> <uses-permission android:name= "android.permission.WRITE_SYNC_SETTINGS"/> <uses-permission android:name= "com.google.android.providers.gsf.permission.READ_GSERVICES"/>
Além dessas etapas preliminares de configuração e implantação, você também precisa inicializar a funcionalidade específica da biblioteca no código do DPC, dependendo da capacidade que você quer implementar. Os detalhes estão incluídos nas seções relevantes abaixo.
Criar um DPC
Crie seu DPC no modelo atual usado para aplicativos de administração de dispositivos.
Especificamente, seu app precisa criar uma subclasse de
DeviceAdminReceiver (uma classe do pacote android.app.admin), conforme descrito em
Administração de dispositivos.
Criar um perfil de trabalho
Para um exemplo que demonstra como criar um perfil de trabalho básico, consulte BasicManagedProfile no GitHub.
Para criar um perfil de trabalho em um dispositivo que já tem um perfil pessoal, primeiro verifique se o dispositivo é compatível com um perfil de trabalho. Para isso, confira se o recurso de sistema FEATURE_MANAGED_USERS existe:
Kotlin
if (!packageManager.hasSystemFeature(PackageManager.FEATURE_MANAGED_USERS)) { // This device does not support work profiles! }
Java
PackageManager pm = getPackageManager(); if (!pm.hasSystemFeature(PackageManager.FEATURE_MANAGED_USERS)) { // This device does not support work profiles! }
Se o dispositivo for compatível com perfis de trabalho, crie um enviando uma intent com uma ação ACTION_PROVISION_MANAGED_PROFILE. Em algumas documentações, perfil gerenciado é um termo geral que significa o mesmo que perfil de trabalho no contexto do Android na empresa. Inclua o nome do pacote de administrador do dispositivo como um extra:
Kotlin
val provisioningActivity = getActivity() // You'll need the package name for the DPC app. val myDPCPackageName = "com.example.myDPCApp" // Set up the provisioning intent val adminComponent = ComponentName(provisioningActivity.applicationContext, MyAdminReceiver::class.java) provisioningIntent.putExtra(EXTRA_PROVISIONING_DEVICE_ADMIN_COMPONENT_NAME, adminComponent.flattenToString()) if (provisioningIntent.resolveActivity(provisioningActivity.packageManager) == null) { // No handler for intent! Can't provision this device. // Show an error message and cancel. } else { // REQUEST_PROVISION_MANAGED_PROFILE is defined // to be a suitable request code startActivityForResult(provisioningIntent, REQUEST_PROVISION_MANAGED_PROFILE) provisioningActivity.finish() }
Java
Activity provisioningActivity = getActivity(); // You'll need the package name for the DPC app. String myDPCPackageName = "com.example.myDPCApp"; // Set up the provisioning intent Intent provisioningIntent = new Intent("android.app.action.PROVISION_MANAGED_PROFILE"); ComponentName adminComponent = new ComponentName(provisioningActivity.getApplicationContext(), MyAdminReceiver.class); provisioningIntent.putExtra(EXTRA_PROVISIONING_DEVICE_ADMIN_COMPONENT_NAME, adminComponent.flattenToString()); if (provisioningIntent.resolveActivity(provisioningActivity.getPackageManager()) == null) { // No handler for intent! Can't provision this device. // Show an error message and cancel. } else { // REQUEST_PROVISION_MANAGED_PROFILE is defined // to be a suitable request code startActivityForResult(provisioningIntent, REQUEST_PROVISION_MANAGED_PROFILE); provisioningActivity.finish(); }
O sistema responde a essa intenção fazendo o seguinte:
- Verifica se o dispositivo está criptografado. Caso contrário, o sistema vai pedir que o usuário criptografe o dispositivo antes de continuar.
- Cria um perfil de trabalho.
- Remove aplicativos não obrigatórios do perfil de trabalho.
- Copia o app DPC para o perfil de trabalho e define o próprio DPC como proprietário do perfil.
Substitua
onActivityResult() para verificar se o provisionamento foi bem-sucedido:
Kotlin
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent) { // Check if this is the result of the provisioning activity if (requestCode == REQUEST_PROVISION_MANAGED_PROFILE) { // If provisioning was successful, the result code is // Activity.RESULT_OK if (resultCode == Activity.RESULT_OK) { // Work profile created and provisioned. } else { // Provisioning failed. } return } else { // This is the result of some other activity. Call the superclass. super.onActivityResult(requestCode, resultCode, data) } }
Java
@Override public void onActivityResult(int requestCode, int resultCode, Intent data) { // Check if this is the result of the provisioning activity if (requestCode == REQUEST_PROVISION_MANAGED_PROFILE) { // If provisioning was successful, the result code is // Activity.RESULT_OK if (resultCode == Activity.RESULT_OK) { // Work profile created and provisioned. } else { // Provisioning failed. } return; } else { // This is the result of some other activity. Call the superclass. super.onActivityResult(requestCode, resultCode, data); } }
Concluir a ativação do perfil de trabalho
Quando o perfil é provisionado, o sistema chama o método
DeviceAdminReceiver.onProfileProvisioningComplete() do app
DPC. Substitua
esse método de callback para concluir a ativação do perfil de trabalho.
Uma implementação de callback DeviceAdminReceiver.onProfileProvisioningComplete() típica faz o seguinte:
- Verifica se o dispositivo está em conformidade com as políticas de dispositivos do EMM, conforme descrito em Configurar políticas de dispositivos.
- Ativa os aplicativos do sistema que o administrador disponibilizou
no perfil de trabalho usando
DevicePolicyManager.enableSystemApp(). - Se o dispositivo usar o Google Play gerenciado, adicione a conta adequada ao
perfil de trabalho para que os apps aprovados possam ser instalados no dispositivo.
- Contas do Google Play gerenciado: consulte Garantir o ambiente de trabalho para contas do Google Play gerenciado e Adicionar uma conta do Google Play gerenciado para mais detalhes.
- Contas do Google: use
AccountManager.addAccount().
Ativar o perfil de trabalho
Depois de concluir essas tarefas, chame o método
setProfileEnabled() do gerenciador de políticas de dispositivo para ativar o perfil de trabalho:
Kotlin
// Get the device policy manager val myDevicePolicyMgr = getSystemService(Context.DEVICE_POLICY_SERVICE) as DevicePolicyManager val componentName = myDeviceAdminReceiver.getComponentName(this) // Set the name for the newly created work profile. myDevicePolicyMgr.setProfileName(componentName, "My New Work Profile") // ...and enable the profile myDevicePolicyMgr.setProfileEnabled(componentName)
Java
// Get the device policy manager DevicePolicyManager myDevicePolicyMgr = (DevicePolicyManager) getSystemService(Context.DEVICE_POLICY_SERVICE); ComponentName componentName = myDeviceAdminReceiver.getComponentName(this); // Set the name for the newly created work profile. myDevicePolicyMgr.setProfileName(componentName, "My New Work Profile"); // ...and enable the profile myDevicePolicyMgr.setProfileEnabled(componentName);
Configurar políticas do dispositivo
O app DPC aplica as políticas de dispositivo definidas por um administrador para atender aos requisitos e restrições de uma organização. Por exemplo, a política de segurança pode exigir que os dispositivos sejam bloqueados após um determinado número de tentativas de senha malsucedidas. O DPC consulta o console de EMM para políticas atuais e as aplica usando a API Device Administration.
Para saber como aplicar políticas de dispositivo, consulte Políticas.
Aplicar configurações gerenciadas a apps de trabalho
Com as configurações gerenciadas, você oferece aos clientes a capacidade de pré-configurar os apps aprovados para implantação e atualizar esses apps com facilidade quando a configuração precisa ser alterada. Configurar um app antes da implantação garante que a segurança e outras políticas da organização sejam atendidas após a instalação no dispositivo de destino.
As funcionalidades do app são definidas pelo desenvolvedor de apps em um esquema XML (o esquema de configurações gerenciadas) que acompanha o app ao fazer upload para o Google Play. Para mais detalhes, consulte Configurar configurações gerenciadas.
Você recupera esse esquema do app para mostrar aos administradores de clientes no console de EMM, fornece uma interface em que as várias opções definidas no esquema são exibidas e permite que os administradores pré-configurem as configurações do app. A configuração gerenciada resultante definida pelo administrador geralmente é armazenada no servidor de EMM, que usa a API Play EMM para definir Managedconfigurationsfordevice ou Managedconfigurationsforuser. Consulte Configurações gerenciadas pelo Google Play para mais detalhes.
As configurações gerenciadas podem ser aplicadas ao app usando a API EMM do Play (abordagem recomendada) ou diretamente do DPC (descrito em Aplicar configurações gerenciadas diretamente do DPC). Usar a API EMM do Google Play tem várias vantagens, incluindo a facilidade de implementação, já que é possível usar a Biblioteca de suporte a DPC para simplificar as tarefas de DPC. Além disso, a API Play EMM:
- Define a configuração de forma atômica quando um novo app é instalado, garantindo que ele esteja pronto na primeira vez que o usuário o inicia.
- Permite gerenciar configurações por usuário, evitando o provisionamento de monitoramento por dispositivo.
Aplicar configurações gerenciadas usando a API EMM do Google Play
Para usar a API EMM do Google Play em configurações gerenciadas, o DPC precisa permitir que o Google Play defina configurações. A biblioteca de suporte do DPC cuida dessa tarefa para você, fazendo o proxy da configuração enviada pelo Google Play.
Para usar a API Play EMM, faça o download da Biblioteca de suporte a DPC e ative o suporte a configurações gerenciadas no DPC.
Ativar o suporte a configurações gerenciadas no seu DPC
Importe esta classe na sua DPC:
com.google.android.apps.work.dpcsupport.ManagedConfigurationsSupport
Inicialize a biblioteca de configurações gerenciadas. Neste exemplo, "admin" é o ComponentName do DeviceAdminReceiver.
Kotlin
var managedConfigurationsSupport = ManagedConfigurationsSupport(context, admin)
Java
ManagedConfigurationsSupport managedConfigurationsSupport = new ManagedConfigurationsSupport(context, admin);
Ative as configurações gerenciadas:
Kotlin
managedConfigurationsSupport.enableManagedConfigurations()
Java
managedConfigurationsSupport.enableManagedConfigurations();
Com essa biblioteca inicializada no DPC, você pode usar a API EMM do Google Play no console e no servidor do EMM para aplicar configurações gerenciadas aos apps aprovados, em vez de codificar essas tarefas diretamente no DPC. Consulte Configurações gerenciadas pelo Google Play para mais detalhes.
Aplicar configurações gerenciadas diretamente do DPC
Para mudar as configurações de um app diretamente do DPC, chame o método DevicePolicyManager.setApplicationRestrictions() e transmita parâmetros para o DeviceAdminReceiver do app DPC, o nome do pacote do app de destino e o Bundle que compreende a configuração gerenciada do app definida pelo administrador. Consulte Como seu console de DPC e EMM interagem e Configurar configurações gerenciadas para mais detalhes. No entanto, essa abordagem alternativa para aplicar configurações gerenciadas não é recomendada em implantações de contas do Google Play gerenciado.
Suporte para provisionamento de contas do Google Play gerenciado
A Biblioteca de suporte a DPC inclui suporte para provisionamento de contas do Google Play gerenciado. Para usar esse suporte, primeiro inicialize a biblioteca. Depois, garanta o ambiente de trabalho e adicione uma conta do Google Play gerenciado.
Inicializar o suporte a contas do Google Play gerenciado no seu DPC
Importe esta classe na sua DPC:
com.google.android.apps.work.dpcsupport.AndroidForWorkAccountSupport
Inicialize a biblioteca de compatibilidade de provisionamento. Neste exemplo, "admin" é o ComponentName do
DeviceAdminReceiver.
Kotlin
var androidForWorkAccountSupport = AndroidForWorkAccountSupport(context, admin)
Java
AndroidForWorkAccountSupport androidForWorkAccountSupport = new AndroidForWorkAccountSupport(context, admin);
Garantir o ambiente de trabalho para contas do Google Play gerenciado
Depois que o DPC provisionar um dispositivo no modo proprietário do perfil (ACTION_PROVISION_MANAGED_PROFILE) ou modo de proprietário do dispositivo (ACTION_PROVISION_MANAGED_DEVICE), verifique se ele pode oferecer suporte a contas do Google Play gerenciado chamando:
Kotlin
androidForWorkAccountSupport.ensureWorkingEnvironment(callback)
Java
androidForWorkAccountSupport.ensureWorkingEnvironment(callback);
O callback informa o sucesso ou a falha desse processo. Quando o callback retorna com sucesso, uma conta do Google Play gerenciado pode ser adicionada. Se o callback informar um erro, peça ao usuário para verificar se o dispositivo tem uma conexão de rede (por exemplo, se o download falhar). Em outros casos, informe a falha ao Google.
Kotlin
object : WorkingEnvironmentCallback() { override fun onSuccess() { // Can now provision the managed Google Play Account } override fun onFailure(error: Error) { // Notify user, handle error (check network connection) } }
Java
new WorkingEnvironmentCallback() { @Override public void onSuccess() { // Can now provision the managed Google Play Account } @Override public void onFailure(Error error) { // Notify user, handle error (check network connection) } }
Adicionar uma conta do Google Play gerenciado
O framework do Android AccountManager
pode adicionar uma conta do Google Play gerenciado a um dispositivo. Para simplificar a interação com
AccountManager, use a função auxiliar (mostrada no exemplo abaixo)
da Biblioteca de Suporte do DPC. A função
processa o token retornado pelo servidor do Google Play e facilita o provisionamento
da conta do Google Play gerenciado. A função retorna quando a conta do Google Play gerenciado
está em um estado válido:
Kotlin
androidForWorkAccountSupport.addAndroidForWorkAccount(token, accountAddedCallback)
Java
androidForWorkAccountSupport.addAndroidForWorkAccount(token, accountAddedCallback);
token: o token de autenticação do usuário gerado pela chamadaUsers.generateAuthenticationToken()da API EMM do Google Play.accountAddedCallback: retorna a conta do Google Play gerenciado que foi adicionada ao dispositivo. Esse callback precisa incluir os métodosonAccountReady()eonFailure().
Kotlin
val workAccountAddedCallback = object : WorkAccountAddedCallback() { override fun onAccountReady(account: Account, deviceHint: String) { // Device account was successfully added to the device // and is ready to be used. } override fun onFailure(error: Error) { // The account was not successfully added. Check that the token // provided was valid (it expires after a certain period of time). } }
Java
WorkAccountAddedCallback workAccountAddedCallback = new WorkAccountAddedCallback() { @Override public void onAccountReady(Account account, String deviceHint) { // Device account was successfully added to the device // and is ready to be used. } @Override public void onFailure(Error error) { // The account was not successfully added. Check that the token // provided was valid (it expires after a certain period of time). } };
Documentação relacionada
- Para saber mais sobre a API Device Administration, consulte Administração de dispositivos.
- Para saber mais sobre os métodos de provisionamento do Android Enterprise, consulte Provisionar dispositivos no guia do desenvolvedor do Android Enterprise.
- Para um exemplo do GitHub que demonstra como criar um perfil de trabalho básico, consulte BasicManagedProfile.
- Para um exemplo do GitHub que demonstra como definir configurações em outros apps como um proprietário de perfil, consulte AppRestrictionEnforcer.