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

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.

  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 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:

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é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 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.