Criar um controlador de política de dispositivo

Este guia descreve como desenvolver um controlador de política de dispositivo (DPC, na sigla em inglês) para dispositivos em uma implantação do Android para empresas. Um app de DPC, anteriormente conhecido como controlador de políticas de trabalho, controla as políticas dos dispositivos locais e os aplicativos do sistema nos dispositivos.

Sobre DPCs

Em uma implantação corporativa do Android, uma empresa mantém o controle sobre vários aspectos dos dispositivos do usuário, como isolar as informações relacionadas ao trabalho dos dados pessoais dos usuários, pré-configurar apps aprovados para o ambiente ou desativar os recursos do dispositivo (por exemplo, a câmera).

Como um EMM, você desenvolve um app de DPC que pode ser usado pelos clientes em conjunto com o console de EMM e o servidor. Seu cliente implanta o DPC nos dispositivos do usuário que ele gerencia. O DPC atua como uma ponte entre o console (e o servidor) de EMM e o dispositivo. Um administrador usa o console de EMM para executar várias tarefas, incluindo definir configurações de dispositivos e apps.

O DPC cria e gerencia o perfil de trabalho no dispositivo em que está instalado. O perfil de trabalho criptografa as informações relacionadas 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 gerenciada para uso no dispositivo.

Neste guia, mostramos como desenvolver um DPC que pode criar e gerenciar perfis de trabalho.

Biblioteca de Suporte DPC para EMMs

A Biblioteca de Suporte do DPC para EMMs é composta por classes de utilitários e auxiliares que facilitam o provisionamento e o gerenciamento de dispositivos Android em um ambiente corporativo. A biblioteca permite que você aproveite recursos importantes nos seus apps de DPC:

  • Suporte ao provisionamento de contas do Google Play gerenciado: o provisionamento de contas do Google Play gerenciado pelo app DPC exige que os apps Google Play e Google Play Services atendam aos requisitos mínimos de versão. No entanto, a atualização desses apps pode ser complexa. A Biblioteca de Suporte DPC cuida da atualização desses apps e também garante a compatibilidade com atualizações futuras do processo de provisionamento de contas do Google Play gerenciado. Consulte o suporte ao provisionamento de contas do Google Play gerenciado para mais detalhes.
  • Suporte a configurações gerenciadas: usar a API Play EMM para processar configurações gerenciadas para apps aprovados é a maneira mais fácil de implementar configurações gerenciadas no seu DPC. A Biblioteca de Suporte do DPC permite delegar ao Google Play a tarefa de aplicar configurações gerenciadas (anteriormente, restrições de app) conforme definido pelo administrador usando o console de EMM. O uso da API Play EMM para processar configurações gerenciadas permite que a configuração do app seja aplicada atomicamente 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 consideram 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 do provedor de EMM do Android Enterprise. Você precisa adicionar a biblioteca ao arquivo build.gradle e cuidar de outras dependências ao criar o app de DPC. Por exemplo, a biblioteca requer a biblioteca de cliente de autenticação do Google Play Services 11.4.0.

  1. Adicione a biblioteca ao arquivo build.gradle:

    Groovy

    implementation(name:'dpcsupport-yyyymmdd', ext:'aar')
    

    Kotlin

    implementation(name = "dpcsupport-yyyymmdd", ext = "aar")
    
  2. 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. Portanto, é necessário adicioná-las ao manifesto do app para 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 da biblioteca específica no código DPC, dependendo do recurso que 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, o app precisa criar uma subclasse DeviceAdminReceiver (uma classe do pacote android.app.admin), conforme descrito em Administração do dispositivo.

Criar um perfil de trabalho

Para ver 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á tenha um perfil pessoal, confira se o dispositivo oferece suporte a um perfil de trabalho, verificando a existência do recurso do sistema FEATURE_MANAGED_USERS:

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 deles 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 administração de dispositivos 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 intent fazendo o seguinte:

  • Verifica se o dispositivo está criptografado. Se não estiver, o sistema solicitará que o usuário criptografe o dispositivo antes de continuar.
  • Cria um perfil de trabalho.
  • Remove os aplicativos não obrigatórios do perfil de trabalho.
  • Copia o app de DPC no perfil de trabalho e define o próprio DPC como o proprietário do perfil.

Modifique 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 para DPC. Modifique esse método de callback para concluir a ativação do perfil de trabalho.

Uma implementação típica de callback DeviceAdminReceiver.onProfileProvisioningComplete() faz o seguinte:

Ativar o perfil de trabalho

Depois de concluir essas tarefas, chame o método setProfileEnabled() do Gerenciador de políticas de dispositivos 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 do dispositivo conforme definido 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 com falha. O DPC consulta as políticas atuais no console de EMM e, em seguida, aplica as políticas usando a API Device Administration.

Para informações sobre como aplicar políticas de dispositivos, consulte Políticas.

Aplicar configurações gerenciadas a apps de trabalho

Com as configurações gerenciadas, você oferece aos seus clientes a capacidade de pré-configurar os apps aprovados para implantação e os atualiza com facilidade quando a configuração precisa ser alterada. Configurar um app antes da implantação garante que a segurança da organização e outras políticas sejam atendidas durante a instalação do app no dispositivo de destino.

Os recursos do app são definidos pelo desenvolvedor em um esquema XML (o esquema de configurações gerenciadas) que acompanha o app após o upload para o Google Play (desenvolvedores de apps podem consultar Definir configurações gerenciadas para ver mais detalhes).

Você recupera esse esquema do aplicativo para exibir aos administradores de clientes no console de EMM, fornece uma IU com as várias opções definidas no esquema e permite que os administradores pré-definam as configurações do aplicativo. A configuração gerenciada resultante definida pelo administrador normalmente é armazenada no servidor de EMM, que usa a API Play EMM para definir Managedconfigurationsfordevice ou Managedconfigurationsforuser. Consulte Configurações gerenciadas pelo Google Play para ver mais detalhes.

As configurações gerenciadas podem ser aplicadas ao app usando a API Play EMM (abordagem recomendada) ou diretamente pelo DPC (descrito em Aplicar configurações gerenciadas diretamente do DPC). O uso da API Play EMM tem várias vantagens, incluindo uma implementação fácil, porque você pode usar a Biblioteca de Suporte de DPC para simplificar as tarefas de DPC. Além disso, a API Play EMM:

  • Define a configuração atomicamente quando um novo app é instalado, garantindo assim que o app esteja pronto na primeira vez que o usuário o iniciar.
  • Permite gerenciar as configurações por usuário, evitando o monitoramento do provisionamento por dispositivo.

Aplicar configurações gerenciadas usando a API Play EMM

Para usar a API Play EMM 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ê usando um proxy da configuração enviada pelo Google Play.

Para usar a API Play EMM, faça o download da Biblioteca de Suporte DPC e ative o suporte às configurações gerenciadas no seu DPC.

Ativar o suporte a configurações gerenciadas no DPC

Importe esta classe no seu DPC:

com.google.android.apps.work.dpcsupport.ManagedConfigurationsSupport

Inicializar 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 seu DPC, é possível usar a API Google Play EMM no console e no servidor de EMM para aplicar configurações gerenciadas a apps aprovados, em vez de codificar essas tarefas diretamente no DPC. Consulte Configurações gerenciadas pelo Google Play para ver mais detalhes.

Aplique configurações gerenciadas diretamente do DPC

Para mudar as definições de configuração de um app diretamente no DPC, chame o método DevicePolicyManager.setApplicationRestrictions() e transmita parâmetros para o DeviceAdminReceiver do app de DPC, o nome do pacote do app de destino e o Bundle que inclui a configuração gerenciada do app definida pelo administrador. Consulte Como o console de DPC e EMM interagem e Definir 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 ao provisionamento de contas do Google Play gerenciado

A Biblioteca de Suporte do DPC inclui suporte para o provisionamento de contas gerenciadas do Google Play. Para usar esse suporte, primeiro é necessário inicializar a biblioteca e, em seguida, Garantir o ambiente de trabalho e Adicionar uma conta do Google Play gerenciada.

Inicializar o suporte a contas do Google Play gerenciado no seu DPC

Importe esta classe no seu DPC:

com.google.android.apps.work.dpcsupport.AndroidForWorkAccountSupport

Inicialize a biblioteca de compatibilidade de provisionamento. Neste exemplo, “admin” é o ComponentName de DeviceAdminReceiver.

Kotlin

var androidForWorkAccountSupport = AndroidForWorkAccountSupport(context, admin)

Java

AndroidForWorkAccountSupport androidForWorkAccountSupport =
    new AndroidForWorkAccountSupport(context, admin);

Garantir que o ambiente de trabalho para contas do Google Play gerenciado

Depois que o DPC provisiona um dispositivo no modo de proprietário do perfil (ACTION_PROVISION_MANAGED_PROFILE) ou no modo de proprietário do dispositivo (ACTION_PROVISION_MANAGED_DEVICE), confira se o dispositivo oferece suporte a contas do Google Play gerenciado chamando:

Kotlin

androidForWorkAccountSupport.ensureWorkingEnvironment(callback)

Java

androidForWorkAccountSupport.ensureWorkingEnvironment(callback);

O callback informa o sucesso ou falha desse processo. Quando o callback for retornado, uma conta do Google Play gerenciado poderá ser adicionada. Se o callback informar um erro, solicite que o usuário verifique 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 AccountManager do framework do Android 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 de DPC (link em inglês). 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 chamada Users.generateAuthenticationToken() da API Google Play EMM.
  • accountAddedCallback: retorna a conta do Google Play gerenciado que foi adicionada ao dispositivo. Esse callback precisa incluir os métodos onAccountReady() e onFailure().

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).
        }
};
  • Para saber mais sobre a API Device Administration, consulte Administração do dispositivo.
  • Para saber mais sobre os métodos de provisionamento do Android Enterprise, consulte Provisionar dispositivos no Guia para desenvolvedores do Android Enterprise.
  • Para ver um exemplo do GitHub que demonstra como criar um perfil de trabalho básico, consulte BasicManagedProfile.
  • Para conferir um exemplo do GitHub que demonstra como definir configurações em outros apps como proprietário de um perfil, consulte AppRestrictionEnforcer.