Microsoft Intune App SDK for Android 开发人员指南

Microsoft Intune App SDK for Android 允许将 Intune 应用保护策略 (也称为 APP 或 MAM 策略) 合并到本机 Java/Kotlin Android 应用中。 Intune 托管的应用程序是与 Intune 应用 SDK 集成的应用程序。 当 Intune 主动管理应用时,Intune 管理员可以轻松地将应用保护策略部署到 Intune 托管的应用。

重要

Intune 定期发布 Intune 应用 SDK 的更新。 建议订阅 Intune 应用 SDK 存储库以获取更新,以便将更新合并到软件开发发布周期,并确保应用支持最新的应用保护策略设置。

计划在每个主要 OS 版本之前执行必需的 Intune 应用 SDK 更新,以确保应用继续顺利运行,因为 OS 更新可能会导致中断性变更。 如果未在主要 OS 版本之前更新到最新版本,则可能会遇到中断性变更和/或无法将应用保护策略应用到应用的风险。

流程流

下图提供了适用于 Android 的 Intune App SDK 进程流:

Microsoft Intune 的高级体系结构图。

阶段目标

本指南包含有关 Intune 应用 SDK 体系结构的更多详细信息、有关不常见集成步骤的信息以及其他有用的内容。

更详细的 SDK

类和方法替换

通过 生成工具,Intune 应用 SDK 尝试将 Android 开发人员的集成负担降到最低。 在生成工具之前,开发人员需要手动执行所有替换。

注意

应用现在 必须与 SDK 生成工具集成,该工具将自动执行所有这些替换。

为了启用 Intune 管理,Android 基类将替换为其各自的 MAM 等效项。 SDK 类位于 Android 基类和该类的应用自己的派生版本之间。 例如,应用活动最终可能会生成类似于: AppSpecificActivity extends MAMActivity extends extends Activity的继承层次结构。 MAM 层筛选对系统操作的调用,以便无缝地为应用提供托管的世界视图。

除了基类之外,你的应用可能使用的一些类无需派生自 (例如 MediaPlayer ,) 也具有必需的 MAM 等效项,并且 某些方法调用也必须替换。 下表列出了许多 MAM 替换项。

Android 基类 Intune 应用 SDK 替换
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 (仅当绑定器不是从 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

重命名的方法

在许多情况下,Android 类中可用的方法已在 MAM 替换类中标记为最终方法。 在这种情况下,MAM 替换类提供了一个类似名称的方法, (通常以 MAM 应替代的) 作为后缀。 例如,从 MAMActivity 派生时,必须重写onMAMCreate()并调用 ,Activity而不是重写onCreate()和调用 super.onCreate()super.onMAMCreate()。 Java 编译器应强制实施最终限制,以防止意外重写原始方法而不是 MAM 等效方法。

包装系统服务

对于某些系统服务类,需要在 MAM 包装类上调用静态方法,而不是直接在服务实例上调用所需的方法。 例如,对 的 getSystemService(ClipboardManager.class).getPrimaryClip() 调用必须成为对 的 MAMClipboardManager.getPrimaryClip(getSystemService(ClipboardManager.class)调用。 同样,所需的生成插件会自动进行这些替换。

Android 类 Intune 应用 SDK 替换
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

某些类的大多数方法都已包装,例如 、ClipboardManagerContentProviderClientContentResolverPackageManager ,而其他类只包装了一个或两个方法,例如、DownloadManagerPrintHelperPrintManagerViewDragEventNotificationManagerNotificationManagerCompat

MDM 和 MAM 注册

阶段 4 的注册与注册中所述,Intune 应用 SDK 将“注册”应用注册的帐户,以便该帐户受策略保护。 此注册成功后,帐户将变为托管帐户,现在应将 MAM 策略应用于此帐户。

术语“注册”还可以指最终用户为启用设备管理 (MDM) 而发起的过程。 MDM 注册与应用保护策略注册完全分开。

SDK 集成应用可以注册应用保护策略的帐户,而无需为设备管理注册该帐户。 同样,用户可以注册设备进行设备管理,而无需拥有任何 SDK 集成应用,并且帐户已注册应用保护策略。

通常,当开发人员和管理员引用注册时,他们指的是 MDM 注册,因为应用保护策略注册对开发人员和最终用户都基本上不可见。 有关 MDM 注册的更多详细信息,请参阅 注册 Android 设备

集成提示

了解公司门户日志

公司门户日志包含Microsoft工程师用于问题调查的信息。 某些日志对于集成 SDK 的开发人员也很有用。

具体而言,该文件 DiagnosticsInfo-scrubbed.log 包含有关哪些应用由 MAM 管理的信息,以及 部分中的 PolicyDB Information MAM 策略详细信息。 每个托管应用在 PolicyDB Information 部分中都有一个条目。 应在此处查找应用的包名称,以确认 MAM 策略已正确面向你的应用。 如果在此处看不到应用的包名称,则表示登录的帐户未应用 MAM 策略。

有关每个 MAM 策略设置的说明,请参阅 Microsoft Intune 中的 Android 应用保护策略设置。 有关这些设置在公司门户日志中的显示方式的说明,请参阅 查看客户端应用保护日志。 如果未按预期强制实施 MAM 策略,建议检查公司门户日志或诊断 UI,验证应用是否由 MAM 策略管理,并确认策略设置具有预期值。

可以通过以下方法之一收集公司门户日志:

  • 通过公司门户
    • 打开公司门户应用
    • 选择右上角的三点菜单
    • 选择“设置”
    • 在“诊断日志”下,选择“保存日志”
    • 按照提示选择输出目录以保存公司门户日志。
    • 使用 adb shell pull 命令将日志从 Android 设备拉取到本地计算机。
  • [使用 Microsoft Edge for Android 访问托管应用日志]。 这将显示用于收集公司门户日志和查看 MAM 诊断的 UI。
  • 调用 MAMPolicyManager.showDiagnostics(context) 以显示用于收集公司门户日志的相同 UI。

使用更改策略快速测试

在开发和测试 Intune 应用 SDK 的应用集成时,可能会经常更改测试用户的应用保护策略设置。

默认情况下,集成应用将在活动时每隔 30 分钟通过 Intune 服务签入更新的策略。 可以避免这种等待,并通过公司门户强制签入:

  1. 启动公司门户。 无需登录。
  2. 选择...菜单图标。
  3. 选择“设置”。
  4. 滚动到名为“管理策略”的设置。
  5. 按“同步”按钮。

这会立即安排签入,并检索面向你的应用和帐户的最新策略。

AndroidX 迁移疑难解答

如果在利用 AndroidX 之前 集成了 Intune App SDK,则在迁移到 AndroidX 时可能会遇到如下错误:

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

由于应用引用了 SDK 的旧版支持类,因此可能会出现这些错误。 MAM 支持类包装在 AndroidX 中移动的 Android 支持类。 若要解决此类错误,请将所有 MAM 支持类引用替换为其 AndroidX 等效项。 这可以通过首先从 Gradle 生成文件中删除 MAM 支持库依赖项来实现。 有问题的行如下所示:

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

然后,通过将 和 com.microsoft.intune.mam.client.support.v4 包中com.microsoft.intune.mam.client.support.v7对 MAM 类的所有引用替换为其 AndroidX 等效项来修复生成的编译时错误。 例如,对 的引用 MAMAppCompatActivity 应更改为 AndroidX 的 AppCompatActivity。 如上所述,MAM 生成插件/工具将在编译时使用适当的 MAM 等效项自动重写 AndroidX 库中的类。

限制和特殊情况

默认注册

应用程序可以通过称为 默认注册的简化过程来交替注册应用保护策略。 此功能主要用于支持未集成 MSAL 的专用业务线应用。

警告

默认注册具有重大利弊, 不建议这样做。 利用默认注册的应用不支持条件访问,不会受益于具有Microsoft服务的 SSO,并且不能由非 Intune 帐户使用。 如果应用发布到公共应用商店,则不支持默认注册。

默认注册将强制最终用户安装公司门户并完成 MAM 注册流,然后再允许用户进入应用程序。

注意

默认注册是主权云感知。

使用以下步骤启用默认注册:

  1. 如果应用集成了 MSAL 或需要启用 SSO, 请配置 MSAL。 如果没有,可以跳过此步骤。

  2. 通过在标记下的 <application> 清单中添加以下值来启用默认注册:

    <meta-data android:name="com.microsoft.intune.mam.DefaultMAMServiceEnrollment" android:value="true" />
    
  3. 通过在标记下的 <application> 清单中添加以下值来启用所需的 MAM 策略:

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

独立进程

Intune 应用 SDK 无法对独立进程应用保护。 支持独立进程 (android:isolatedProcess) 需要添加以下元数据标记。

警告

通过添加此元数据,应用程序声明独立进程无法公开组织数据。 应用程序负责保证这一点。

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

自定义屏幕捕获限制

如果应用包含绕过 Android 级别FLAG_SECURE限制的Window自定义屏幕捕获功能,则必须在允许完全访问该功能之前检查屏幕截图策略。 例如,如果应用使用自定义呈现引擎将当前视图呈现为 PNG 文件,则必须首先检查 AppPolicy.getIsScreenCaptureAllowed()

如果你的应用不包含任何自定义或第三方屏幕捕获功能,则无需执行任何操作来限制屏幕捕获。 屏幕捕获策略在所有 MAM 集成应用的级别自动强制实施 Window

OS 或其他应用在应用中捕获 Window 的任何尝试都将根据需要被阻止。 例如,如果用户尝试通过 Android 的内置屏幕截图或屏幕录制功能捕获应用的屏幕,则捕获将自动受到限制,而无需应用参与。

策略强制实施限制

  • 使用内容解析程序:“传输或接收”Intune 策略可能会阻止或部分阻止使用内容解析程序访问其他应用中的内容提供程序。 这将导致 ContentResolver 方法返回 null 或引发失败值 (例如, openOutputStream 如果阻塞) 将引发 FileNotFoundException 。 应用可以确定通过内容解析程序写入数据失败是由策略 (引起的,还是由策略) 调用引起的:

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

    如果没有关联的活动,则为 :

    MAMPolicyManager.getCurrentThreadPolicy().getIsSaveToLocationAllowed(contentURI);
    

    在此第二种情况下,多标识应用必须注意适当地 (设置线程标识,或将显式标识传递给 getPolicyForIdentity 调用) 。

导出的服务

Intune App SDK 中包含的 AndroidManifest.xml 文件包含 MAMNotificationReceiverService,它必须是导出的服务,才能允许公司门户向托管应用发送通知。 该服务会检查调用方,以确保仅允许公司门户发送通知。

反射限制

例如, MAMActivityMAMDocumentsProvider 某些 MAM 基类 (,) 包含基于原始 Android 基类 (的方法) 这些基类使用仅在某些 API 级别以上存在的参数或返回类型。 因此,可能无法始终使用反射来枚举应用组件的所有方法。 此限制不限于 MAM,它与应用本身从 Android 基类实现这些方法时适用的限制相同。

Robolectric

不支持在 Robolectric 下测试 Intune 应用 SDK 行为。 在 Robolectric 下运行 SDK 时存在已知问题,因为 Robolectric 下存在的行为无法准确模拟真实设备或仿真器上的行为。

如果需要在 Robolectric 下测试应用程序,建议的解决方法是将应用程序类逻辑移动到帮助程序,并使用不从 MAMApplication 继承的应用程序类生成单元测试 apk。