共用方式為


適用於 Android 的 Microsoft Intune 應用程式 SDK 開發人員指南

適用於 Android 的 Microsoft Intune 應用程式 SDK 可讓您將 Intune 應用程式保護原則 (也稱為 MAM 原則) 併入原生 Java/Kotlin Android 應用程式。 Intune 受控應用程式是與 Intune 應用程式 SDK 整合的應用程式。 當 Intune 主動管理應用程式時,Intune 系統管理員可以輕鬆地將應用程式保護原則部署至 Intune 管理的應用程式。

重要事項

Intune 會定期發行 Intune 應用程式 SDK 的更新。 建議您訂閱 Intune 應用程式 SDK 存放庫以取得更新,以便將更新併入軟體開發發行週期,並確保您的應用程式支援最新的應用程式保護原則設定。

規劃在每個主要 OS 版本之前進行強制性 Intune 應用程式 SDK 更新,以確保您的應用程式繼續順利執行,因為 OS 更新可能會導致重大變更。 如果您未在主要 OS 版本之前更新至最新版本,您可能會面臨發生重大變更和/或無法將應用程式保護原則套用至應用程式的風險。

流程

下圖提供適用於 Android 的 Intune 應用程式 SDK 程式流程:

Microsoft Intune 的高階架構圖。

階段 Goals

本指南包含 Intune 應用程式 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.活動群組 MAMActivity集團
android.app.AliasActivity MAMAlias活動
android.app.申請 MAM應用
android.app.對話框 MAMDialog
android.app.AlertDialog.Builder MAMAlertDialogBuilder
android.app.DialogFragment MAMDialog片段
android.app.ExpandableListActivity MAMExpandableList活動
android.app.片段 MAMFragment
android.app.Intent服務 MAMIntentService
android.app.Launcher活動 MAMLauncher活動
android.app.ListActivity MAMList活動
android.app.ListFragment MAMList片段
android.app.原生活動 MAMNative活動
android.app.PendingIntent MAMPendingIntent
android.app.服務 MAM服務
android.app.Tab活動 MAMTab活動
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.JobService MAMJob服務
android.content.BroadcastReceiver 的 MAMBroadcast接收器
android.content.ContentProvider MAMContentProvider
android.os.活頁夾 MAMBinder (只有在 Binder 不是從 Android 介面定義語言 (AIDL) 介面) 產生時才需要
android.media.Media播放器 MAMMedia播放器
android.media.MediaMetadataRetriever MAMMediaMetadataRetriever
android.media.MediaRecorder MAMMedia記錄器
android.provider.DocumentsProvider MAMDocuments提供者
android.preference.PreferenceActivity MAMPreference活動
android.widget.PopupWindow MAMPopup選單
android.widget.PopupWindow MAMPopup視窗
android.widget.ListPopupWindow MAMList彈出視窗
android.widget.TextView MAMTextView
android.widget.AutoCompleteTextView MAMAutoCompleteTextView
android.widget.CheckedTextView MAMCheckedTextView
android.widget.EditText MAMEditText
android.inputmethodservice.ExtractEditText MAMExtract編輯文字
android.widget.MultiAutoCompleteTextView MAMMultiAutoCompleteTextView
android.view.LayoutInflater MAMLayoutInflater
android.view.View群組 MAMView集團
android.view.SurfaceView MAMSurface視圖
android.opengl.GLSurface視圖 MAMGLSurfaceView
android.widget.VideoView MAMVideoView

重新命名的方法

在許多情況下,Android 類別中可用的方法已在 MAM 取代類別中標示為最終。 在此情況下,MAM 取代類別會提供類似名稱的方法 (通常會以您應該改為覆寫的) 尾碼 MAM 。 例如,從 MAMActivity 衍生時,而不是覆寫 onCreate() 並呼叫 super.onCreate()Activity 必須覆寫 onMAMCreate() 並呼叫 super.onMAMCreate()。 Java 編譯器應該強制執行最終限制,以防止意外覆寫原始方法,而不是對等的 MAM。

包裝系統服務

針對某些系統服務類別,必須在 MAM 包裝函式類別上呼叫靜態方法,而不是直接在服務實例上叫用所需的方法。 例如,對 的 getSystemService(ClipboardManager.class).getPrimaryClip() 呼叫必須變成對 MAMClipboardManager.getPrimaryClip(getSystemService(ClipboardManager.class)的呼叫。 同樣,所需的構建插件會自動進行這些替換。

Android 類 Intune 應用程式 SDK 取代
android.content.ClipboardManager MAM滑板
android.content.ContentProviderClient MAMContentProviderClientManagement
android.content.ContentResolver MAMContentResolverManagement
android.content.pm.PackageManager MAMPackage管理
android.app.下載管理器 MAMDownloadManagement
android.print.PrintManager MAMPrint管理
android.view.視圖 MAMView管理
android.view.DragEvent MAMDragEventManagement
android.view.LayoutInflater MAMLayoutInflater管理
android.app.通知管理器 MAMNotification管理
android.app.blob.BlobStoreManager MAMBlobStoreManager
android.app.blob.BlobStoreManager.Session MAMBlobStoreManager.Session

有些類別的大部分方法都包裝了,例如 ClipboardManager、 、 ContentProviderClientContentResolver,而PackageManager其他類別則只包裝了一個或兩個方法,例如 DownloadManagerViewNotificationManagerCompatPrintManagerPrintHelperDragEventNotificationManager 和 。

MDM 和 MAM 註冊

第 4 階段的註冊與註冊中所述,Intune 應用程式 SDK 會「註冊」您的應用程式註冊的帳戶,以便該帳戶受到原則保護。 此註冊成功之後,帳戶就會變成受控帳戶,而且 MAM 原則現在應該套用至此帳戶。

術語「註冊」也可以指最終使用者啟動的啟用裝置管理 (MDM) 的程式。 MDM 註冊與應用程式保護原則註冊完全不同。

SDK 整合的應用程式可以註冊應用程式保護原則的帳戶,而不需要註冊該帳戶以進行裝置管理。 同樣地,使用者可以註冊裝置以進行裝置管理,而不需要任何具有註冊應用程式保護原則帳戶的 SDK 整合應用程式。

一般而言,當開發人員和系統管理員參考註冊時,他們指的是 MDM 註冊,因為開發人員和終端使用者基本上看不到應用程式保護原則註冊。 請參閱註冊 Android 裝置 ,以取得 MDM 註冊的詳細資訊。

整合技巧

瞭解公司入口網站記錄

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

特別是,檔案 DiagnosticsInfo-scrubbed.log 包含 MAM 所管理哪些應用程式的相關資訊,以及區 PolicyDB Information 段中的 MAM 原則詳細數據。 每個受管理應用程式在區 PolicyDB Information 段中都有一個項目。 您應該在這裡尋找應用程式的套件名稱,以確認 MAM 原則正確地以您的應用程式為目標。 如果您在這裡看不到應用程式的套件名稱,表示登入的帳戶未套用 MAM 原則。

如需每個 MAM 原則設定的描述,請參閱 Microsoft Intune 中的 Android 應用程式保護原則設定。 如需這些設定如何在公司入口網站記錄中顯示的描述,請參閱檢閱用戶端應用程式保護記錄。 當 MAM 原則未如預期強制執行時,建議您檢查公司入口網站記錄或診斷 UI、確認您的應用程式是由 MAM 原則管理,並確認原則設定具有預期值。

您可以使用下列其中一種方式收集公司入口網站記錄:

  • 透過公司入口網站
    • 開啟 [公司入口網站] 應用程式
    • 選擇右上角的三個點選單
    • 選擇設定
    • 在 [診斷記錄] 底下,選取 [儲存記錄]
    • 請遵循提示選擇輸出目錄,以儲存公司入口網站記錄。
    • 使用命令將 adb shell pull 日誌從 Android 設備提取到本地計算機。
  • [使用適用於 Android 的 Microsoft Edge 存取受控應用程式記錄]。 這會顯示用於收集公司入口網站記錄和檢視 MAM 診斷的 UI。
  • 呼叫以MAMPolicyManager.showDiagnostics(context)顯示相同的 UI,以收集公司入口網站記錄。

根據不斷變化的政策快速測試

當您開發和測試應用程式的 Intune 應用程式 SDK 整合時,您可能會經常變更測試使用者的應用程式保護原則設定。

根據預設,整合式應用程式會在作用中時,每 30 分鐘簽入一次 Intune 服務以取得更新的原則。 您可以避免此等候,並透過公司入口網站強制簽入:

  1. 啟動公司入口網站。 您不需要登入。
  2. 選取 ...選單圖示。
  3. 選取 [設定]。
  4. 捲動至名為「管理原則」的設定。
  5. 按下同步按鈕。

這會立即排程簽入,並擷取以您的應用程式和帳戶為目標的最新政策。

疑難排解 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"

然後,將 和 com.microsoft.intune.mam.client.support.v4 套件中 com.microsoft.intune.mam.client.support.v7 MAM 類別的所有參照取代為 AndroidX 對等專案,以修正產生的編譯時間錯誤。 例如,對 的 MAMAppCompatActivity 引用應更改為 AndroidX 的 AppCompatActivity。 如上所述,MAM 建置外掛程式/工具會在編譯階段自動重寫 AndroidX 程式庫中的類別,並具有適當的 MAM 對等專案。

限制和特殊情況

預設註冊

您的應用程式也可以透過稱為 預設註冊的簡化程式來註冊應用程式保護原則。 這項功能主要是為了支援尚未整合 MSAL 的私人企業營運應用程式。

警告

預設註冊會帶來重大取捨, 不建議使用。 利用預設註冊的應用程式不支援條件式存取、無法受益於 Microsoft 服務的 SSO,而且無法由非 Intune 帳戶使用。 如果您的應用程式運送到公開應用程式商店,則不支援預設註冊。

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

注意事項

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

使用下列步驟啟用預設註冊:

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

  2. 在資訊清單中的標籤 <application> 下新增下列值,以啟用預設註冊:

    <meta-data android:name="com.microsoft.intune.mam.DefaultMAMServiceEnrollment" android:value="true" />
    
  3. 在資訊清單中的標籤下 <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,這必須是匯出的服務,才能讓公司入口網站將通知傳送至受控應用程式。 服務會檢查來電端,以確保只允許公司入口網站傳送通知。

反射限制

例如, MAMActivity某些 MAM 基類 (, MAMDocumentsProvider) 包含以原始 Android 基類為基礎 (的方法) ,這些基類使用僅存在於特定 API 級別之上的參數或傳回類型。 基於這個理由,可能不一定能夠使用反射來列舉應用程式元件的所有方法。 此限制不限於 MAM,如果應用程式本身從 Android 基類實作這些方法,則會套用相同的限制。

羅博克特里克

不支援在 Robolectric 下測試 Intune 應用程式 SDK 行為。 在 Robolectric 下運行 SDK 時存在已知問題,因為 Robolectric 下存在的行為無法準確模擬真實裝置或模擬器上的行為。

如果您需要在 Robolectric 下測試應用程式,建議的因應措施是將應用程式類別邏輯移至協助程式,並使用未繼承自 MAMApplication 的應用程式類別產生單元測試 apk。