En esta guía, se describe cómo desarrollar un controlador de políticas de dispositivos (DPC) para dispositivos en una implementación de Android Enterprise. Una app de DPC, antes conocida como controlador de políticas de trabajo, controla las políticas de dispositivos locales y las aplicaciones del sistema en los dispositivos.
Acerca de los DPC
En una implementación de Android Enterprise, la empresa mantiene el control sobre varios aspectos de los dispositivos de los usuarios, como aislar la información relacionada con el trabajo de los datos personales de los usuarios, preconfigurar las apps aprobadas para el entorno o inhabilitar las capacidades del dispositivo (por ejemplo, la cámara).
Como EMM, desarrollas una app de DPC que tus clientes pueden usar junto con tu consola de EMM y tu servidor. Tu cliente implementa el DPC en los dispositivos de los usuarios que administra. El DPC actúa como puente entre la consola (y el servidor) del EMM y el dispositivo. Un administrador usa la consola del EMM para realizar una variedad de tareas, como configurar los parámetros de configuración y las apps del dispositivo.
El DPC crea y administra el perfil de trabajo en el dispositivo en el que está instalado. El perfil de trabajo encripta la información relacionada con el trabajo y la mantiene separada de las apps y los datos personales de los usuarios. Antes de crear el perfil de trabajo, el DPC también puede aprovisionar una Cuenta de Google Play administrada para usarla en el dispositivo.
En esta guía, se muestra cómo desarrollar un DPC que pueda crear y administrar perfiles de trabajo.
Biblioteca de compatibilidad con DPC para EMM
La biblioteca de compatibilidad con DPC para EMM incluye clases de utilidad y ayuda que facilitan el aprovisionamiento y la administración de dispositivos Android en un entorno empresarial. La biblioteca te permite aprovechar funciones importantes en tus apps de DPC:
- Compatibilidad con el aprovisionamiento de cuentas de Google Play administrado: El aprovisionamiento de cuentas de Google Play administrado desde la app del DPC requiere que las apps de Google Play y los servicios de Google Play cumplan con los requisitos mínimos de versión. Sin embargo, actualizar estas apps puede ser complejo. La biblioteca de compatibilidad con el DPC se encarga de actualizar estas apps y también garantiza la compatibilidad con futuras actualizaciones del proceso de aprovisionamiento de cuentas administradas de Google Play. Consulta Provisioning support for managed Google Play Accounts para obtener más detalles.
- Compatibilidad con las configuraciones administradas: Usar la API de Play EMM para controlar las configuraciones administradas de las apps aprobadas es la forma más sencilla de implementar configuraciones administradas en tu DPC. La biblioteca de asistencia al DPC te permite delegar en Google Play la tarea de aplicar la configuración administrada (antes, restricciones de la app) según lo establece el administrador con tu consola del EMM. Usar la API de Play EMM para controlar las configuraciones administradas permite que la configuración de la app se aplique de forma atómica durante la instalación. Consulta Cómo aplicar parámetros de configuración administrados a apps de trabajo para obtener más información sobre cómo habilitar esta capacidad en tu DPC.
Sigue los pasos que se indican a continuación para descargar la biblioteca. Las tareas que se detallan en esta guía suponen el uso de la biblioteca de compatibilidad con DPC.
Descarga la biblioteca de compatibilidad con DPC
Para usar la biblioteca de compatibilidad con DPC, descárgala de la comunidad de proveedores de EMM de Android Enterprise. Debes agregar la biblioteca a tu archivo build.gradle y ocuparte de otras dependencias cuando compiles tu app de DPC. Por ejemplo, la biblioteca requiere la biblioteca cliente de autenticación de los Servicios de Google Play 11.4.0.
- Agrega la biblioteca al archivo
build.gradle:
Groovy
implementation(name:'dpcsupport-yyyymmdd', ext:'aar')
Kotlin
implementation(name = "dpcsupport-yyyymmdd", ext = "aar")
- Agrega la
biblioteca cliente de autenticación de los Servicios de Google Play 11.4.0 al archivo 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")
La biblioteca requiere ciertos permisos para ejecutarse, por lo que debes agregarlos al manifiesto de tu app de DPC cuando la subas a 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"/>
Además de estos pasos preliminares de configuración y de implementación, también debes inicializar la funcionalidad específica de la biblioteca en el código de tu DPC, según la capacidad que desees implementar. Los detalles se incluyen en las secciones pertinentes a continuación.
Crea un DPC
Compila tu DPC en el modelo existente que se usa para las aplicaciones de administración de dispositivos.
Específicamente, tu app debe crear una subclase de
DeviceAdminReceiver (una clase del paquete android.app.admin) como se describe en
Administración de dispositivos.
Crea un perfil de trabajo
Para ver un ejemplo que muestra cómo crear un perfil de trabajo básico, consulta BasicManagedProfile en GitHub.
Para crear un perfil de trabajo en un dispositivo que ya tiene un perfil personal, primero verifica si el dispositivo admite un perfil de trabajo. Para ello, comprueba la existencia de la función del 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! }
Si el dispositivo admite perfiles de trabajo, crea uno enviando un intent con una acción ACTION_PROVISION_MANAGED_PROFILE. (En cierta documentación, perfil administrado es un término general que significa lo mismo que perfil de trabajo en el contexto de Android en la empresa). Incluye el nombre del paquete de administrador del dispositivo como un 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(); }
El sistema responde a esta intención de la siguiente manera:
- Verifica que el dispositivo esté encriptado. Si no lo está, el sistema le pedirá al usuario que encripte el dispositivo antes de continuar.
- Crea un perfil de trabajo.
- Quita las aplicaciones no obligatorias del perfil de trabajo.
- Copia la app del DPC en el perfil de trabajo y establece el DPC como propietario del perfil.
Anula
onActivityResult() para ver si el aprovisionamiento se realizó correctamente:
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); } }
Cómo terminar de habilitar el perfil de trabajo
Cuando se aprovisiona el perfil, el sistema llama al método
DeviceAdminReceiver.onProfileProvisioningComplete() de la app del DPC. Anula este método de devolución de llamada para terminar de habilitar el perfil de trabajo.
Una implementación de devolución de llamada de DeviceAdminReceiver.onProfileProvisioningComplete() típica hace lo siguiente:
- Verifica que el dispositivo cumpla con las políticas de dispositivo del EMM, como se describe en Configura las políticas de dispositivo.
- Habilita las aplicaciones del sistema que el administrador puso a disposición en el perfil de trabajo con
DevicePolicyManager.enableSystemApp(). - Si el dispositivo usa Google Play administrado, agrega la cuenta adecuada al perfil de trabajo para que se puedan instalar apps aprobadas en el dispositivo.
- Cuentas de Google Play administradas: Consulta Cómo garantizar el entorno de trabajo para las cuentas de Google Play administradas y Cómo agregar una cuenta de Google Play administrada para obtener más detalles.
- Cuentas de Google: Usa
AccountManager.addAccount().
Activa el perfil de trabajo
Una vez que hayas completado estas tareas, llama al método
setProfileEnabled() del administrador de políticas del dispositivo para activar el perfil de trabajo:
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);
Configura las políticas de dispositivo
La app del DPC aplica las políticas del dispositivo según lo establece un administrador para cumplir con los requisitos y las restricciones de una organización. Por ejemplo, la política de seguridad podría requerir que los dispositivos se bloqueen después de una cierta cantidad de intentos fallidos para ingresar la contraseña. El DPC consulta la consola de la EMM para conocer las políticas actuales y, luego, las aplica con la API de Device Administration.
Para obtener información sobre cómo aplicar políticas de dispositivos, consulta Políticas.
Aplica opciones de configuración administradas a las apps de trabajo
Las configuraciones administradas te permiten brindar a tus clientes la capacidad de preconfigurar las apps que aprobaron para la implementación y actualizar esas apps fácilmente cuando sea necesario cambiar la configuración. Configurar una app antes de la implementación garantiza que se cumplan las políticas de seguridad y otras políticas de la organización cuando se instale la app en el dispositivo de destino.
Las capacidades de la app se definen en un esquema XML (el esquema de configuración administrada) que el desarrollador de la app incluye cuando la sube a Google Play (para obtener más información, los desarrolladores de apps pueden consultar Cómo configurar parámetros de configuración administrados).
Recuperas este esquema de la app para mostrarlo a los administradores de clientes en tu consola de EMM, proporcionas una IU en la que se muestran las diversas opciones definidas en el esquema y permites que los administradores preconfiguren los parámetros de configuración de la app. Por lo general, el conjunto de configuración administrada resultante que establece el administrador se almacena en el servidor de EMM, que luego usa la API de Play EMM para establecer Managedconfigurationsfordevice o Managedconfigurationsforuser. Consulta Configuraciones administradas a través de Play para obtener más detalles.
Las configuraciones administradas se pueden aplicar a la app con la API de Play EMM (enfoque recomendado) o directamente desde el DPC (como se describe en Cómo aplicar configuraciones administradas directamente desde el DPC). Usar la API de EMM de Play tiene varias ventajas, incluida una implementación sencilla, ya que puedes usar la biblioteca de compatibilidad con DPC para simplificar las tareas del DPC. Además, la API de Play EMM hace lo siguiente:
- Establece la configuración de forma atómica cuando se instala una app nueva, lo que garantiza que la app esté lista la primera vez que el usuario la inicie.
- Te permite administrar la configuración por usuario, de modo que puedes evitar la supervisión del aprovisionamiento por dispositivo.
Aplica la configuración administrada con la API de Play EMM
Para usar la API de Play EMM para las configuraciones administradas, el DPC debe permitir que Google Play establezca configuraciones. La biblioteca de asistencia para DPC se encarga de esta tarea por ti, ya que actúa como proxy de la configuración que envía Google Play.
Para usar la API de Play EMM, descarga la biblioteca de compatibilidad con DPC y, luego, habilita la compatibilidad con las configuraciones administradas en tu DPC.
Habilita la compatibilidad con la configuración administrada en tu DPC
Importa esta clase en tu DPC:
com.google.android.apps.work.dpcsupport.ManagedConfigurationsSupport
Inicializa la biblioteca de configuraciones administradas. En este ejemplo, "admin" es el ComponentName de DeviceAdminReceiver.
Kotlin
var managedConfigurationsSupport = ManagedConfigurationsSupport(context, admin)
Java
ManagedConfigurationsSupport managedConfigurationsSupport = new ManagedConfigurationsSupport(context, admin);
Habilita los parámetros de configuración administrados:
Kotlin
managedConfigurationsSupport.enableManagedConfigurations()
Java
managedConfigurationsSupport.enableManagedConfigurations();
Con esta biblioteca inicializada en tu DPC, puedes usar la API de EMM de Google Play en tu consola y servidor de EMM para aplicar configuraciones administradas a las apps aprobadas, en lugar de codificar estas tareas directamente en el DPC. Consulta Configuraciones administradas a través de Play para obtener más detalles.
Aplicar configuraciones administradas directamente desde el DPC
Para cambiar la configuración de una app directamente desde el DPC, llama al método DevicePolicyManager.setApplicationRestrictions() y pasa parámetros para el DeviceAdminReceiver de la app del DPC, el nombre del paquete de la app de destino y el Bundle que comprende la configuración administrada de la app según lo establece el administrador. Consulta Cómo interactúan tu DPC y la consola del EMM y Configura parámetros de configuración administrados para obtener más detalles. Sin embargo, ten en cuenta que este enfoque alternativo para aplicar configuraciones administradas no se recomienda en las implementaciones de cuentas de Google Play administrado.
Compatibilidad con el aprovisionamiento de cuentas de Google Play administrado
La biblioteca de compatibilidad con DPC incluye compatibilidad con el aprovisionamiento de cuentas de Google Play administradas. Para usar esta compatibilidad, primero debes inicializar la biblioteca y, luego, puedes asegurarte de que el entorno de trabajo funcione y agregar una Cuenta de Google Play administrada.
Inicializa la compatibilidad con las cuentas de Google Play administradas en tu DPC
Importa esta clase en tu DPC:
com.google.android.apps.work.dpcsupport.AndroidForWorkAccountSupport
Inicializa la biblioteca de compatibilidad con el aprovisionamiento. En este ejemplo, "admin" es el ComponentName del
DeviceAdminReceiver.
Kotlin
var androidForWorkAccountSupport = AndroidForWorkAccountSupport(context, admin)
Java
AndroidForWorkAccountSupport androidForWorkAccountSupport = new AndroidForWorkAccountSupport(context, admin);
Asegúrate de que el entorno de trabajo sea adecuado para las cuentas administradas de Google Play
Después de que el DPC aprovisione un dispositivo en modo de propietario del perfil (ACTION_PROVISION_MANAGED_PROFILE) o en modo de propietario del dispositivo (ACTION_PROVISION_MANAGED_DEVICE), asegúrate de que el dispositivo pueda admitir Cuentas de Google Play administradas llamando a lo siguiente:
Kotlin
androidForWorkAccountSupport.ensureWorkingEnvironment(callback)
Java
androidForWorkAccountSupport.ensureWorkingEnvironment(callback);
La devolución de llamada informa el éxito o el fracaso de este proceso. Cuando la devolución de llamada se completa correctamente, se puede agregar una cuenta de Google Play administrada. Si la devolución de llamada informa un error, pídele al usuario que se asegure de que el dispositivo tenga conexión de red (por ejemplo, si falla la descarga). En otros casos, informa la falla a 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) } }
Cómo agregar una cuenta de Google Play administrado
El AccountManager del framework de Android puede agregar una cuenta de Google Play administrado a un dispositivo. Para simplificar la interacción con AccountManager, usa la función auxiliar (que se muestra en el siguiente ejemplo) de la biblioteca de compatibilidad con DPC. La función controla el token que devuelve el servidor de Google Play y facilita el aprovisionamiento de la cuenta de Google Play administrado. La función se devuelve cuando la cuenta de Google Play administrado se encuentra en un estado válido:
Kotlin
androidForWorkAccountSupport.addAndroidForWorkAccount(token, accountAddedCallback)
Java
androidForWorkAccountSupport.addAndroidForWorkAccount(token, accountAddedCallback);
token: Es el token de autenticación del usuario generado por la llamada a la API de EMM de Google Play.Users.generateAuthenticationToken()accountAddedCallback: Devuelve la cuenta de Google Play administrada que se agregó correctamente al dispositivo. Esta devolución de llamada debe incluir los métodosonAccountReady()yonFailure().
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). } };
Documentación relacionada
- Para obtener más información sobre la API de Device Administration, consulta Device Administration.
- Para obtener información sobre los métodos de aprovisionamiento de Android Enterprise, consulta Aprovisiona dispositivos en la guía para desarrolladores de Android Enterprise.
- Para ver un ejemplo de GitHub que muestra cómo crear un perfil de trabajo básico, consulta BasicManagedProfile.
- Para ver un ejemplo de GitHub que muestra cómo establecer configuraciones en otras apps como propietario de un perfil, consulta AppRestrictionEnforcer.