Microsoft Intune Android 应用 SDK 开发人员指南
Microsoft Intune App SDK for Android 允许将Intune应用保护策略 (也称为 APP 或 MAM 策略) 合并到本机 Java/Kotlin Android 应用中。 Intune托管的应用程序是与 Intune App SDK 集成的应用程序。 当Intune主动管理应用时,Intune管理员可以轻松地将应用保护策略部署到Intune托管的应用。
重要
Intune定期发布Intune应用 SDK 的更新。 建议订阅Intune应用 SDK 存储库以获取更新,以便将更新合并到软件开发发布周期,并确保应用支持最新的应用保护策略设置。
计划在每个主要 OS 版本之前执行强制Intune应用 SDK 更新,以确保应用继续顺利运行,因为 OS 更新可能会导致中断性变更。 如果未在主要 OS 版本之前更新到最新版本,则可能会遇到中断性变更和/或无法将应用保护策略应用到应用的风险。
流程流
下图提供了适用于 Android 的 Intune 应用 SDK 进程流:
阶段Goals
本指南包含有关Intune应用 SDK 体系结构的更多详细信息、有关不常见集成步骤的信息和其他有用内容。
更详细的 SDK
类和方法替换
通过生成工具,Intune应用 SDK 尝试将 Android 开发人员的集成负担降到最低。 在生成工具之前,开发人员需要手动执行所有替换。
注意
应用现在 必须与 SDK 生成工具集成,该工具将自动执行所有这些替换。
Android 基类将替换为其各自的 MAM 等效项,以便启用Intune管理。
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 |
某些类的大多数方法都已包装,例如 、ClipboardManager
ContentProviderClient
、 ContentResolver
和 PackageManager
,而其他类只包装了一个或两个方法,例如、DownloadManager
、PrintHelper
PrintManager
、View
、 DragEvent
NotificationManager
和 NotificationManagerCompat
。
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 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 注册流。
注意
默认注册是主权云感知。
使用以下步骤启用默认注册:
如果应用集成了 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 级别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,它必须是导出的服务,以便公司门户向托管应用发送通知。 该服务会检查调用方,以确保仅允许公司门户发送通知。
反射限制
例如, MAMActivity
MAMDocumentsProvider
某些 MAM 基类 (,) 包含基于原始 Android 基类 (的方法) 这些基类使用仅在某些 API 级别以上存在的参数或返回类型。
因此,可能无法始终使用反射来枚举应用组件的所有方法。
此限制不限于 MAM,它与应用本身从 Android 基类实现这些方法时适用的限制相同。
Robolectric
不支持在 Robolectric 下测试Intune应用 SDK 行为。 在 Robolectric 下运行 SDK 时存在已知问题,因为 Robolectric 下存在的行为无法准确模拟真实设备或仿真器上的行为。
如果需要在 Robolectric 下测试应用程序,建议的解决方法是将应用程序类逻辑移动到帮助程序,并使用不从 MAMApplication 继承的应用程序类生成单元测试 apk。