共用方式為


Microsoft Intune App SDK for Android 開發者指南

Android 版 Microsoft Intune App SDK 允許你將Intune 應用程式保護政策 (也稱為 MAM 政策) 整合到原生的 Java/Kotlin Android 應用程式中。 Intune 管理的應用程式是指與 Intune 應用程式 SDK 整合的應用程式。 當 Intune 主動管理應用程式時,Intune 管理員可以輕鬆部署應用程式保護政策到您的 Intune 管理應用程式。

重要事項

Intune 定期釋出 Intune 應用程式 SDK 的更新。 我們建議訂閱 Intune App SDK 套件庫以獲取更新,這樣你就能將更新納入軟體開發的發行週期,並確保你的應用程式支援最新的應用程式保護政策設定。

在每次主要作業系統發佈前,計劃強制更新 Intune App SDK,以確保應用程式持續順暢運行,因為作業系統更新可能導致破壞性變更。 若未在主要作業系統版本前更新至最新版本,可能會遇到破壞性變更,或無法套用應用程式保護政策。

製程流程

下圖提供了 Intune App SDK for Android 流程:

Microsoft Intune 的高階架構圖。

賽段目標

本指南包含更多關於 Intune App SDK 架構的詳細資訊、罕見整合步驟的資訊,以及其他有用內容。

SDK 更詳細說明

類別與方法替換

透過建置工具,Intune App SDK 嘗試降低 Android 開發者的整合負擔。 在建置工具出現之前,開發者必須手動完成所有替換工作。

注意事項

應用程式 現在必須 與 SDK 建置工具整合,該工具將自動執行所有這些替換。

Android 基底類別被其相應的 MAM 對應類別取代,以啟用 Intune 管理。 SDK 類別存在於 Android 基底類別與應用程式自身衍生的該類別版本之間。 例如,一個應用程式活動可能擁有一個繼承階層,看起來像: AppSpecificActivity 擴展 MAMActivityActivity擴展 。 MAM 層過濾系統操作呼叫,以無縫地為您的應用程式提供一個受管理的世界視圖。

除了基底類別外,你的應用程式可能使用的一些類別,但不直接衍生自 (,例如 MediaPlayer) 也有必須的 MAM 等價函數, 且有些方法呼叫也必須被替換。 下表列出了許多MAM的替代者。

Android 基底類別 Intune App SDK 替換
android.app。活動 媽媽行動
android.app.ActivityGroup MAMActivityGroup(媽媽行動集團)
android.app.別名活動 媽媽們活動
android.app.應用 媽媽申請
android.app.對話 MAMDialog
android.app.警示對話器建置器 MAMAlertDialogBuilder
android.app.對話片段 MAMDialog片段
android.app.可展開列表活動 MAMExpandableListActivity
android.app.片段 MAMFragment
android.app.IntentService MAMIntentService
android.app.發射器活動 MAMLauncher活動
android.app.列表活動 MAMList活動
android.app.ListFragment MAMListFragment
android.app.原住民活動 MAMNativeActivity(男性原生活動)
android.app。待定意圖 MAMPending意圖
android.app 服務 MAMService
android.app.TabActivity MAMTabActivity
android.app.TaskStackBuilder 任務堆疊建構器 MAMTaskStackBuilder
android.app.backup.BackupAgent MAMBackup代理
android.app.backup.BackupAgentHelper MAMBackupAgentHelper
android.app.backup.FileBackupHelper MAMFileBackupHelper
android.app.backup.SharePreferencesBackupHelper MAMSharedPreferencesBackupHelper
android.app.job.Job.JobService MAMJobService
android.content.BroadcastReceiver MAMBroadcast接收器
android.content.ContentProvider(android.content.ContentProvider) MAMContentProvider
android.os.binder MAMBinder (僅在綁定器非由 AIDL) 介面產生 (Android 介面時才必要)
android.media.MediaPlayer MAMMediaPlayer
android.media.Media元資料擷取器 MAMMediaMetadataRetriever
android.media.MediaRecorder MAMMediaRecorder
android.provider.DocumentsProvider(android.provider.DocumentsProvider) MAMDocumentsProvider
android.preference.PreferenceActivity(安卓)。偏好活動(preferenceActivity) MAMPreference活動
android.widget.PopupWindow MAMPopup選單
android.widget.PopupWindow MAMPopup窗口
android.widget.ListPopupWindow MAMList彈出視窗
android.widget.TextView MAMTextView
android.widget.AutoCompleteTextView MAMAuto完整文字檢視
android.widget.CheckedTextView MAMCheckedTextView
android.widget.編輯文字 MAMEditText
android.inputmethodservice.ExtractEditText MAMExtract 編輯正文
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 推導時,必須覆寫並呼叫 ,而非覆寫onCreate()onMAMCreate()super.onCreate()Activity呼叫 super.onMAMCreate()。 Java 編譯器應強制執行最終限制,以防止意外覆蓋原始方法而非 MAM 等價方法。

封裝系統服務

對某些系統服務類別來說,必須在 MAM 包裝類別上呼叫靜態方法,而不是直接在服務實例中呼叫所需的方法。 例如,對 getSystemService(ClipboardManager.class).getPrimaryClip() 的調用必須變成對 MAMClipboardManager.getPrimaryClip(getSystemService(ClipboardManager.class)的調配。 同樣地,所需的建置插件會自動替換這些模組。

機器人級 Intune App SDK 替換
android.content.ClipboardManager MAMClipboard
android.content.ContentProviderClient MAMContentProviderClientManagement
android.content.ContentResolver MAMContentResolverManagement
android.content.pm.PackageManager 包包管理
android.app.下載管理器 MAMDownloadManagement
android.print.PrintManager MAMPrint管理
android.view.View MAMViewManagement
android.view.DragEvent MAMDragEventManagement
android.view.LayoutInflater MAML AyoutInflaterManagement
android.app.通知管理員 MAMNotificationManagement
android.app.blob.BlobStoreManager MAMBlobStoreManager
android.app.blob.BlobStoreManager.Session MAMBlobStoreManager.Session

有些類別的大部分方法都被包裝,例如 、 、 ,而其他類別則只有一兩個方法被包裹,例如 DownloadManagerPrintManagerNotificationManagerCompatDragEventPrintHelperViewNotificationManagerPackageManagerContentResolverContentProviderClientClipboardManager

MDM與MAM註冊

如第四階段的「註冊與註冊」討論,Intune 應用程式 SDK 會「註冊」你應用程式註冊的帳號,讓該帳號受到政策保護。 該帳戶在成功註冊後即為管理帳戶,MAM 政策應適用於該帳戶。

「註冊」一詞亦可指終端使用者發起的 MDM) 啟用流程裝置管理 (。 MDM 的註冊與應用程式保護政策的註冊是完全分開的。

整合 SDK 的應用程式可以有一個帳號註冊為應用程式保護政策,但該帳號並未註冊為裝置管理。 同樣地,使用者也可能在沒有任何整合 SDK 的應用程式的情況下,註冊裝置以 裝置管理 的帳戶註冊應用程式保護政策。

通常,當開發者和管理員提到註冊時,他們指的是 MDM 註冊,因為應用程式保護政策的註冊對開發者和終端使用者來說幾乎是看不見的。 欲了解更多 MDM 註冊資訊,請參閱 Enroll Android 裝置

整合技巧

了解公司入口網站日誌

公司入口網站日誌包含 Microsoft 工程師用於問題調查的資訊。 部分日誌對整合SDK的開發者也很有用。

特別是,該檔案 DiagnosticsInfo-scrubbed.log 包含哪些應用程式由 MAM 管理,以及本 PolicyDB Information 章節中 MAM 政策細節的資訊。 每個受管理的應用程式在這個 PolicyDB Information 區塊裡都有一個條目。 你應該在這裡查看你的應用程式的套件名稱,以確認 MAM 政策是否正確針對你的應用程式。 如果你在這裡看不到你的應用程式套件名稱,表示已登入的帳號沒有套用 MAM 政策。

關於每個 MAM 政策設定的說明,請參閱 Microsoft Intune 中的 Android 應用程式保護政策設定。 關於這些設定如何在公司入口網站日誌中顯示,請參閱「檢視客戶端應用程式保護日誌」。 當 MAM 政策未如預期執行時,我們建議您查看公司入口網站日誌或診斷介面,確認您的應用程式是否由 MAM 政策管理,並確認政策設定是否符合預期值。

您可以透過以下方式之一收集公司入口網站日誌:

  • 透過公司入口網站
    • 開啟公司入口網站應用程式
    • 選擇右上角的三點選單
    • 選擇設定
    • 在診斷日誌中,選擇儲存日誌
    • 依照提示選擇輸出目錄以儲存公司入口網站日誌。
    • adb shell pull Command 把日誌從你的 Android 裝置拉到你的本地機器。
  • [使用 Android 版 Microsoft Edge 以存取受管理應用程式日誌]。 此介面將顯示收集公司入口網站日誌及檢視 MAM 診斷的介面。
  • 呼叫MAMPolicyManager.showDiagnostics(context)以顯示相同的 UI 來收集公司入口網站日誌。

快速測試,政策變更

在開發與測試應用程式整合 Intune App 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"

接著,透過將 and com.microsoft.intune.mam.client.support.v4 套件中所有對 MAM 類別com.microsoft.intune.mam.client.support.v7的參考替換為 AndroidX 的對應函式,來修正編譯時錯誤。 例如,對 的 MAMAppCompatActivity 參考應該改成 AndroidX 的 AppCompatActivity。 如前所述,MAM 建置外掛/工具會在編譯時自動重寫 AndroidX 函式庫中的類別,並使用相應的 MAM 對應函式。

限制與特殊情況

預設入學

您的應用程式可透過簡化的預設 註冊流程,註冊應用程式保護政策。 此功能主要是為了支援尚未整合 MSAL 的私有業務應用程式。

警告

預設入學有重大取捨, 並不建議這麼做。 利用預設註冊的應用程式不支援條件存取,無法利用 Microsoft 服務的單登入服務,且非 Intune 帳號無法使用。 如果你的應用程式是從公開的應用商店出貨,預設註冊就不支援。

預設註冊會強制終端使用者安裝公司入口網站並完成 MAM 註冊流程,才能允許使用者進入您的應用程式。

注意事項

預設註冊是主權雲端感知。

透過以下步驟啟用預設登記:

  1. 如果你的應用程式整合了 MSAL 或需要啟用 SSO,請 設定 MSAL。 如果沒有,你可以跳過這個步驟。

  2. 請在清單 <application> 標籤下新增以下值,啟用預設登記:

    <meta-data android:name="com.microsoft.intune.mam.DefaultMAMServiceEnrollment" android:value="true" />
    
  3. 啟用所需的 MAM 政策,請在清單標籤下 <application> 新增以下值:

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

孤立過程

Intune App SDK 無法對孤立的程序套用保護。 支援孤立程序 (android:isolatedProcess) 需要在下方新增元資料標籤。

警告

透過新增這些元資料,您的應用程式宣告孤立的流程無法暴露組織資料。 你的申請負責保證這一點。

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

自訂螢幕擷取限制

如果您的應用程式包含繞過 Android Window層級 FLAG_SECURE 限制的自訂螢幕擷取功能,您必須先檢查螢幕擷取政策,才能完全存取該功能。 舉例來說,如果你的應用程式使用自訂渲染引擎將目前視圖渲染成 PNG 檔,你必須先檢查 AppPolicy.getIsScreenCaptureAllowed()

如果你的應用程式沒有包含任何自訂或第三方的螢幕擷取功能,你就沒有義務採取任何限制螢幕擷取的行動。 所有 MAM 整合應用程式的螢幕擷取政策會在層級自動強制執行 Window

作業系統或其他應用程式嘗試在你的應用程式中擷取 S 的 Window 行為都會依需求被封鎖。 例如,若使用者嘗試透過 Android 內建的截圖或錄影功能擷取應用程式螢幕,擷取將自動被限制,且應用程式無法參與。

政策執行限制

  • 使用內容解析器:「傳輸或接收」的 Intune 政策可能會阻擋或部分阻擋使用內容解析器存取其他應用程式的內容提供者。 這會導致 ContentResolver 方法回傳 null 或拋出失敗值, (如果被阻塞) openOutputStream 就會拋出 FileNotFoundException 。 應用程式可以透過以下呼叫判斷內容解析器未能寫入資料是政策 (還是政策) 所致:

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

    或者如果沒有相關活動:

    MAMPolicyManager.getCurrentThreadPolicy().getIsSaveToLocationAllowed(contentURI);
    

    在第二種情況下,多身份應用程式必須謹慎設定執行緒身份, (或將明確身份傳給 getPolicyForIdentity 呼叫) 。

出口服務

Intune App SDK 中包含的 AndroidManifest.xml 檔案包含 MAMNotificationReceiverService,必須是匯出服務,才能讓公司入口網站向受管理應用程式發送通知。 服務會檢查來電者,確保只有公司入口網站能發送通知。

反射限制

例如,部分 MAM 基底類別 (MAMActivity) MAMDocumentsProvider 包含基於原始 Android 基底類別的方法 () 使用僅在特定 API 層級以上出現的參數或回傳類型。 因此,可能不一定能用反射法枚舉所有應用程式元件的方法。 這個限制不僅限於 MAM,這和應用程式本身從 Android 基底類別實作這些方法時會適用的限制一樣。

羅博萊克特

在 Robolectric 下測試 Intune App SDK 的行為並不支援。 在 Robolectric 下執行 SDK 時,已知存在一些行為問題,這些行為無法準確模擬真實裝置或模擬器的表現。

如果你需要用 Robolectric 測試你的應用程式,建議的變通方法是將應用程式類別邏輯移到輔助工具,並用不繼承 MAMApplication 的應用程式類別來產生單元測試 apk。