Cómo compilar un controlador de política de dispositivo

En esta guía, se describe cómo desarrollar un controlador de política de dispositivo (DPC) para dispositivos en una implementación de Android para empresas. 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 la 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 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 del usuario que administra. El DPC actúa como 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 pueda crear y administrar perfiles de trabajo.

Biblioteca de compatibilidad de DPC para EMM

La biblioteca de compatibilidad de DPC para EMM comprende clases de utilidades y auxiliares 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: Para aprovisionar cuentas de Google Play administradas desde la app de DPC, es necesario que las apps de los Servicios de Google Play y de Google Play cumplan con los requisitos mínimos de la 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 actualizaciones futuras del proceso de aprovisionamiento de las Cuentas de Google Play administradas. Para obtener más información, consulta Compatibilidad con el aprovisionamiento de cuentas de Google Play administradas.
  • Compatibilidad con configuraciones administradas: El uso de la API de EMM de Play para controlar las configuraciones administradas de apps aprobadas es la forma más fácil de implementar configuraciones administradas en tu DPC. La biblioteca de compatibilidad de DPC te permite delegar a Google Play la tarea de aplicar las configuraciones administradas (anteriormente, restricciones de apps) según lo que establece el administrador en tu consola de EMM. El uso de 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 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. Las tareas detalladas en esta guía suponen el uso de la biblioteca de compatibilidad para DPC.

Descarga la biblioteca de compatibilidad para DPC

Para usar la biblioteca de compatibilidad para 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.

  1. Agrega la biblioteca al archivo build.gradle:

    Groovy

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

    Kotlin

    implementation(name = "dpcsupport-yyyymmdd", ext = "aar")
    
  2. 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

Crea tu DPC a partir del modelo existente que se usa para 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 comprueba si el dispositivo puede admitir uno. 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 es compatible con perfiles de trabajo, crea uno mediante el envío de 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. De lo contrario, el sistema le solicitará al usuario que encripte el dispositivo antes de continuar.
  • Crea un perfil de trabajo.
  • Elimina 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

Una vez que 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:

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 de DPC aplica las políticas de dispositivos establecidas por 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 las políticas actuales en la consola de EMM y, luego, las aplica con 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 opciones de configuración administradas te permiten brindarles a tus clientes la capacidad de preconfigurar las apps que aprobaron su implementación y actualizarlas con facilidad cuando sea necesario cambiar la configuración. La configuración de una app antes de la implementación garantiza que la seguridad y otras políticas de la organización se cumplan cuando se instala la app en el dispositivo de destino.

El desarrollador de la app 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).

Recuperas este esquema de la app para mostrárselo a los administradores de clientes en tu consola de EMM, proporcionas una IU en la que se muestren las diversas opciones definidas en el esquema y permites que los administradores establezcan previamente la configuración 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 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 mediante la API de EMM de Play (enfoque recomendado) o directamente desde el DPC (se describe en Aplica configuraciones administradas directamente desde el DPC). El uso de la API de EMM de Play tiene varias ventajas, incluida una fácil implementación, 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 esta 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 Play EMM

Para 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 un proxy de la configuración que envía Google Play.

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 Configuraciones administradas 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 las configuraciones 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 a través de 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 del 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 que establece el administrador. Consulta Cómo interactúan la consola de tu DPC y EMM 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 compatibilidad 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 para las cuentas de Google Play administradas

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 sea compatible con cuentas de Google Play administradas llamando al siguiente comando:

Kotlin

androidForWorkAccountSupport.ensureWorkingEnvironment(callback)

Java

androidForWorkAccountSupport.ensureWorkingEnvironment(callback);

La devolución de llamada informa sobre el éxito o el fracaso de este proceso. Si la devolución de llamada se devuelve 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 una 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: Es el token de autenticación del usuario que genera la llamada Users.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étodos onAccountReady() y 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 obtener más información sobre la API de administración de dispositivos, consulta Administración de dispositivos.
  • Si quieres 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 demuestra cómo crear un perfil de trabajo básico, consulta BasicManagedProfile.
  • Para ver un ejemplo de GitHub en el que se demuestra cómo establecer parámetros de configuración en otras apps como propietario del perfil, consulta AppRestrictionEnforcer.