Développer un outil de contrôle des règles relatives aux appareils

Ce guide explique comment développer un outil de contrôle des règles relatives aux appareils (DPC) pour les appareils déployés dans le cadre d'un déploiement d'entreprise Android. Une application DPC, auparavant appelée outil de contrôle de règles professionnelles, contrôle les règles locales relatives aux appareils et les applications système sur les appareils.

À propos des DPC

Dans un déploiement d'entreprise Android, une entreprise conserve le contrôle de divers aspects des appareils des utilisateurs, comme isoler les informations professionnelles des données à caractère personnel des utilisateurs, préconfigurer des applications approuvées pour l'environnement ou désactiver les fonctionnalités de l'appareil (par exemple, l'appareil photo).

En tant qu'EMM, vous développez une application DPC pouvant être utilisée par vos clients conjointement avec votre console EMM et votre serveur. Votre client déploie l'outil de contrôle des règles relatives aux appareils sur les appareils des utilisateurs qu'il gère. Le DPC fait le lien entre votre console EMM (et votre serveur) et l'appareil. Un administrateur utilise la console EMM pour effectuer diverses tâches, y compris la configuration des paramètres et des applications d'un appareil.

L'outil DPC crée et gère le profil professionnel sur l'appareil sur lequel il est installé. Le profil professionnel chiffre les informations professionnelles et les sépare des applications et données personnelles des utilisateurs. Avant de créer le profil professionnel, le DPC peut également provisionner un compte Google Play d'entreprise à utiliser sur l'appareil.

Ce guide vous explique comment développer une application de contrôle des règles relatives aux appareils capable de créer et de gérer des profils professionnels.

Bibliothèque de support DPC pour les EMM

La bibliothèque Support DPC pour les EMM comprend des classes d'utilitaires et d'assistance qui facilitent le provisionnement et la gestion des appareils Android dans un environnement d'entreprise. Cette bibliothèque vous permet de profiter de fonctionnalités importantes dans vos applications DPC:

  • Compatibilité avec le provisionnement des comptes Google Play gérés : pour provisionner des comptes Google Play gérés à partir de l'application DPC, Google Play et les applications des services Google Play doivent disposer de la version minimale requise. Cependant, la mise à jour de ces applications peut être complexe. La bibliothèque Support DPC se charge de mettre à jour ces applications et garantit également la compatibilité avec les futures mises à jour du processus de provisionnement des comptes Google Play gérés. Pour en savoir plus, consultez la page Assistance pour le provisionnement des comptes Google Play gérés.
  • Compatibilité avec les configurations gérées : l'utilisation de l'API EMM Play pour gérer les configurations gérées pour les applications approuvées est le moyen le plus simple d'implémenter des configurations gérées sur votre DPC. La bibliothèque DPC Support vous permet de déléguer à Google Play la tâche d'appliquer les configurations gérées (anciennement restrictions des applications) définies par l'administrateur à l'aide de votre console EMM. L'utilisation de l'API EMM Play pour gérer les configurations gérées permet d'appliquer la configuration de l'application de manière atomique lors de l'installation. Consultez la section Appliquer les configurations gérées aux applications professionnelles pour en savoir plus sur l'activation de cette fonctionnalité dans votre application de contrôle des règles relatives aux appareils.

Suivez les étapes ci-dessous pour télécharger la bibliothèque. Les tâches décrites dans ce guide supposent l'utilisation de la bibliothèque Support DPC.

Télécharger la bibliothèque Support DPC

Pour utiliser la bibliothèque Support DPC, téléchargez-la depuis la communauté des fournisseurs EMM Android Enterprise. Vous devez ajouter la bibliothèque à votre fichier build.gradle et vous occuper des autres dépendances lorsque vous compilez votre application DPC. Par exemple, la bibliothèque nécessite la bibliothèque cliente d'authentification des services Google Play 11.4.0.

  1. Ajoutez la bibliothèque au fichier build.gradle:

    Groovy

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

    Kotlin

    implementation(name = "dpcsupport-yyyymmdd", ext = "aar")
    
  2. Ajoutez la bibliothèque cliente d'authentification des services Google Play 11.4.0 au fichier 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 bibliothèque nécessite certaines autorisations. Vous devez donc les ajouter au fichier manifeste de votre application DPC lorsque vous l'importez sur 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"/>

En plus de ces étapes préliminaires de configuration et de déploiement, vous devez également initialiser la fonctionnalité de bibliothèque spécifique dans votre code DPC, en fonction de la fonctionnalité que vous souhaitez implémenter. Pour en savoir plus, consultez les sections correspondantes ci-dessous.

Créer un DPC

Créez votre DPC sur le modèle existant utilisé pour les applications d'administration d'appareils. Plus précisément, votre application doit sous-classer DeviceAdminReceiver (une classe du package android.app.admin) comme décrit dans la section Administration des appareils.

Créer un profil professionnel

Pour obtenir un exemple montrant comment créer un profil professionnel de base, consultez la section BasicManagedProfile sur GitHub.

Pour créer un profil professionnel sur un appareil disposant déjà d'un profil personnel, commencez par vérifier si l'appareil est compatible avec un profil professionnel en vérifiant l'existence de la fonctionnalité système 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 l'appareil est compatible avec les profils professionnels, créez un profil professionnel en envoyant un intent avec une action ACTION_PROVISION_MANAGED_PROFILE. (Dans certaines documentations, le terme général profil géré a la même signification que profil professionnel dans le contexte d'Android en entreprise.) Incluez le nom du package d'administration de l'appareil en tant qu'élément supplémentaire:

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();
}

Le système répond à cet intent en procédant comme suit:

  • Vérifie que l'appareil est chiffré. Si ce n'est pas le cas, le système invite l'utilisateur à chiffrer l'appareil avant de continuer.
  • crée un profil professionnel ;
  • Supprime les applications non requises du profil professionnel.
  • Il copie l'application DPC dans le profil professionnel et le définit en tant que propriétaire du profil.

Ignorez onActivityResult() pour voir si le provisionnement a réussi:

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);
    }
}

Terminer l'activation du profil professionnel

Une fois le profil provisionné, le système appelle la méthode DeviceAdminReceiver.onProfileProvisioningComplete() de l'application DPC. Remplacez cette méthode de rappel pour terminer l'activation du profil professionnel.

Une implémentation de rappel DeviceAdminReceiver.onProfileProvisioningComplete() typique effectue les opérations suivantes:

Activer le profil professionnel

Une fois ces tâches terminées, appelez la méthode setProfileEnabled() du gestionnaire de règles relatives aux appareils pour activer le profil professionnel:

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);

Configurer des règles relatives aux appareils

L'application DPC applique les règles relatives aux appareils définies par un administrateur pour répondre aux exigences et aux contraintes d'une organisation. Par exemple, une règle de sécurité peut exiger que les appareils se verrouillent après un certain nombre de tentatives infructueuses de saisie du mot de passe. L'outil DPC interroge la console EMM pour connaître les stratégies actuelles, puis les applique à l'aide de l'API Device Administration (Administration des appareils).

Pour en savoir plus sur l'application des règles relatives aux appareils, consultez la section Règles.

Appliquer des configurations gérées aux applications professionnelles

Les configurations gérées vous permettent d'offrir à vos clients la possibilité de préconfigurer les applications dont ils ont approuvé le déploiement et de mettre à jour facilement ces applications lorsque la configuration doit changer. Lorsque vous configurez une application avant son déploiement, vous vous assurez que les règles de sécurité de l'organisation et les autres règles sont respectées lors de l'installation de l'application sur l'appareil cible.

Les fonctionnalités de l'application sont définies par le développeur de l'application dans un schéma XML (schéma des configurations gérées) qui accompagne l'application lors de son importation sur Google Play. Les développeurs d'applications peuvent consulter la page Configurer des configurations gérées pour en savoir plus.

Vous allez récupérer ce schéma depuis l'application à afficher pour les administrateurs de votre client dans votre console EMM, fournir une interface utilisateur dans laquelle les différentes options définies dans le schéma s'affichent et permettre aux administrateurs de préconfigurer les paramètres de l'application. La configuration gérée résultante définie par l'administrateur est généralement stockée sur le serveur EMM, qui utilise ensuite l'API EMM Play pour définir Managedconfigurationsfordevice ou Managedconfigurationsforuser. Pour en savoir plus, consultez la section Configurations gérées via Play.

Les configurations gérées peuvent être appliquées à l'application à l'aide de l'API EMM Play (approche recommandée) ou directement depuis le DPC (comme décrit dans la section Appliquer des configurations gérées directement à partir du DPC). L'utilisation de l'API EMM Play présente plusieurs avantages, y compris une implémentation facile, car la bibliothèque de support DPC permet de simplifier les tâches DPC. De plus, l'API EMM Play:

  • Définit la configuration de manière atomique lorsqu'une nouvelle application est installée, afin de s'assurer que l'application est prête la première fois que l'utilisateur la lance.
  • Permet de gérer les configurations par utilisateur, ce qui vous évite de surveiller le provisionnement de chaque appareil.

Appliquez des configurations gérées à l'aide de l'API Play EMM.

Pour utiliser l'API EMM Play pour les configurations gérées, l'outil DPC doit autoriser Google Play à définir des configurations. La bibliothèque Support DPC se charge de cette tâche en transmettant par proxy la configuration envoyée par Google Play.

Pour utiliser l'API Play EMM, téléchargez la bibliothèque de support DPC, puis activez la prise en charge des configurations gérées dans votre DPC.

Activez la prise en charge des configurations gérées dans votre DPC.

Importez cette classe dans votre DPC:

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

Initialisez la bibliothèque de configurations gérées. Dans cet exemple, "admin" est le ComponentName de DeviceAdminReceiver.

Kotlin

var managedConfigurationsSupport = ManagedConfigurationsSupport(context, admin)

Java

ManagedConfigurationsSupport managedConfigurationsSupport =
    new ManagedConfigurationsSupport(context, admin);

Activez les configurations gérées:

Kotlin

managedConfigurationsSupport.enableManagedConfigurations()

Java

managedConfigurationsSupport.enableManagedConfigurations();

Une fois cette bibliothèque initialisée dans votre DPC, vous pouvez utiliser l'API EMM Google Play dans votre console et votre serveur EMM pour appliquer des configurations gérées aux applications approuvées, au lieu de coder ces tâches directement dans la DPC. Pour en savoir plus, consultez la section Configurations gérées via Play.

Appliquez des configurations gérées directement depuis le DPC

Pour modifier les paramètres de configuration d'une application directement à partir du DPC, appelez la méthode DevicePolicyManager.setApplicationRestrictions() et transmettez les paramètres pour DeviceAdminReceiver de l'application DPC, le nom de package de l'application cible et le Bundle comprenant la configuration gérée de l'application telle que définie par l'administrateur. Pour en savoir plus, consultez Interactions entre votre DPC et la console EMM et Configurer des configurations gérées. Toutefois, notez que cette autre approche pour appliquer des configurations gérées n'est pas recommandée pour les déploiements de comptes Google Play d'entreprise.

Assistance pour le provisionnement des comptes Google Play d'entreprise

La bibliothèque de support DPC permet de provisionner les comptes Google Play gérés. Pour bénéficier de cette prise en charge, vous devez d'abord initialiser la bibliothèque. Vous pouvez ensuite vérifier que l'environnement de travail est utilisé et ajouter un compte Google Play géré.

Initialisez la prise en charge des comptes Google Play d'entreprise dans votre DPC.

Importez cette classe dans votre DPC:

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

Initialisez la bibliothèque de compatibilité de provisionnement. Dans cet exemple, "admin" correspond au ComponentName de DeviceAdminReceiver.

Kotlin

var androidForWorkAccountSupport = AndroidForWorkAccountSupport(context, admin)

Java

AndroidForWorkAccountSupport androidForWorkAccountSupport =
    new AndroidForWorkAccountSupport(context, admin);

Assurez-vous que l'environnement de travail des comptes Google Play d'entreprise

Une fois que l'outil DPC a provisionné un appareil en mode propriétaire de profil (ACTION_PROVISION_MANAGED_PROFILE) ou en mode propriétaire de l'appareil (ACTION_PROVISION_MANAGED_DEVICE), assurez-vous que l'appareil est compatible avec les comptes Google Play d'entreprise en appelant la méthode suivante:

Kotlin

androidForWorkAccountSupport.ensureWorkingEnvironment(callback)

Java

androidForWorkAccountSupport.ensureWorkingEnvironment(callback);

Le rappel signale la réussite ou l'échec de ce processus. Lorsque le rappel est renvoyé, un compte Google Play d'entreprise peut être ajouté. Si le rappel signale une erreur, invitez l'utilisateur à vérifier que l'appareil dispose d'une connexion réseau (par exemple, en cas d'échec du téléchargement). Dans les autres cas, signalez l'échec à 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)
    }
}

Ajouter un compte Google Play d'entreprise

Le fichier AccountManager du framework Android permet d'ajouter un compte Google Play d'entreprise à un appareil. Pour simplifier l'interaction avec AccountManager, utilisez la fonction d'assistance (illustrée dans l'exemple ci-dessous) de la bibliothèque Support DPC. La fonction gère le jeton renvoyé par le serveur Google Play et facilite le provisionnement du compte Google Play d'entreprise. La fonction est renvoyée lorsque l'état du compte Google Play d'entreprise est valide:

Kotlin

androidForWorkAccountSupport.addAndroidForWorkAccount(token, accountAddedCallback)

Java

androidForWorkAccountSupport.addAndroidForWorkAccount(token, accountAddedCallback);
  • token : jeton d'authentification de l'utilisateur généré par l'appel Users.generateAuthenticationToken() de l'API EMM Google Play.
  • accountAddedCallback : renvoie le compte Google Play d'entreprise qui a bien été ajouté à l'appareil. Ce rappel doit inclure les méthodes onAccountReady() et 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).
        }
};
  • Pour en savoir plus sur l'API Device Administration, consultez Administration des appareils.
  • Pour en savoir plus sur les méthodes de provisionnement d'Android Enterprise, consultez la section Provisionner des appareils du guide du développeur Android Enterprise.
  • Pour obtenir un exemple GitHub illustrant comment créer un profil professionnel de base, consultez BasicManagedProfile.
  • Pour obtenir un exemple GitHub montrant comment définir des configurations sur d'autres applications en tant que propriétaire de profil, consultez AppRestrictionEnforcer.