En esta guía, se describe cómo desarrollar un controlador de política de dispositivo (DPC) para dispositivos en una implementación empresarial de Android. 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.
Información acerca de los DPC
En una implementación empresarial de Android, una empresa mantiene el control sobre varios aspectos de los dispositivos de los usuarios, como el aislamiento de información relacionada con el trabajo de los datos personales de los usuarios, la preconfiguración de apps aprobadas para el entorno o la inhabilitación de las funciones 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 del usuario que administra. El DPC actúa como un puente entre tu consola de EMM (y el servidor) y el dispositivo. Un administrador usa la consola de EMM para realizar una variedad de tareas, como establecer la configuración del dispositivo y las apps.
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 usar en el dispositivo.
En esta guía, se muestra cómo desarrollar un DPC que puede crear y administrar perfiles de trabajo.
Biblioteca de compatibilidad de DPC para EMM
La biblioteca de compatibilidad de 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 de tus apps de DPC:
- Compatibilidad con el aprovisionamiento de cuentas de Google Play administradas: El aprovisionamiento de cuentas de Google Play administradas desde la app de DPC requiere que las apps de los Servicios de Google Play y Google Play cumplan con los requisitos mínimos de versión. Sin embargo, actualizar estas apps puede ser complejo. La biblioteca de compatibilidad de DPC se encarga de actualizar estas apps y también garantiza la compatibilidad con futuras actualizaciones del proceso de aprovisionamiento de las cuentas de Google Play administradas. Consulta la compatibilidad con el aprovisionamiento de cuentas de Google Play administradas para obtener más detalles.
- Compatibilidad con configuraciones administradas: La forma más fácil de implementar configuraciones administradas en tu DPC es usar la API de EMM de Play para controlar las configuraciones administradas de apps aprobadas. La biblioteca de compatibilidad de DPC te permite delegar a Google Play la tarea de aplicar configuraciones administradas (anteriormente, restricciones de apps) como establece el administrador mediante tu consola de EMM. El uso de la API de EMM de Play para controlar configuraciones administradas permite que la configuración de la app se aplique de forma atómica durante la instalación. Consulta Aplica configuraciones administradas a apps de trabajo para obtener más información sobre cómo habilitar esta función en tu DPC.
Sigue los pasos que se indican a continuación para descargar la biblioteca. En las tareas que se detallan en esta guía, se presupone el uso de la biblioteca de compatibilidad de DPC.
Descarga la biblioteca de compatibilidad de DPC
Para usar la biblioteca de compatibilidad de 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 versión 11.4.0 de la biblioteca cliente de autenticación de los Servicios de Google Play.
- 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 implementación y configuración, también debes inicializar la funcionalidad específica de la biblioteca en tu código DPC, según la capacidad que desees implementar. Los detalles se incluyen en las secciones relevantes 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 en el que se 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, verifica 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. Para ello, envía un intent con una acción ACTION_PROVISION_MANAGED_PROFILE. (En algunos documentos, perfil administrado es un término general que significa lo mismo que perfil de trabajo en el contexto de Android en el ámbito empresarial). Incluye el nombre del paquete de administración de dispositivos como elemento adicional:
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 este intent de la siguiente manera:
- Verifica que el dispositivo esté encriptado. Si no es así, el sistema le solicita 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 de 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); } }
Termina de habilitar el perfil de trabajo
Cuando se aprovisiona el perfil, el sistema llama al método
DeviceAdminReceiver.onProfileProvisioningComplete()
de la app de 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 DeviceAdminReceiver.onProfileProvisioningComplete()
típica hace lo siguiente:
- Verifica que el dispositivo cumpla con las políticas de dispositivo de EMM, como se describe en Cómo configurar políticas de dispositivo.
- Habilita las aplicaciones del sistema que el administrador puso a disposición en el perfil de trabajo mediante
DevicePolicyManager.enableSystemApp()
. - Si el dispositivo usa Google Play administrado, agrega la cuenta adecuada al perfil de trabajo para que se puedan instalar las apps aprobadas.
- 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);
Cómo configurar políticas de dispositivo
La app de DPC aplica las políticas de dispositivos establecidas por un administrador para cumplir con los requisitos y restricciones de una organización. Por ejemplo, la política de seguridad puede requerir que los dispositivos se bloqueen después de una cierta cantidad de intentos fallidos para ingresar la contraseña. El DPC consulta las políticas actuales en la consola de EMM y, luego, aplica las políticas mediante la API de administración de dispositivos.
Si quieres obtener información para aplicar políticas de dispositivos, consulta Políticas.
Aplica configuraciones administradas a apps de trabajo
Las configuraciones administradas te permiten proporcionar a tus clientes la capacidad de preconfigurar las apps que aprobaron para su implementación y actualizarlas con facilidad cuando sea necesario cambiar la configuración. Configurar una app antes de la implementación garantiza que las políticas de seguridad y otras políticas de la organización se cumplan durante la instalación de la app en el dispositivo de destino.
El desarrollador de apps define las capacidades de la app en un esquema XML (el esquema de configuraciones administradas) que acompaña a la app cuando se sube a Google Play (si eres desarrollador de apps, consulta Cómo establecer configuraciones administradas para obtener más información).
Debes recuperar este esquema de la app para mostrárselo a los administradores de clientes en la consola de EMM, proporcionar una IU en la que se muestren las diversas opciones definidas en el esquema y permitir que los administradores preconfiguren los parámetros de la app. Por lo general, la configuración administrada resultante que establece el administrador se almacena en el servidor de EMM que luego usa la API de EMM de Play a fin de establecer configuración administrada para el dispositivo o configuración administrada para el usuario. Consulta Configuraciones administradas mediante Play para obtener más detalles.
Las configuraciones administradas se pueden aplicar a la app a través de la API de EMM de Play (enfoque recomendado) o directamente desde el DPC (descrito en Cómo aplicar configuraciones administradas directamente desde el DPC). El uso de la API de EMM de Play tiene varias ventajas, incluida una implementación sencilla, ya que puedes usar la Biblioteca de compatibilidad de DPC para simplificar las tareas de DPC. Además, la API de EMM de Play hace lo siguiente:
- Establece la configuración de forma atómica cuando se instala una app nueva y garantiza que esté lista la primera vez que el usuario la inicia.
- Te permite administrar la configuración por usuario, de modo que puedas evitar la supervisión del aprovisionamiento por dispositivo.
Aplicar configuraciones administradas con la API de EMM de Play
A fin de usar la API de EMM de Play para configuraciones administradas, el DPC debe permitir que Google Play establezca configuraciones. La biblioteca de compatibilidad de DPC se encarga de esta tarea por ti enviando la configuración que envía Google Play mediante un proxy.
Para usar la API de EMM de Play, descarga la biblioteca de compatibilidad de DPC y, luego, habilita la compatibilidad con 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 del DeviceAdminReceiver.
Kotlin
var managedConfigurationsSupport = ManagedConfigurationsSupport(context, admin)
Java
ManagedConfigurationsSupport managedConfigurationsSupport = new ManagedConfigurationsSupport(context, admin);
Habilita las opciones de configuración administradas:
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 apps aprobadas, en lugar de programar estas tareas directamente en el DPC. Para obtener más información, consulta Configuraciones administradas mediante Play.
Aplica configuraciones administradas directamente desde el DPC
Para cambiar los parámetros de configuración de una app directamente desde el DPC, llama al método DevicePolicyManager.setApplicationRestrictions() y pasa los parámetros para el DeviceAdminReceiver de la app de 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 establezca el administrador. Consulta Cómo interactúan tu consola de EMM y DPC y Cómo establecer configuraciones administradas para obtener más detalles. Sin embargo, ten en cuenta que este enfoque alternativo para aplicar las configuraciones administradas no se recomienda en las implementaciones de cuentas de Google Play administradas.
Compatibilidad con el aprovisionamiento de cuentas de Google Play administrado
La biblioteca de compatibilidad de DPC incluye asistencia para aprovisionar cuentas de Google Play administradas. Para usar esta compatibilidad, primero debes inicializar la biblioteca y, luego, puedes Garantizar el entorno de trabajo y Agregar una cuenta de Google Play administrada.
Inicializa la compatibilidad de 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 de aprovisionamiento. En este ejemplo, "admin" es el ComponentName
de
DeviceAdminReceiver
.
Kotlin
var androidForWorkAccountSupport = AndroidForWorkAccountSupport(context, admin)
Java
AndroidForWorkAccountSupport androidForWorkAccountSupport = new AndroidForWorkAccountSupport(context, admin);
Asegúrate de que el entorno de trabajo de las Cuentas de Google Play administradas
Después de que el DPC aprovisione un dispositivo en el modo de propietario del perfil (ACTION_PROVISION_MANAGED_PROFILE
) o en el modo de propietario del dispositivo (ACTION_PROVISION_MANAGED_DEVICE
), asegúrate de que el dispositivo sea compatible con las cuentas de Google Play administradas. Para ello, llama al siguiente comando:
Kotlin
androidForWorkAccountSupport.ensureWorkingEnvironment(callback)
Java
androidForWorkAccountSupport.ensureWorkingEnvironment(callback);
La devolución de llamada informa el éxito o el fracaso de este proceso. Si la devolución de llamada se muestra 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 el error 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 administrada 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 de DPC. La función controla el token que muestra el servidor de Google Play y facilita el aprovisionamiento de la cuenta de Google Play administrada. La función se muestra cuando la cuenta de Google Play administrada está en un estado válido:
Kotlin
androidForWorkAccountSupport.addAndroidForWorkAccount(token, accountAddedCallback)
Java
androidForWorkAccountSupport.addAndroidForWorkAccount(token, accountAddedCallback);
token
: El token de autenticación del usuario que genera la llamadaUsers.generateAuthenticationToken()
a la API de EMM de Google Play.accountAddedCallback
: Muestra 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 administración de dispositivos, consulta Administración de dispositivos.
- Si deseas obtener información sobre los métodos de aprovisionamiento de Android Enterprise, consulta Cómo aprovisionar dispositivos en la Guía para desarrolladores de Android Enterprise.
- Para ver una muestra de GitHub en la que se muestra cómo crear un perfil de trabajo básico, consulta BasicManagedProfile.
- Para ver un ejemplo de GitHub en el que se muestra cómo establecer parámetros de configuración en otras apps como propietario del perfil, consulta AppRestrictionEnforcer.