Guide du SDK d’application Microsoft Intune pour les développeurs Android
Le SDK d’application Microsoft Intune pour Android vous permet d’incorporer des stratégies de protection des applications Intune (également appelées stratégies APP ou GAM) dans votre application Android Java/Kotlin native. Une application gérée par Intune est une application intégrée au SDK d’application Intune. Les administrateurs Intune peuvent facilement déployer des stratégies de protection des applications sur votre application gérée par Intune quand Intune gère activement l’application.
Importante
Intune publie régulièrement des mises à jour du Kit de développement logiciel (SDK) de l’application Intune. Nous vous recommandons de vous abonner aux référentiels du SDK d’application Intune pour les mises à jour afin de pouvoir incorporer la mise à jour dans votre cycle de publication de développement logiciel et de vous assurer que vos applications prennent en charge les derniers paramètres de stratégie de protection des applications.
Prévoyez de prendre des mises à jour obligatoires du SDK d’application Intune avant chaque version majeure du système d’exploitation pour vous assurer que votre application continue de s’exécuter sans problème, car les mises à jour du système d’exploitation peuvent entraîner des changements cassants. Si vous ne mettez pas à jour vers la dernière version avant une version majeure du système d’exploitation, vous risquez de rencontrer un changement cassant et/ou de ne pas pouvoir appliquer des stratégies de protection des applications à votre application.
Flux de processus
Le diagramme suivant fournit le flux de processus du SDK d’application Intune pour Android :
Objectifs de la phase
Le guide contient plus de détails sur l’architecture du SDK d’application Intune, des informations sur les étapes d’intégration inhabituelles et d’autres contenus utiles.
Le Kit de développement logiciel (SDK) plus en détail
Remplacements de classes et de méthodes
Grâce aux outils de génération, le SDK d’application Intune tente de réduire la charge d’intégration des développeurs Android. Avant les outils de génération, les développeurs devaient effectuer tous les remplacements manuellement.
Remarque
Les applications doivent maintenant s’intégrer aux outils de génération du SDK, qui effectuent tous ces remplacements automatiquement.
Les classes de base Android sont remplacées par leurs équivalents MAM respectifs afin d’activer la gestion Intune.
Les classes du KIT de développement logiciel (SDK) sont comprises entre la classe de base Android et la propre version dérivée de l’application de cette classe.
Par exemple, une activité d’application peut se retrouver avec une hiérarchie d’héritage qui ressemble à : AppSpecificActivity
étend MAMActivity
étend Activity
.
La couche GAM filtre les appels aux opérations système afin de fournir à votre application une vue managée du monde.
En plus des classes de base, certaines classes que votre application peut utiliser sans dériver de (par exemple MediaPlayer
) ont également des équivalents MAM requis, et certains appels de méthode doivent également être remplacés.
Le tableau ci-dessous répertorie un grand nombre de remplacements mam.
Classe de base Android | Remplacement du SDK d’application Intune |
---|---|
android.app.Activity | MAMActivity |
android.app.ActivityGroup | MAMActivityGroup |
android.app.AliasActivity | MAMAliasActivity |
android.app.Application | MAMApplication |
android.app.Dialog | MAMDialog |
android.app.AlertDialog.Builder | MAMAlertDialogBuilder |
android.app.DialogFragment | MAMDialogFragment |
android.app.ExpandableListActivity | MAMExpandableListActivity |
android.app.Fragment | MAMFragment |
android.app.IntentService | MAMIntentService |
android.app.LauncherActivity | MAMLauncherActivity |
android.app.ListActivity | MAMListActivity |
android.app.ListFragment | MAMListFragment |
android.app.NativeActivity | MAMNativeActivity |
android.app.PendingIntent | MAMPendingIntent |
android.app.Service | MAMService |
android.app.TabActivity | MAMTabActivity |
android.app.TaskStackBuilder | MAMTaskStackBuilder |
android.app.backup.BackupAgent | MAMBackupAgent |
android.app.backup.BackupAgentHelper | MAMBackupAgentHelper |
android.app.backup.FileBackupHelper | MAMFileBackupHelper |
android.app.backup.SharePreferencesBackupHelper | MAMSharedPreferencesBackupHelper |
android.app.job.JobService | MAMJobService |
android.content.BroadcastReceiver | MAMBroadcastReceiver |
android.content.ContentProvider | MAMContentProvider |
android.os.Binder | MAMBinder (nécessaire uniquement si le binder n’est pas généré à partir d’une interface AIDL (Android Interface Definition Language) |
android.media.MediaPlayer | MAMMediaPlayer |
android.media.MediaMetadataRetriever | MAMMediaMetadataRetriever |
android.media.MediaRecorder | MAMMediaRecorder |
android.provider.DocumentsProvider | MAMDocumentsProvider |
android.preference.PreferenceActivity | MAMPreferenceActivity |
android.widget.PopupWindow | MAMPopupMenu |
android.widget.PopupWindow | MAMPopupWindow |
android.widget.ListPopupWindow | MAMListPopupWindow |
android.widget.TextView | MAMTextView |
android.widget.AutoCompleteTextView | MAMAutoCompleteTextView |
android.widget.CheckedTextView | MAMCheckedTextView |
android.widget.EditText | MAMEditText |
android.inputmethodservice.ExtractEditText | MAMExtractEditText |
android.widget.MultiAutoCompleteTextView | MAMMultiAutoCompleteTextView |
android.view.LayoutInflater | MAMLayoutInflater |
android.view.ViewGroup | MAMViewGroup |
android.view.SurfaceView | MAMSurfaceView |
android.opengl.GLSurfaceView | MAMGLSurfaceView |
android.widget.VideoView | MAMVideoView |
Méthodes renommées
Dans de nombreux cas, une méthode disponible dans la classe Android a été marquée comme finale dans la classe de remplacement MAM.
Dans ce cas, la classe de remplacement MAM fournit une méthode nommée de même nom (généralement avec MAM
le suffixe ) que vous devez remplacer à la place.
Par exemple, lors de la dérivation de MAMActivity, au lieu de remplacer onCreate()
et d’appeler super.onCreate()
, Activity
doit remplacer onMAMCreate()
et appeler super.onMAMCreate()
.
Le compilateur Java doit appliquer les restrictions finales pour empêcher le remplacement accidentel de la méthode d’origine au lieu de l’équivalent GAM.
Services système encapsulés
Pour certaines classes de service système, il est nécessaire d’appeler une méthode statique sur une classe wrapper GAM au lieu d’appeler directement la méthode souhaitée sur l’instance de service.
Par exemple, un appel à getSystemService(ClipboardManager.class).getPrimaryClip()
doit devenir un appel à MAMClipboardManager.getPrimaryClip(getSystemService(ClipboardManager.class)
.
Là encore, le plug-in de build requis effectue automatiquement ces remplacements.
Android, classe | Remplacement du SDK d’application Intune |
---|---|
android.content.ClipboardManager | MAMClipboard |
android.content.ContentProviderClient | MAMContentProviderClientManagement |
android.content.ContentResolver | MAMContentResolverManagement |
android.content.pm.PackageManager | MAMPackageManagement |
android.app.DownloadManager | MAMDownloadManagement |
android.print.PrintManager | MAMPrintManagement |
android.view.View | MAMViewManagement |
android.view.DragEvent | MAMDragEventManagement |
android.view.LayoutInflater | MAMLayoutInflaterManagement |
android.app.NotificationManager | MAMNotificationManagement |
android.app.blob.BlobStoreManager | MAMBlobStoreManager |
android.app.blob.BlobStoreManager.Session | MAMBlobStoreManager.Session |
Certaines classes ont la plupart de leurs méthodes encapsulées, par exemple, , , et tandis que d’autres classes n’ont qu’une ou deux méthodes encapsulées, par exemple, DownloadManager
, PrintHelper
PrintManager
, DragEvent
View
, NotificationManager
et NotificationManagerCompat
.PackageManager
ContentResolver
ContentProviderClient
ClipboardManager
Inscription mdm et GAM
Comme indiqué dans l’étape 4 d’inscription et d’inscription, le SDK d’application Intune « inscrit » les comptes que votre application inscrit afin que ce compte soit protégé par une stratégie. Le compte est géré une fois cette inscription réussie, et les stratégies GAM doivent maintenant être appliquées à ce compte.
Le terme « inscription » peut également faire référence au processus initié par l’utilisateur final pour activer la gestion des appareils (GPM). L’inscription mdm est entièrement distincte de l’inscription à la stratégie de protection des applications.
Une application intégrée au KIT de développement logiciel (SDK) peut avoir un compte inscrit pour la stratégie de protection des applications sans que ce compte ne soit inscrit à gestion des appareils. De même, un utilisateur peut avoir inscrit un appareil pour la gestion des appareils sans avoir d’applications intégrées au KIT de développement logiciel (SDK) avec des comptes inscrits pour la stratégie de protection des applications.
En règle générale, lorsque les développeurs et les administrateurs font référence à l’inscription, ils font référence à l’inscription GPM, car l’inscription de la stratégie de protection des applications est en grande partie invisible pour les développeurs et les utilisateurs finaux. Pour plus d’informations sur l’inscription mdm, consultez Inscrire des appareils Android .
Conseils d’intégration
Présentation des journaux d’activité portail d’entreprise
Les journaux du portail d’entreprise contiennent des informations que les ingénieurs Microsoft utilisent pour les enquêtes sur les problèmes. Certains journaux peuvent également être utiles pour les développeurs qui intègrent le Kit de développement logiciel (SDK).
En particulier, le fichier DiagnosticsInfo-scrubbed.log
contient des informations sur les applications gérées par gam et les détails de la stratégie GAM dans la PolicyDB Information
section .
Chaque application gérée a une entrée dans la PolicyDB Information
section .
Vous devez rechercher le nom du package de votre application ici pour vérifier que la stratégie GAM est correctement ciblée sur votre application.
Si vous ne voyez pas le nom du package de votre application ici, cela indique que la stratégie GAM n’est pas appliquée au compte connecté.
Pour obtenir une description sur chaque paramètre de stratégie GAM, consultez Paramètres de stratégie de protection des applications Android dans Microsoft Intune. Pour obtenir une description de la façon dont ces paramètres s’affichent dans les journaux du portail d’entreprise, consultez Examiner les journaux de protection des applications clientes. Lorsque la stratégie GAM n’est pas appliquée comme prévu, nous vous recommandons de consulter les journaux du Portail d’entreprise ou l’interface utilisateur de diagnostic, de vérifier que votre application est gérée par la stratégie GAM et de vérifier que les paramètres de stratégie ont des valeurs attendues.
Vous pouvez collecter les journaux d’activité portail d’entreprise de l’une des manières suivantes :
- Via le portail d’entreprise
- Ouvrir l’application Portail d’entreprise
- Sélectionnez le menu à trois points dans le coin supérieur droit
- Sélectionnez Paramètres
- Sous Journaux de diagnostic, sélectionnez Enregistrer les journaux.
- Suivez l’invite pour choisir le répertoire de sortie pour enregistrer les journaux du portail d’entreprise.
- Utilisez
adb shell pull
la commande pour extraire les journaux de votre appareil Android vers votre ordinateur local.
- [Utiliser Microsoft Edge pour Android pour accéder aux journaux d’activité des applications gérées]. Cela affiche l’interface utilisateur pour la collecte des journaux d’activité du portail d’entreprise et l’affichage des diagnostics GAM.
- Appelez
MAMPolicyManager.showDiagnostics(context)
pour afficher la même interface utilisateur pour collecter les journaux du portail d’entreprise.
Test rapide avec changement de stratégie
Lorsque vous développez et testez l’intégration de votre application du KIT de développement logiciel (SDK) d’application Intune, vous pouvez fréquemment modifier les paramètres de stratégie de protection des applications pour votre utilisateur de test.
Par défaut, les applications intégrées vérifient auprès du service Intune la stratégie mise à jour toutes les 30 minutes, lorsqu’elles sont actives. Vous pouvez éviter cette attente et forcer un enregistrement via le portail d’entreprise :
- Lancez le Portail d’entreprise. Vous n’avez pas besoin de vous connecter.
- Sélectionnez le bouton ... icône de menu.
- Sélectionnez Paramètres.
- Faites défiler jusqu’au paramètre appelé « Stratégie de gestion ».
- Appuyez sur le bouton Synchroniser.
Cela planifiera immédiatement un enregistrement et récupérera la stratégie à jour ciblée sur votre application et votre compte.
Résolution des problèmes de migration AndroidX
Si vous avez intégré le SDK d’application Intune avant de tirer parti d’AndroidX, vous pouvez rencontrer une erreur comme celle-ci lors de la migration vers AndroidX :
incompatible types: android.support.v7.app.ActionBar cannot be converted to androidx.appcompat.app.ActionBar
Ces erreurs peuvent se produire car votre application fait référence aux classes de prise en charge héritées du SDK. Les classes de support MAM encapsulent les classes de support Android qui ont été déplacées dans AndroidX. Pour lutter contre ces erreurs, remplacez toutes les références de classe de gestion des applications mobiles par leurs équivalents AndroidX. Pour ce faire, supprimez d’abord les dépendances de la bibliothèque de prise en charge MAM de vos fichiers de build Gradle. Les lignes en question ressemblent à ce qui suit :
implementation "com.microsoft.intune.mam:android-sdk-support-v4:$intune_mam_version"
implementation "com.microsoft.intune.mam:android-sdk-support-v7:$intune_mam_version"
Ensuite, corrigez les erreurs résultantes au moment de la compilation en remplaçant toutes les références aux classes GAM dans les com.microsoft.intune.mam.client.support.v7
packages et com.microsoft.intune.mam.client.support.v4
par leurs équivalents AndroidX.
Par exemple, les références à MAMAppCompatActivity
doivent être remplacées par androidX AppCompatActivity
.
Comme indiqué ci-dessus, le plug-in/outil de génération MAM réécrit automatiquement les classes dans les bibliothèques AndroidX avec les équivalents MAM appropriés au moment de la compilation.
Limitations et cas spéciaux
Inscription par défaut
Votre application peut également s’inscrire aux stratégies de protection des applications via un processus simplifié appelé inscription par défaut. Cette fonctionnalité est principalement destinée à prendre en charge les applications métier privées qui n’ont pas intégré MSAL.
Avertissement
L’inscription par défaut est accompagnée de compromis importants et n’est pas recommandée. Les applications tirant parti de l’inscription par défaut ne prennent pas en charge l’accès conditionnel, ne bénéficient pas de l’authentification unique avec les services Microsoft et ne peuvent pas être utilisées par des comptes non-Intune. Si votre application est fournie à un magasin d’applications public, l’inscription par défaut n’est pas prise en charge.
L’inscription par défaut force l’utilisateur final à installer le portail d’entreprise et à effectuer un flux d’inscription MAM avant d’autoriser les utilisateurs à entrer dans votre application.
Remarque
L’inscription par défaut est prise en charge du cloud souverain.
Activez l’inscription par défaut en procédant comme suit :
Si votre application intègre MSAL ou si vous devez activer l’authentification unique, configurez MSAL. Si ce n’est pas le cas, vous pouvez ignorer cette étape.
Activez l’inscription par défaut en ajoutant la valeur suivante dans le manifeste sous la
<application>
balise :<meta-data android:name="com.microsoft.intune.mam.DefaultMAMServiceEnrollment" android:value="true" />
Activez la stratégie GAM requise en ajoutant la valeur suivante dans le manifeste sous la
<application>
balise :<meta-data android:name="com.microsoft.intune.mam.MAMPolicyRequired" android:value="true" />
Processus isolés
Le SDK d’application Intune ne peut pas appliquer de protections à des processus isolés.
La prise en charge des processus isolés (android:isolatedProcess
) nécessite l’ajout de la balise de métadonnées ci-dessous.
Avertissement
En ajoutant ces métadonnées, votre application déclare que le processus isolé ne peut pas exposer les données de l’organisation. C’est à votre application qu’il incombe de garantir cela.
<meta-data android:name="com.microsoft.intune.mam.AllowIsolatedProcesses" android:value="true" />
Restrictions de capture d’écran personnalisées
Si votre application contient une fonctionnalité de capture d’écran personnalisée qui contourne la restriction de Window
niveau FLAG_SECURE
Android, vous devez vérifier la stratégie de capture d’écran avant d’autoriser l’accès complet à la fonctionnalité.
Par exemple, si votre application utilise un moteur de rendu personnalisé pour afficher la vue actuelle dans un fichier PNG, vous devez d’abord vérifier AppPolicy.getIsScreenCaptureAllowed()
.
Si votre application ne contient aucune fonctionnalité de capture d’écran personnalisée ou tierce, vous n’êtes pas obligé d’effectuer une action pour restreindre les captures d’écran.
La stratégie de capture d’écran est automatiquement appliquée au Window
niveau de toutes les applications intégrées GAM.
Toutes les tentatives effectuées par le système d’exploitation ou une autre application pour capturer un Window
dans votre application seront bloquées en fonction des besoins.
Par exemple, si un utilisateur tente de capturer l’écran de votre application via la capture d’écran intégrée d’Android ou les fonctionnalités d’enregistrement d’écran, la capture est automatiquement restreinte sans participation de votre application.
Limitations de l’application de la stratégie
Utilisation des programmes de résolution de contenu : la stratégie Intune « transférer ou recevoir » peut bloquer ou partiellement l’utilisation d’un programme de résolution de contenu pour accéder au fournisseur de contenu dans une autre application. Ainsi, les
ContentResolver
méthodes retournent la valeur Null ou lèvent une valeur d’échec (par exemple,openOutputStream
si elles sontFileNotFoundException
bloquées). L’application peut déterminer si un échec d’écriture de données via un programme de résolution de contenu est dû à une stratégie (ou est dû à une stratégie) en effectuant l’appel :MAMPolicyManager.getPolicy(currentActivity).getIsSaveToLocationAllowed(contentURI);
ou s’il n’y a aucune activité associée :
MAMPolicyManager.getCurrentThreadPolicy().getIsSaveToLocationAllowed(contentURI);
Dans ce deuxième cas, les applications multi-identités doivent prendre soin de définir l’identité de thread de manière appropriée (ou passer une identité explicite à un
getPolicyForIdentity
appel).
Services exportés
Le fichier AndroidManifest.xml inclus dans le SDK d’application Intune contient MAMNotificationReceiverService, qui doit être un service exporté pour permettre au portail d’entreprise d’envoyer des notifications à une application gérée. Le service vérifie l’appelant pour s’assurer que seul le portail d’entreprise est autorisé à envoyer des notifications.
Limitations de la réflexion
Certaines classes de base MAM (par exemple, MAMActivity
, MAMDocumentsProvider
) contiennent des méthodes (basées sur les classes de base Android d’origine) qui utilisent des types de paramètre ou de retour uniquement présents au-dessus de certains niveaux d’API.
Pour cette raison, il n’est pas toujours possible d’utiliser la réflexion pour énumérer toutes les méthodes des composants de l’application.
Cette restriction n’est pas limitée à la gestion des applications mobiles. Il s’agit de la même restriction qui s’appliquerait si l’application elle-même implémentait ces méthodes à partir des classes de base Android.
Robolectric
Le test du comportement du SDK d’application Intune sous Robolectric n’est pas pris en charge. Il existe des problèmes connus lors de l’exécution du KIT de développement logiciel (SDK) sous Robolectric en raison de comportements présents sous Robolectric qui n’imitent pas précisément ceux-ci sur des appareils réels ou des émulateurs.
Si vous devez tester votre application sous Robolectric, la solution recommandée consiste à déplacer votre logique de classe d’application vers une assistance et à produire votre apk de test unitaire avec une classe d’application qui n’hérite pas de MAMApplication.