Guía para desarrolladores de Microsoft Intune App SDK para Android

El SDK de aplicaciones de Microsoft Intune para Android le permite incorporar directivas de protección de aplicaciones de Intune (también conocidas como directivas MAM) en su aplicación nativa de Android Java/Kotlin. Una aplicación administrada por Intune es aquella que está integrada con el SDK de la aplicación de Intune. Los administradores de Intune pueden implementar fácilmente directivas de protección de aplicaciones en la aplicación administrada por Intune cuando Intune administra activamente la aplicación.

Importante

Intune publica periódicamente actualizaciones para el SDK de la aplicación de Intune. Se recomienda suscribirse a los repositorios del SDK de aplicaciones de Intune para obtener actualizaciones de modo que pueda incorporar la actualización en el ciclo de lanzamiento de desarrollo de software y asegurarse de que las aplicaciones admiten la configuración más reciente de la directiva de protección de aplicaciones.

Planee realizar las actualizaciones obligatorias del SDK de la aplicación de Intune antes de cada versión principal del sistema operativo para asegurarse de que la aplicación siga ejecutándose sin problemas, ya que las actualizaciones del sistema operativo pueden provocar cambios importantes. Si no actualiza a la versión más reciente antes de una versión principal del sistema operativo, puede correr el riesgo de encontrar un cambio importante o no poder aplicar directivas de protección de aplicaciones a su aplicación.

Flujo del proceso

En el diagrama siguiente se proporciona el flujo de proceso del SDK de la aplicación de Intune para Android:

Diagrama arquitectónico de alto nivel para Microsoft Intune.

Objetivos de la etapa

La guía contiene más detalles sobre la arquitectura del SDK de aplicaciones de Intune, información acerca de pasos de integración poco comunes y otros contenidos útiles.

El SDK en mayor detalle

Reemplazos de clase y método

A través de las herramientas de compilación, el SDK de la aplicación de Intune intenta minimizar la carga de integración de los desarrolladores de Android. Antes de las herramientas de compilación, los desarrolladores necesitaban realizar todos los reemplazos manualmente.

Nota:

Las aplicaciones ahora deben integrarse con las herramientas de compilación del SDK, que realizarán todos estos reemplazos automáticamente.

Las clases base de Android se reemplazan con sus respectivos equivalentes MAM para habilitar la administración de Intune. Las clases SDK residen entre la clase base de Android y la versión derivada propia de la aplicación de esa clase. Por ejemplo, una actividad de la aplicación podría terminar con una jerarquía de herencia que se vea como: AppSpecificActivity extends MAMActivity extends Activity. La capa MAM filtra las llamadas a las operaciones del sistema para proporcionar sin problemas a la aplicación una vista administrada del mundo.

Además de las clases base, algunas clases que la aplicación puede usar sin derivar de (por ejemplo, MediaPlayer) también tienen equivalentes MAM necesarios y algunas llamadas a métodos también deben reemplazarse. En la tabla siguiente se enumeran muchos de los reemplazos de MAM.

Clase base de Android Reemplazo del SDK de la aplicación de Intune
android.app.Activity MAMActividad
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 (solo es necesario si el enlazador no se genera a partir de una interfaz de Lenguaje de definición de interfaz de Android (AIDL))
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étodos con nombre cambiado

En muchos casos, un método disponible en la clase Android se ha marcado como final en la clase de reemplazo de MAM. En este caso, la clase de reemplazo MAM proporciona un método con un nombre similar (generalmente con el sufijo MAM) que, en su lugar, debe invalidar. Por ejemplo, cuando se deriva de MAMActivity, en lugar de invalidar onCreate() y llamar , super.onCreate()Activity debe invalidar onMAMCreate() y llamar a super.onMAMCreate(). El compilador de Java debe aplicar las restricciones finales para evitar la anulación accidental del método original en lugar del equivalente de MAM.

Servicios del sistema ajustados

Para algunas clases de servicio del sistema, es necesario llamar a un método estático en una clase contenedor MAM en lugar de invocar directamente el método deseado en la instancia de servicio. Por ejemplo, una llamada a getSystemService(ClipboardManager.class).getPrimaryClip() debe convertirse en una llamada a MAMClipboardManager.getPrimaryClip(getSystemService(ClipboardManager.class). Una vez más, el complemento de compilación requerido realiza automáticamente estos reemplazos.

Clase Android Reemplazo del SDK de la aplicación de 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 Administración de 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

Algunas clases tienen la mayoría de sus métodos envueltos, por ejemplo, ClipboardManager, , ContentProviderClientContentResolver, , y PackageManager mientras que otras clases tienen solo uno o dos métodos envueltos, por ejemplo, DownloadManager, PrintHelperViewDragEventPrintManagerNotificationManager y .NotificationManagerCompat

Inscripción en MDM y MAM

Como se explicó en el registro frente a la inscripción de la fase 4, el SDK de la aplicación de Intune "inscribirá" las cuentas que la aplicación registre para que esa cuenta esté protegida con la directiva. La cuenta se administra después de que esta inscripción se realiza correctamente y las directivas MAM ahora deben aplicarse a esta cuenta.

El término "inscripción" también puede hacer referencia al proceso iniciado por el usuario final para habilitar la administración de dispositivos (MDM). La inscripción de MDM es totalmente independiente de la inscripción de la directiva de protección de aplicaciones.

Una aplicación integrada en SDK puede tener una cuenta inscrita para la Directiva de protección de aplicaciones sin que esa cuenta se inscriba para la Administración de dispositivos. Del mismo modo, un usuario puede haber inscrito un dispositivo para la administración de dispositivos sin tener ninguna aplicación integrada en SDK con cuentas inscritas para la directiva de protección de aplicaciones.

Normalmente, cuando los desarrolladores y administradores se refieren a la inscripción, se refieren a la inscripción de MDM, ya que la inscripción de la directiva de protección de aplicaciones es en gran medida invisible tanto para los desarrolladores como para los usuarios finales. Consulta Inscribir dispositivos Android para obtener más detalles sobre la inscripción de MDM.

Sugerencias de integración

Descripción de los registros del Portal de empresa

Los registros del portal de empresa contienen información que los ingenieros de Microsoft usan para investigar problemas. Algunos de los registros también pueden ser útiles para los desarrolladores que integran el SDK.

En concreto, el archivo DiagnosticsInfo-scrubbed.log contiene información sobre qué aplicaciones administra MAM y los detalles de la directiva de MAM en la PolicyDB Information sección. Cada aplicación administrada tiene una entrada en la PolicyDB Information sección. Debes buscar aquí el nombre del paquete de la aplicación para confirmar que la directiva MAM está dirigida correctamente a la aplicación. Si no ves el nombre del paquete de la aplicación aquí, indica que la cuenta que ha iniciado sesión no tiene aplicada la directiva de MAM.

Para obtener una descripción de cada configuración de directiva de MAM, consulte Configuración de directiva de protección de aplicaciones Android en Microsoft Intune. Para obtener una descripción de cómo se mostrará esta configuración en los registros del Portal de empresa, consulte Revisar los registros de protección de aplicaciones de cliente. Cuando la directiva MAM no se aplica según lo esperado, le recomendamos que compruebe los registros del Portal de empresa o la interfaz de usuario de diagnóstico, compruebe que la aplicación esté administrada por la directiva MAM y confirme que la configuración de directiva tiene los valores esperados.

Puede recopilar registros del Portal de empresa de una de las maneras siguientes:

  • A través del Portal de empresa
    • Abrir la aplicación Portal de empresa
    • Seleccione el menú de tres puntos en la esquina superior derecha
    • Selecciona Configuración
    • En Registros de diagnóstico, seleccione Guardar registros
    • Siga las indicaciones para elegir el directorio de salida para guardar los registros del Portal de empresa.
    • Usa adb shell pull el comando para extraer los registros del dispositivo Android al equipo local.
  • [Use Microsoft Edge para Android para acceder a los registros de aplicaciones administrados]. Se mostrará la interfaz de usuario para recopilar registros del Portal de empresa y ver diagnósticos de MAM.
  • Llamada MAMPolicyManager.showDiagnostics(context) para mostrar la misma interfaz de usuario para recopilar registros del Portal de empresa.

Pruebas rápidas con directivas cambiantes

A medida que desarrolla y prueba la integración de la aplicación del SDK de la aplicación de Intune, puede cambiar con frecuencia la configuración de la directiva de protección de aplicaciones para el usuario de prueba.

De manera predeterminada, las aplicaciones integradas se registrarán en el servicio de Intune para obtener la directiva actualizada cada 30 minutos, cuando esté activa. Puede evitar esta espera y forzar un registro a través del Portal de empresa:

  1. Inicie el Portal de empresa. No es necesario iniciar sesión.
  2. Seleccione el ... icono de menú.
  3. Seleccione Configuración.
  4. Desplácese hasta la configuración denominada "Directiva de administración".
  5. Presione el botón Sincronizar.

Esto programará inmediatamente una comprobación y recuperará la directiva actualizada dirigida a su aplicación y cuenta.

Solución de problemas de migración de AndroidX

Si integró el SDK de la aplicación de Intune antes de aprovechar AndroidX, es posible que encuentre un error como este al migrar a AndroidX:

incompatible types: android.support.v7.app.ActionBar cannot be converted to androidx.appcompat.app.ActionBar

Estos errores pueden producirse porque la aplicación hace referencia a las clases de compatibilidad heredadas del SDK. Las clases de soporte técnico MAM incluyen las clases de soporte técnico de Android que se han movido en AndroidX. Para combatir estos errores, reemplace todas las referencias de clase de compatibilidad de MAM con sus equivalentes de AndroidX. Esto se puede lograr quitando primero las dependencias de la biblioteca de compatibilidad de MAM de sus archivos de compilación de Gradle. Las líneas en cuestión tendrán un aspecto similar al siguiente:

implementation "com.microsoft.intune.mam:android-sdk-support-v4:$intune_mam_version"
implementation "com.microsoft.intune.mam:android-sdk-support-v7:$intune_mam_version"

A continuación, corrige los errores en tiempo de compilación resultantes reemplazando todas las referencias a clases MAM en los com.microsoft.intune.mam.client.support.v7 paquetes and com.microsoft.intune.mam.client.support.v4 con sus equivalentes de AndroidX. Por ejemplo, las referencias a MAMAppCompatActivity deben cambiarse por AppCompatActivityel archivo . Como se discutió anteriormente, el complemento / herramienta de compilación de MAM reescribirá automáticamente las clases en las bibliotecas de AndroidX con los equivalentes de MAM apropiados en tiempo de compilación.

Limitaciones y casos especiales

Inscripción predeterminada

La aplicación puede registrarse alternativamente en directivas de protección de aplicaciones a través de un proceso simplificado denominado inscripción predeterminada. Esta característica es principalmente para admitir aplicaciones de línea de negocio privadas que no han integrado MSAL.

Advertencia

La inscripción predeterminada tiene importantes ventajas y desventajas y no se recomienda. Las aplicaciones que aprovechan la inscripción predeterminada no admiten el acceso condicional, no se benefician del SSO con servicios Microsoft y no pueden ser utilizadas por cuentas que no son de Intune. Si la aplicación se envía a una tienda de aplicaciones pública, no se admite la inscripción predeterminada.

La inscripción predeterminada obligará al usuario final a instalar el Portal de empresa y completar un flujo de inscripción MAM antes de permitir que los usuarios ingresen a la aplicación.

Nota:

La inscripción predeterminada es compatible con la nube soberana.

Habilite la inscripción predeterminada con los pasos siguientes:

  1. Si la aplicación integra MSAL o necesita habilitar SSO, configure MSAL. Si no es así, puede omitir este paso.

  2. Habilite la inscripción predeterminada agregando el siguiente valor en el manifiesto bajo la <application> etiqueta:

    <meta-data android:name="com.microsoft.intune.mam.DefaultMAMServiceEnrollment" android:value="true" />
    
  3. Habilite la directiva de MAM necesaria al agregar el siguiente valor en el manifiesto bajo la <application> etiqueta:

    <meta-data android:name="com.microsoft.intune.mam.MAMPolicyRequired" android:value="true" />
    

Procesos aislados

El SDK de la aplicación de Intune no puede aplicar protecciones a procesos aislados. La compatibilidad con procesos aislados (android:isolatedProcess) requiere la adición de la etiqueta de metadatos a continuación.

Advertencia

Al agregar estos metadatos, la aplicación declara que el proceso aislado no puede exponer los datos de la organización. Su aplicación es responsable de garantizar esto.

<meta-data android:name="com.microsoft.intune.mam.AllowIsolatedProcesses" android:value="true" />

Restricciones de captura de pantalla personalizadas

Si la aplicación contiene una característica de captura de pantalla personalizada que omite la restricción de nivel FLAG_SECURE de Android, debes comprobar la directiva de captura de Windowpantalla antes de permitir el acceso completo a la característica. Por ejemplo, si la aplicación usa un motor de representación personalizado para representar la vista actual en un archivo PNG, primero debes comprobar AppPolicy.getIsScreenCaptureAllowed().

Si la aplicación no contiene ninguna característica de captura de pantalla personalizada o de terceros, no es necesario realizar ninguna acción para restringir las capturas de pantalla. La directiva de captura de pantalla se aplica automáticamente en el Window nivel para todas las aplicaciones integradas de MAM.

Cualquier intento del sistema operativo u otra aplicación de capturar un Window en su aplicación se bloqueará según sea necesario. Por ejemplo, si un usuario intenta capturar la pantalla de la aplicación a través de las características de captura de pantalla o grabación de pantalla integradas de Android, la captura se restringirá automáticamente sin la participación de la aplicación.

Limitaciones de aplicación de directivas

  • Uso de soluciones de contenido: la directiva de Intune "transferir o recibir" puede bloquear o bloquear parcialmente el uso de una resolución de contenido para acceder al proveedor de contenido en otra aplicación. Esto hará que ContentResolver los métodos devuelvan un valor nulo o arrojen un valor de error (por ejemplo, openOutputStream lo harán FileNotFoundException si se bloquean). La aplicación puede determinar si un error al escribir datos a través de una resolución de contenido fue causado por la directiva (o sería causado por la directiva) al realizar la llamada:

    MAMPolicyManager.getPolicy(currentActivity).getIsSaveToLocationAllowed(contentURI);
    

    o si no hay actividad asociada:

    MAMPolicyManager.getCurrentThreadPolicy().getIsSaveToLocationAllowed(contentURI);
    

    En este segundo caso, las aplicaciones multiidentidad deben tener cuidado de establecer la identidad del subproceso correctamente (o pasar una identidad explícita a una getPolicyForIdentity llamada).

Servicios exportados

El archivo AndroidManifest.xml incluido en el SDK de Intune App contiene MAMNotificationReceiverService, que debe ser un servicio exportado para permitir que el Portal de empresa envíe notificaciones a una aplicación administrada. El servicio comprueba el autor de la llamada para asegurarse de que solo el Portal de empresa puede enviar notificaciones.

Limitaciones de reflexión

Algunas de las clases base MAM (por ejemplo, , MAMDocumentsProvider) contienen métodos (basados en las clases base originales de Android) MAMActivityque usan tipos de parámetros o valores devueltos que solo están presentes por encima de ciertos niveles de API. Por este motivo, puede que no siempre sea posible utilizar la reflexión para enumerar todos los métodos de los componentes de la aplicación. Esta restricción no se limita a MAM, es la misma restricción que se aplicaría si la propia aplicación implementara estos métodos desde las clases base de Android.

Robolectric

No se admite la prueba del comportamiento del SDK de la aplicación de Intune en Robolectric. Hay problemas conocidos al ejecutar el SDK en Robolectric debido a comportamientos presentes en Robolectric que no imitan con precisión los de dispositivos reales o emuladores.

Si necesita probar su aplicación con Robolectric, la solución alternativa recomendada es mover la lógica de su clase de aplicación a un asistente y producir su apk de prueba unitaria con una clase de aplicación que no herede de MAMApplication.