適用於 Android 的 Microsoft Intune 應用程式 SDK 可讓您將 Intune 應用程式防護原則併入原生 Java/Kotlin Android 應用程式。 這些原則又稱為 MAM 原則。 Intune 管理的應用程式是與 Intune App SDK 整合的應用程式。 當 Intune 主動管理應用程式時,Intune 系統管理員可以輕鬆地將應用程式保護原則部署到 Intune 管理的應用程式。
注意事項
本指南分為幾個不同的階段。 首先檢閱 第 1 階段:規劃整合。
階段 3:MAM 使用者入門
階段目標
- 下載 Intune 應用程式 SDK。
- 了解 Intune App SDK 中包含的檔案。
- 在應用程式中參考 Intune App SDK。
- 設定 Intune 應用程式 Gradle 組建外掛程式,或使用命令列組建工具。
- 確認 Intune App SDK 已正確包含在您的組建中。
Background
現在,您的應用程式已成功整合 MSAL,是時候下載 Intune App SDK,並將它包含在應用程式的建置程序中。
整合 Intune 應用程式 SDK 的大部分是將標準 Android 類別和方法呼叫取代為這些類別和方法呼叫的 Intune 版本。 SDK 包含建置工具,可自動為您進行大部分的取代項目。 如果您想深入了解此取代邏輯,請參閱附錄的類別和方法取代一節。
下載 Intune App SDK
若要下載 SDK,請參閱 下載 SDK 檔案。
SDK 中有什麼內容?
Intune App SDK 包含下列檔案:
- Microsoft。Intune。媽。SDK.aar:SDK 元件,支援程式庫 JAR 檔案除外。
- com.microsoft.intune.mam.build.jar:Gradle 外掛程式, 可協助整合 SDK。
- CHANGELOG.md:提供每個 SDK 版本中所做變更的記錄。
-
Microsoft。Intune。媽。SDK。DownlevelStubs.aar:此 Android 封存 (AAR) 包含 Android 系統類別的存根,這些類別僅存在於較新的裝置上,但由 MAMActivity 中的方法引用。 較新的裝置會忽略這些虛設類別。 只有當您的應用程式對衍生自
MAMActivity的類別執行反射時,才需要此 AAR, 而且大部分應用程式都不需要包含此 AAR。 AAR 包含 ProGuard 規則以排除其所有類別。
參考 Intune 應用程式程式庫
Intune 應用程式 SDK 是沒有外部相依性的標準 Android 程式庫。 Microsoft。Intune。媽。SDK.aar 包含啟用應用程式防護原則所需的介面。 它還包含與 Microsoft Intune 公司入口網站 應用程式交互操作所需的代碼。
Android Studio
Microsoft。Intune。媽。必須將 SDK.aar 指定為 Android 程式庫參照。 若要將此相依性新增至您的組建,請遵循 從 Android 文件中 將您的 AAR 或 JAR 新增為相依性 。
Visual Studio
必須將適用於 .NET MAUI - Android NuGet 套件的 Intune App SDK 新增為相依性。
請 遵循使用 NuGet 封裝管理員在 Visual Studio 中安裝和管理套件的流程。
Microsoft.Intune。媽。SDK.aar 必須建立範圍限定為命名空間的 Microsoft.Intune.Mam C# 參考。
ProGuard
您的應用程式可能已使用 ProGuard (或任何其他壓縮/混淆機制) 作為建置步驟。 Intune App SDK 具有必須包含在該組建步驟中的 ProGuard 設定規則。 包括 。 如前所述,組建中的 AAR 會自動將 SDK 的設定整合到 ProGuard 步驟,以便保留必要的類別檔案。 如果您包含 .AAR,不需要進行其他變更。
MSAL (Microsoft 驗證程式庫) 提供自己的 ProGuard 設定。 如果您的應用程式整合了 MSAL,請參閱 MSAL 文件以取得 更多詳細資料。
建置工具
SDK 提供建構工具 (Gradle 建置的外掛程式、.NET 建置的目標,以及可自動執行 MAM 取代的命令列工具) 。 這些工具轉換了Java編譯產生的類別檔案;它們不會修改原始原始程式碼。 您必須使用 Gradle 外掛程式、.NET NuGet 套件或命令列工具。
僅靠建置工具不足以完全整合您的應用程式。 這些工具只會執行 類別和方法取代 。 它們不會執行任何更複雜的 SDK 整合,例如 多重身分識別、 註冊應用程式保護原則、 限制應用程式與裝置或雲端儲存位置之間資料傳輸的原則,或 MSAL 設定。 您必須先完成這些整合,應用程式才會完全啟用 Intune。 請仔細檢閱本文件其餘部分,以尋找與您的應用程式相關的整合點。
偵錯
建置工具會在編譯後執行取代。 這些取代項目會變更某些方法名稱。 因此,在方法名稱上設定的偵錯中斷點可能會受到影響。 他們可能不會像預期的那樣停止。 行號中斷點不受影響。
堆疊中的 MAM
Intune App SDK 整合嚴重依賴類別和方法取代。 由於這種依賴性,您會看到 mam 整個堆疊追蹤。
當您的應用程式沒有以應用程式保護原則為目標的帳戶時,所有這些 MAM 程式碼都會處於休眠狀態。 例如, MAMActivity 運作方式與 Activity 相同, onMAMCreate 且運作方式 onCreate與 相同。
每當您看到 mam 堆疊時,請先檢查:
- 帳戶是否以應用程式防護原則為目標?
- 是否已安裝 Intune 公司入口網站?
除非兩者的答案都是「是」,否則 MAM 代碼就會充當簡單的傳遞。
我需要什麼工具?
如果您使用 Gradle 建置應用程式,請參閱 與 Gradle 建置外掛程式整合
如果您使用 .NET MAUI 建置應用程式,請參閱 與 .NET MAUI 目標整合。
如果您未使用上述任何工具建置應用程式,請參閱與 命令列工具整合。
與 Gradle 建置外掛程式整合
Intune App SDK 外掛程式會以 GradlePlugin/com.microsoft.intune.mam.build.jar 的形式作為 SDK 的一部分發佈。
為了讓 Gradle 辨識外掛程式,必須將其新增至 buildscript 類別路徑。
該插件依賴於 Javassist,也必須添加它。 如需 Javassist 相依性的詳細資訊,請參閱 相依性。
若要將這些新增至類別路徑,請將下列內容新增至您的根 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 App 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風味的變體不會被重寫。
報告
建置外掛程式可以產生其所做變更的 HTML 報告。
如果要要求產生此報表,請在組態區塊中intunemam指定report = true。
如果產生報表,則會寫入 outputs/logs 建置目錄中。
intunemam {
report = true
}
驗證
建置外掛程式可以執行更多驗證,以尋找處理類別中可能的錯誤。 這些檢查有助於防範潛在的外掛程式引起的運行時故障。
若要要求在組建中執行驗證,請在組態區塊中intunemam指定verify = true。
這可能會增加插件任務所花費的時間幾秒鐘。
intunemam {
verify = true
}
一般而言,驗證失敗代表組建外掛程式中的錯誤。 如需失敗時的協助,請向 Microsoft 支援服務呈報問題。 如果您沒有 Microsoft 支援合約, 請開啟 GitHub 問題。
增量式組建
若要啟用累加式建置的支援,請在組態區塊中intunemam指定incremental = true。
此功能僅處理變更的輸入檔案,以提升建置效能。
的 incremental 預設設定為 false。
intunemam {
incremental = true
}
動態功能模組設定
動態功能模組會與應用程式專案分開建置。 因此,動態功能模組也需要套用 Gradle 建置外掛程式。
Gradle 外掛程式使用的 API 存在技術限制。 由於這些限制,在轉換動態圖徵模組類別時需要重新處理應用程式類別。 若要確保可以完成此重新處理,請使用與應用程式相同的設定來設定所有功能模組。
例如,如果應用程式排除某個類別,動態功能模組也應該排除該類別。
與 .NET MAUI 目標整合
Intune 應用程式 SDK 目標會以 Microsoft.Intune 的形式作為 SDK 的一部分發佈。Maui.Essentials.android.targets。
一旦新增了適用於 .NET MAUI - Android NuGet 套件的 Intune App SDK,目標就會在編譯期間自動匯入您的應用程式。
與命令列建置工具整合
命令列建置工具位於 SDK drop 的資料夾中 BuildTool 。
它會執行與上述 Gradle 外掛程式和 .NET 目標相同的功能。 不過,命令列工具可以整合到自訂建置系統中。
因為這個工具比較一般,所以叫用起來會比較複雜。 盡可能使用 Gradle 外掛程式或 .NET 目標。
使用 Command-Line 工具
您可以使用目錄中 BuildTool\bin 提供的協助程式指令碼來叫用命令列工具。
該工具需要下列參數。
| 參數 | 必要 | 描述 |
|---|---|---|
--input |
是 | 以分號分隔的 JAR 檔案清單及要修改的類別檔案目錄。 包括您要重寫的所有 JAR 和目錄。 |
--output |
是 | 以分號分隔的 JAR 檔案及目錄清單,用來儲存已修改的類別。 為每個輸入項目提供一個輸出項目,並以相同的順序列出。 |
--classpath |
是 | 組建類別路徑。 這可以包含 JAR 檔案和類別目錄。 |
--processed |
否 | 以分號分隔的 JAR 檔案和目錄清單,其中包含先前呼叫建置工具已處理的類別。 |
--excludeClasses |
否 | 以分號分隔的清單,包含應從重寫中排除的類別名稱。 |
--report |
否 | 要寫入有關修改類別的 HTML 報告的目錄。 如果未指定,則不會撰寫任何報告。 |
選擇性 --processed 選項可用來啟用增量建置。
此處列出的一組檔案/目錄應該與輸入和類別路徑清單不相鄰。
提示
在類 Unix 系統上,分號是命令分隔符號。 若要避免殼層分割命令,請務必以 '' 逸出每個分號,或以引號括弧完整參數。
工具引 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" AndroidManifest.xml <application> 標籤中設定為"android:name"屬性。
建議的 Android 最佳做法
- 使用最新的 Android SDK 建置工具。
- 移除所有不必要和未使用的庫 (例如 android.support.v4) 。
執行自動取代之後,Intune App SDK 仍會維持 Android API 所提供的合約。 不過,由於原則強制執行,可能會更頻繁地觸發失敗條件。 下列 Android 最佳做法可降低失敗的可能性:
- 現在可以返回
null的 Android SDK 函數具有更高的返回可能性null。 請確定null檢查可保護這些函數呼叫。 - 可以檢查的功能 ,例如
clipboardManager.getPrimaryClipDescription(),必須透過其 MAM 取代 API 來檢查,例如MAMClipboard.getPrimaryClipDescription(clipboardManager)。 - 任何衍生函式都必須呼叫其超類別版本。
- 避免以模棱兩可的方式使用任何 API。 例如,使用
Activity.startActivityForResult時未檢查會造成奇怪的requestCode行為。
服務
原則強制執行可能會影響 Android 服務 互動。
建立繫結服務連線的方法,例如 Context.bindService 可能會因基礎原則強制執行 Service.onBind 而失敗,並可能導致 ServiceConnection.onNullBinding 或 ServiceConnection.onServiceDisconnected。
與已建立的繫結服務互動可能會在 中Binder.onTransact拋出因政策強制執行而導致的問題SecurityException。
建議繫結服務的用戶端檢查服務擲回的例外狀況。 不要讓例外狀況傳播到用戶端應用程式的其餘部分。
結束準則
設定組建外掛程式或將命令列工具整合至組建程序之後,請驗證其是否成功執行:
- 請確定您的組建可順利編譯並組建。
- 設定
report旗標,然後開啟報告文件並確認正在發生類別和方法取代:- 如果使用外掛程式,請依照 報告中的步驟進行。
- 如果使用命令列工具,請包含
--report旗標。
- 如果使用外掛程式,請設定
verify標幟並確保它不會產生錯誤。 請參閱 驗證。 - 仔細檢查 build.gradle 中所有排除項目 (
excludeProjects、excludeClasses及excludeVariants) 。 確認每個排除項目都是必要的,而且不會處理受保護的資料。 從歷史上看,許多資料外洩錯誤都是由於過度激進的排除而發生。 -
在未安裝 Intune 公司入口網站的情況下,啟動編譯的應用程式。 以應用程式保護原則未鎖定的 Microsoft Entra 使用者登入。 確認應用程式正常運作。
- 登出並在已安裝 Intune 公司入口網站的情況下重複此測試。
常見問題集
我的應用程式先前整合了 SDK,但沒有組建外掛程式;如何使用組建外掛程式?
舊版的 Intune App SDK 不包含任何自動化執行類別和方法取代的方式。 開發人員需要在原始程式碼中手動執行這些替換。 如果您的應用程式以這種方式整合,則可以安全地套用建置外掛程式或命令列建置工具。 您不需要任何原始程式碼修改。 您的專案仍必須將 MAM SDK 列為相依性。
後續步驟
完成所有 結束準則後,繼續進行 階段 4:MAM 整合基礎。