适用于 Android 的 Microsoft Intune App SDK 允许将 Intune 应用保护策略 (也称为 MAM 策略) 合并到本机 Java/Kotlin Android 应用中。 Intune 托管的应用程序是与 Intune 应用 SDK 集成的应用程序。 当 Intune 主动管理应用时,Intune 管理员可以轻松地将应用保护策略部署到 Intune 管理的应用。
重要
Intune 定期发布 Intune 应用 SDK 的更新。 建议订阅 Intune 应用 SDK 存储库以获取更新,以便将更新合并到软件开发发布周期中,并确保应用支持最新的应用保护策略设置。
计划在每个主要操作系统发布之前进行强制 Intune 应用 SDK 更新,以确保在操作系统更新可能导致重大更改的情况下继续平稳运行。 如果在主要操作系统发布之前未更新到最新版本,则可能会面临遇到重大更改和/或无法将应用保护策略应用于应用的风险。
进程流
下图提供了适用于 Android 的 Intune App SDK 进程流:
阶段目标
本指南包含有关 Intune App SDK 体系结构的更多详细信息、有关不常见集成步骤的信息以及其他有用的内容。
更详细的 SDK
类和方法替换
通过生成工具,Intune 应用 SDK 尝试最大程度地减少 Android 开发人员的集成负担。 在生成工具之前,开发人员需要手动执行所有替换。
注意
应用现在 必须 与 SDK 生成工具集成,这将自动执行所有这些替换。
Android 基类将替换为其各自的 MAM 等效项,以便启用 Intune 管理。
SDK 类位于 Android 基类和该类的应用自身派生版本之间。
例如,应用活动最终可能会采用如下所示 AppSpecificActivity 的继承层次结构: extends MAMActivity extends Activity。
MAM 层筛选对系统操作的调用,以便无缝地为应用提供托管的世界视图。
除了基类之外,应用可能使用的某些类(例如派 MediaPlayer 生自 (类)) 也具有必需的 MAM 等效项, 某些方法调用也必须替换。
下表列出了许多 MAM 替换。
| Android 基类 | Intune 应用 SDK 更换 |
|---|---|
| android.app.活动 | MAMActivity |
| android.app.ActivityGroup | MAMActivityGroup |
| android.app.AliasActivity | MAMAliasActivity |
| android.app.应用 | 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 (仅当 Binder 不是从 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 替换类中标记为 final。
在这种情况下,MAM 替换类提供了一个类似命名的方法 (通常以应替代的) 作为后缀 MAM 。
例如,当从 MAMActivity 派生时,不是重写和调用 onCreate()super.onCreate(), Activity 必须重写 onMAMCreate() 和调用 super.onMAMCreate()。
Java 编译器应强制实施最终限制,以防止意外覆盖原始方法(而不是 MAM 等效方法)。
打包的系统服务
对于某些系统服务类,需要在 MAM 包装器类上调用静态方法,而不是直接在服务实例上调用所需的方法。
例如,对 must 的 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 |
有些类包装了大部分方法,例如 、 、 ,而其他类只包装了一个或两个方法,例如 DownloadManager、 PrintHelperDragEventNotificationManagerViewNotificationManagerCompatPrintManager和 。PackageManagerContentResolverContentProviderClientClipboardManager
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 服务检查一次更新的策略。 可以避免此等待,并通过公司门户强制检查:
- 启动公司门户。 无需登录。
- 选择 ...菜单图标。
- 选择“设置”。
- 滚动到名为“管理策略”的设置。
- 按“同步”按钮。
这将立即安排检查,并检索针对您的应用和帐户的最新策略。
AndroidX 迁移疑难解答
如果在使用 AndroidX 之前集成了 Intune 应用 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"
然后,通过将 and 包中com.microsoft.intune.mam.client.support.v7com.microsoft.intune.mam.client.support.v4对 MAM 类的所有引用替换为等效的 AndroidX 类来修复产生的编译时错误。
例如,对 MAMAppCompatActivity 的引用应更改为 AndroidX 的。AppCompatActivity
如上所述,MAM 生成插件/工具将在编译时使用相应的 MAM 等效项自动重写 AndroidX 库中的类。
限制和特殊情况
默认注册
应用程序可以通过称为 默认注册的简化过程交替注册应用保护策略。 此功能主要支持尚未集成 MSAL 的专用业务线应用。
警告
默认注册会带来重大折衷,因此 不建议这样做。 使用默认注册的应用不支持条件访问,不能从与 Microsoft 服务的 SSO 中受益,并且不能由非 Intune 帐户使用。 如果应用发运到公共应用商店,则不支持默认注册。
默认注册将强制最终用户安装公司门户并完成 MAM 注册流,然后才允许用户进入应用程序。
注意
默认注册是主权云感知。
通过以下步骤启用默认注册:
如果你的应用集成了 MSAL 或需要启用 SSO,请 配置 MSAL。 如果没有,可以跳过此步骤。
通过在清单中的标记下
<application>添加以下值来启用默认注册:<meta-data android:name="com.microsoft.intune.mam.DefaultMAMServiceEnrollment" android:value="true" />通过在清单中的标记下
<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 级别WindowFLAG_SECURE限制的自定义屏幕捕获功能,则必须先检查屏幕捕获策略,然后才能允许对该功能的完全访问权限。
例如,如果您的应用使用自定义呈现引擎将当前视图呈现为 PNG 文件,则必须先检查 AppPolicy.getIsScreenCaptureAllowed()。
如果你的应用不包含任何自定义或第三方屏幕捕获功能,则无需执行任何操作来限制屏幕捕获。
屏幕捕获策略会在所有 MAM 集成应用级别自动强制实施 Window 。
将根据需要阻止 OS 或其他应用在你的应用中捕获 的任何 Window 尝试。
例如,如果用户尝试通过 Android 内置的屏幕截图或屏幕录制功能捕获应用的屏幕,则将自动限制捕获,而无需应用参与。
策略强制限制
使用内容解析程序:“传输或接收”Intune 策略可能会阻止或部分阻止使用内容解析程序访问其他应用中的内容提供程序。 这将导致
ContentResolver方法返回 null 或引发失败值 (例如,openOutputStream如果被阻止) 则引发FileNotFoundException。 通过调用,应用可以确定无法通过内容解析器写入数据是由策略 (引起的,还是由策略) 引起的:MAMPolicyManager.getPolicy(currentActivity).getIsSaveToLocationAllowed(contentURI);或者如果没有关联的活动:
MAMPolicyManager.getCurrentThreadPolicy().getIsSaveToLocationAllowed(contentURI);在第二种情况下,多标识应用必须注意适当地设置线程标识 (或将显式标识传递给
getPolicyForIdentity调用) 。
导出的服务
Intune 应用 SDK 中包含的 AndroidManifest.xml 文件包含 MAMNotificationReceiverService,它必须是导出的服务才能允许公司门户向托管应用发送通知。 该服务检查调用方,以确保仅允许公司门户发送通知。
反射限制
例如,某些 MAM 基类 (例如, MAMActivityMAMDocumentsProvider) 包含基于原始 Android 基类 (的方法) 使用仅高于某些 API 级别的参数或返回类型。
因此,可能并不总是可以使用反射来枚举应用组件的所有方法。
此限制不限于 MAM,如果应用本身从 Android 基类实现了这些方法,则所适用的限制与此限制相同。
Robolectric
不支持在 Robolectric 下测试 Intune App SDK 行为。 由于 Robolectric 下存在的行为无法准确模拟真实设备或模拟器上的行为,因此在 Robolectric 下运行 SDK 存在已知问题。
如果需要在 Robolectric 下测试应用程序,建议的解决方法是将应用程序类逻辑移动到帮助程序,并使用不继承自 MAMApplication 的应用程序类生成单元测试 apk。