适用于 Android 的 Microsoft Intune 应用 SDK 允许将 Intune 应用保护策略合并到本机 Java/Kotlin Android 应用中。 这些策略也称为 MAM 策略。 Intune 托管的应用程序是与 Intune 应用 SDK 集成的应用程序。 当 Intune 主动管理应用时,Intune 管理员可以轻松地将应用保护策略部署到 Intune 管理的应用。
注意
本指南分为几个不同的阶段。 首先查看 第 1 阶段:规划集成。
第 3 阶段:MAM 入门
阶段目标
- 下载 Intune App SDK。
- 了解 Intune App SDK 中包含哪些文件。
- 在应用程序中引用 Intune App SDK。
- 配置 Intune 应用 Gradle 生成插件或使用命令行生成工具。
- 确认 Intune App SDK 已正确包含在版本中。
背景
应用程序已成功集成 MSAL 后,可以下载 Intune 应用 SDK 并将其纳入应用程序的生成过程。
集成 Intune 应用 SDK 的很大一部分是将标准 Android 类和方法调用替换为这些类和方法调用的 Intune 版本。 SDK 包含可自动进行大部分替换的生成工具。 若要了解有关此替换逻辑的详细信息,请参阅附录的类和方法替换部分。
下载 Intune 应用 SDK
若要下载 SDK,请参阅 下载 SDK 文件。
SDK 中包含哪些内容?
Intune 应用 SDK 由以下文件组成:
- Microsoft。Intune。MAM.SDK.aar:SDK 组件,支持库 JAR 文件除外。
- com.microsoft.intune.mam.build.jar:一个 Gradle 插件, 有助于集成 SDK。
- CHANGELOG.md:提供每个SDK版本中所做的更改记录。
-
Microsoft。Intune。MAM.SDK。DownlevelStubs.aar:此 Android 存档 (AAR) 包含 Android 系统类的存根,这些类仅在较新的设备上存在,但被 MAMActivity 中的方法引用。 较新的设备会忽略这些存根类。 仅当应用对派生自
MAMActivity的类执行反射时,此 AAR 才是必需的,并且 大多数应用不需要包含它。 AAR 包含用于排除其所有类的 ProGuard 规则。
引用 Intune 应用库
Intune 应用 SDK 是标准 Android 库,没有外部依赖项。 Microsoft。Intune。MAM.SDK.aar 包含启用应用保护策略所需的接口。 它还包含与 Microsoft Intune 公司门户 应用交互操作所需的代码。
Android Studio
Microsoft。Intune。MAM.必须将 SDK.aar 指定为 Android 库引用。 若要将此依赖项添加到生成中,请按照 Android 文档中的“将 AAR 或 JAR 添加为依赖项” 操作。
Visual Studio
必须将 Intune App SDK for .NET MAUI - Android NuGet 包添加为依赖项。
按照使用 NuGet 程序包管理器在 Visual Studio 中安装和管理程序包的过程进行操作。
Microsoft.Intune。MAM.SDK.aar 绑定以创建作用域为命名空间的 Microsoft.Intune.Mam C# 引用。
ProGuard
应用程序可能已使用 ProGuard (或任何其他压缩/模糊处理机制作为生成步骤) 。 Intune 应用 SDK 具有必须包含在该生成步骤中的 ProGuard 配置规则。 包括 . 如前所述,版本中的 AAR 会自动将 SDK 的配置集成到 ProGuard 步骤中,以便保留必要的类文件。 如果包含 .AAR,则无需进行其他更改。
MSAL) (Microsoft 身份验证库附带自己的 ProGuard 配置。 如果你的应用集成了 MSAL,请参阅 MSAL 文档 了解详细信息。
生成工具
SDK 提供生成工具 (用于 Gradle 生成的插件、适用于 .NET 生成的目标,以及可自动执行 MAM 替换的命令行工具) 。 这些工具转换 Java 编译生成的类文件;它们不修改原始源代码。 需要使用 Gradle 插件、.NET NuGet 程序包或命令行工具。
仅靠生成工具不足以完全集成您的应用程序。 这些工具仅执行 类和方法替换 。 它们不执行任何更复杂的 SDK 集成,例如 多重标识、 注册应用保护策略、 限制应用与设备或云存储位置之间的数据传输的策略或 MSAL 配置。 必须先完成这些集成,然后才能完全启用 Intune 应用。 仔细查看本文档的其余部分,了解与您的应用相关的集成点。
调试
生成工具在编译后执行替换。 这些替换会更改某些方法名称。 因此,对方法名称设置的调试断点可能会受到影响。 它们可能不会像预期的那样停止。 行号断点不受影响。
堆栈中的 MAM
Intune 应用 SDK 集成在很大程度上依赖于类和方法替换。 由于这种依赖性,您可以在整个堆栈跟踪中看到 mam 。
如果你的应用没有应用保护策略所针对的帐户,则所有这些 MAM 代码都处于休眠状态。 例如,MAMActivity工作方式ActivityonMAMCreate与 和工作方式相同onCreate。
每当您在堆栈中看到mam时,请首先检查:
- 帐户是否是应用保护策略的目标?
- 是否安装了 Intune 公司门户?
除非两者的答案都是“是”,否则 MAM 代码充当简单的直通。
我需要什么工具?
如果您使用 Gradle 构建应用,请参阅 与 Gradle 构建插件集成
如果使用 .NET MAUI 生成应用,请参阅 与 .NET MAUI 目标集成。
如果未使用上述任何工具构建应用,请参阅 与命令行工具集成。
与 Gradle 生成插件集成
Intune App SDK 插件作为 SDK 的一部分作为 GradlePlugin/com.microsoft.intune.mam.build.jar 分发。
为了使插件被 Gradle 识别,必须将其添加到 buildscript classpath。
该插件依赖于 Javassist,也必须添加。 有关 Javassist 依赖项的更多信息,请参阅 依赖项。
要将这些添加到 classpath,请将以下内容添加到根目录 build.gradle:
buildscript {
repositories {
jcenter()
}
dependencies {
classpath "org.javassist:javassist:3.29.2-GA"
classpath files("$PATH_TO_MAM_SDK/GradlePlugin/com.microsoft.intune.mam.build.jar")
}
}
然后,若要应用插件,请将以下 build.gradle 内容添加到应用和动态功能模块的文件中:
apply plugin: 'com.microsoft.intune.mam'
默认情况下,该插件基于依赖项和外部库进行 project 操作。
测试编译不受影响。
注意
从 8.0 Intune App SDK 开始,不再可以有选择地处理库。 处理所有库。
相关性
Gradle 插件依赖于 Javassist,必须提供给 Gradle 的依赖解析。 Javassist 仅在运行插件时的构建时使用,不会将 Javassist 代码添加到应用中。
| MAM SDK | Javassist 版本 |
|---|---|
| ≥ 10.0.0 | 3.29.2-GA |
| ≥ 7.0.0 | 3.27.0-GA |
| < 7.0.0 | 3.22.0-GA |
注意
Javassist 版本可能不向后兼容。 通常,应使用 Intune 应用 SDK 预期的确切版本。
兼容性矩阵
MAM SDK 生成插件与 Android 生成要求和兼容性表一致。 此处未列出的版本可能有效,也可能无效。
| MAM SDK | Android 版本 | Gradle | Android Gradle 插件 | Kotlin 版本 | Java 版本 |
|---|---|---|---|---|---|
| 10.0.0 | 14 | 8.2 | 8.2.2 | 1.9.25 | 17 |
| 11.0.0 | 15 | 8.7 | 8.6.1 | 2.0.21 | 17 |
| 12.0.0 | 16 | 8.11.1 | 8.9.1 | 2.1.21 | 17 |
排除项
可以提供更多配置,以从重写中排除应用中的特定组件。 排除项主要适用于与 MAM (无关的组件,即不) 处理或显示公司数据的组件。
可以为不同的范围配置排除项:
-
excludeProjects允许排除 Gradle 项目列表。 这些排除项对于不与 Android 库或系统 API 接口的项目非常有用。 对于不处理公司数据的项目,它们也很有用。 例如,专门包含用于执行低级别网络操作的本机代码的项目可能是一个不错的候选项。 如果项目广泛与 Android 库或系统 API 接口,请避免这些排除项。 -
excludeClasses允许排除类列表。 这些排除项对于不处理或呈现公司数据的类非常有用。 例如,初始屏幕和载入Activity是很好的候选项。 如果处理了一个类的任何超类,就不能排除它。 -
excludeVariants允许排除项目变体。 这些排除项可以指完整的变体名称或单个风格。 如果您想要构建非 MAM 风格的应用,它们将特别有用。 例如,如果您的应用具有版本类型debug且release风格为 {noMAM,MAM} 和 {mock,production},则可以指定:-
noMAM排除具有 noMAM 风格的所有变体,或 -
noMAMMockDebug以仅排除该确切变体。
-
警告
不应掉以轻心地排除。 错误地应用排除项可能会导致应用中严重的数据泄露。 始终验证应用的任何排除项的影响。
包含排除项的部分 build.gradle 示例
apply plugin: 'com.microsoft.intune.mam'
dependencies {
implementation project(':product:FooLib')
implementation project(':product:foo-project')
implementation "com.microsoft.bar:baz:1.0.0"
// Include the MAM SDK
implementation files("$PATH_TO_MAM_SDK/Microsoft.Intune.MAM.SDK.aar")
}
intunemam {
excludeProjects = [':product:FooLib']
excludeClasses = ['com.contoso.SplashActivity']
excludeVariants = ['noMAM']
}
这将产生以下效果:
-
:product:FooLib未被重写,因为它包含在excludeProjects -
:product:foo-project被重写,com.contoso.SplashActivity但 除外,因为它位于excludeClasses -
com.microsoft.bar:baz.1.0.0被重写,因为包括所有外部库以供处理。 - 不会重写具有风格的
noMAM变体。
Reporting
生成插件可以生成它所做更改的 html 报告。
若要请求生成此报告,请在配置块中intunemam指定report = true。
如果生成,报表将写入 outputs/logs 生成目录中。
intunemam {
report = true
}
验证
生成插件可以运行更多验证,以查找处理类中可能出现的错误。 这些检查有助于防止潜在的插件导致的运行时故障。
若要请求验证在您的版本中执行,请在配置块中intunemam指定verify = true。
这可能会增加插件任务所花费的时间几秒钟。
intunemam {
verify = true
}
通常,验证失败表示生成插件中的 bug。 如需有关失败的帮助,请将问题上报给 Microsoft 支持部门。 如果没有 Microsoft 支持合同,请 打开 GitHub 问题。
增量生成
若要启用对增量生成的支持,请在配置块中intunemam指定incremental = true。
此功能通过仅处理更改的输入文件来提高生成性能。
默认 incremental 配置为 false。
intunemam {
incremental = true
}
动态特征模块配置
动态功能模块独立于应用项目生成。 因此,动态功能模块也需要应用 Gradle 生成插件。
Gradle 插件使用的 API 存在技术限制。 由于这些限制,在转换动态要素模块类时需要重新处理应用程序类。 为确保可以完成此重新处理,请使用与应用相同的设置配置所有功能模块。
例如,如果应用排除了类,动态功能模块也应排除该类。
与 .NET MAUI 目标集成
Intune 应用 SDK 目标作为 SDK 的一部分作为 Microsoft.Intune 分发。Maui.Essentials.android.targets.
添加 Intune App SDK for .NET MAUI - Android NuGet 程序包后,目标会在编译时自动导入到应用程序中。
与命令行生成工具集成
命令行生成工具在 SDK 放置的文件夹中 BuildTool 可用。
它执行的功能与上面详述的 Gradle 插件和 .NET 目标相同。 但是,命令行工具可以集成到自定义生成系统中。
由于该工具更通用,因此调用起来更复杂。 尽可能使用 Gradle 插件或 .NET 目标。
使用 Command-Line 工具
可以使用位于目录中 BuildTool\bin 提供的帮助程序脚本调用命令行工具。
该工具需要以下参数。
| 参数 | 必需 | 说明 |
|---|---|---|
--input |
是 | 要修改的 JAR 文件和类文件目录的分号分隔列表。 包括要重写的所有 JAR 和目录。 |
--output |
是 | 用于存储修改后的类的 JAR 文件和目录的分号分隔列表。 每个输入条目提供一个输出条目,按相同顺序列出。 |
--classpath |
是 | 生成类路径。 这可以包含 JAR 文件和类目录。 |
--processed |
否 | 以分号分隔的 JAR 文件和目录列表,其中包含已通过之前调用生成工具处理的类。 |
--excludeClasses |
否 | 以分号分隔的列表,其中包含应从重写中排除的类的名称。 |
--report |
否 | 要将有关已修改类的 HTML 报告写入到的目录。 如果未指定,则不写入任何报告。 |
可选 --processed 选项用于启用增量生成。
此处列出的文件/目录集应与输入和类路径列表不相连。
提示
在类 Unix 系统上,分号是命令分隔符。 为了避免 shell 拆分命令,请确保用 '' 转义每个分号或将完整参数包装在引号中。
工具调用 Command-Line 示例
> BuildTool\bin\BuildTool.bat --input build\product-foo-project;libs\bar.jar --output mam-build\product-foo-project;mam-build\libs\bar.jar --classpath build\zap.jar;libs\Microsoft.Intune.MAM.SDK\classes.jar;%ANDROID_SDK_ROOT%\platforms\android-27\android.jar --excludeClasses com.contoso.SplashActivity
这将产生以下效果:
-
product-foo-project目录将重写为mam-build\product-foo-project -
bar.jar被重写为mam-build\libs\bar.jar -
zap.jar未重写,因为它仅在--classpath -
com.contoso.SplashActivity即使类位于--input
警告
生成工具当前不支持 aar 文件。
如果在处理 aar 文件时生成系统尚未提取 classes.jar ,请在调用生成工具之前将其解压缩。
设置 MAMApplication
如果应用创建 的子类 android.app.Application,则生成插件或命令行工具会转换应用程序类。
如果您的应用没有子类 android.app.Application化,则 您必须 设置为 "com.microsoft.intune.mam.client.app.MAMApplication""android:name" AndroidManifest.xml <application> 标记中的属性。
推荐的 Android 最佳做法
- 使用最新的 Android SDK 生成工具。
- 删除所有不必要和未使用的库 (例如 android.support.v4) 。
执行自动替换后,Intune 应用 SDK 仍维护 Android API 提供的协定。 但是,由于策略强制执行,可能会更频繁地触发故障条件。 以下 Android 最佳做法可降低失败的可能性:
- 可返回
null的 Android SDK 函数现在返回的可能性null更高。 确保null检查保护这些函数调用。 - 可以检查的功能(例如
clipboardManager.getPrimaryClipDescription(),必须通过其 MAM 替换 API 进行检查),例如MAMClipboard.getPrimaryClipDescription(clipboardManager)。 - 任何派生函数都必须回调其超类版本。
- 避免以模棱两可的方式使用任何 API。 例如,不检查
requestCode就使用Activity.startActivityForResult会导致奇怪的行为。
服务
策略实施可能会影响 Android 服务 交互。
建立绑定服务连接的方法,例如 Context.bindService 可能由于基础策略实施 Service.onBind 而失败,并可能导致 ServiceConnection.onNullBinding 或 ServiceConnection.onServiceDisconnected。
与已建立的绑定服务交互可能会引发 SecurityException 由于策略实施 Binder.onTransact.
鼓励绑定服务的客户端检查服务引发的异常。 不要让异常传播到客户端应用程序的其余部分。
退出条件
配置生成插件或将命令行工具集成到生成过程后,请验证它是否成功运行:
- 确保版本编译并成功生成。
- 配置
report标志,然后打开报告文档并确认正在进行类和方法替换:- 如果使用插件,请按照 报告中的步骤操作。
- 如果使用命令行工具,请包含
--report标志。
- 如果使用插件,请配置
verify标志并确保它不会产生错误。 请参阅 验证。 - 在 build.gradle 中双重检查所有排除项 (
excludeProjectsexcludeClasses和)excludeVariants。 确认每个排除项都是必要的,并且不处理受保护的数据。 从历史上看,许多数据泄漏错误是由于过于激进的排除而发生的。 -
如果没有安装 Intune 公司门户,请启动已编译的应用。 使用应用保护策略未针对的 Microsoft Entra 用户登录。 确认应用按预期运行。
- 注销并在安装 Intune 公司门户的情况下重复此测试。
常见问题
我的应用以前集成了没有生成插件的 SDK;如何使用生成插件?
较旧版本的 Intune App SDK 不包含任何执行类和方法替换的自动方法。 开发人员需要在源代码中手动执行这些替换。 如果应用以这种方式集成,则可以安全地应用生成插件或命令行生成工具。 不需要修改任何源代码。 项目必须仍将 MAM SDK 列为依赖项。
后续步骤
完成所有 退出条件后,继续学习 第 4 阶段:MAM 集成要点。