適用於 Android 的 Microsoft Intune App SDK 開發人員指南

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

重要事項

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

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

處理流程

下圖提供適用於 Android 的 Intune App SDK 程序流程:

Microsoft Intune 的高階架構圖表。

階段目標

本指南包含有關 Intune App 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.ActivityGroup MAMActivityGroup
android.app.AliasActivity MAMAliasActivity
android.app.應用程式 MAMA應用程式
android.app.對話方塊 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.服務 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 衍生時,而不是重onCreate()寫和呼叫 super.onCreate(),必須重寫onMAMCreate()和呼叫 super.onMAMCreate()Activity 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、 、 ContentResolverContentProviderClientPackageManager而其他類別則只包裝了一兩個方法,例如 DownloadManagerPrintManagerNotificationManagerPrintHelperViewDragEventNotificationManagerCompat和 。

MDM 和 MAM 註冊

如第 4 階段的註冊與註冊中所述,Intune App 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 裝置提取到本機電腦。
  • [使用適用於 Android 的 Microsoft Edge 存取受管理的應用程式記錄]。 這會顯示收集公司入口網站記錄和檢視 MAM 診斷的 UI。
  • 呼叫MAMPolicyManager.showDiagnostics(context)以顯示用於收集公司入口網站記錄的相同 UI。

隨著變更的原則進行快速測試

當您開發和測試應用程式的 Intune 應用程式 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 支援類別。 若要避免這類錯誤,請以 AndroidX 對應項目取代所有 MAM 支援類別參照。 若要這麼做,您可以先從 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 套件中 com.microsoft.intune.mam.client.support.v7 MAM 類別的所有參考都取代為 AndroidX 的對應項,以修正產生的編譯階段錯誤。 例如,應該將 的 MAMAppCompatActivity 參照變更為 AndroidX 的 AppCompatActivity。 如上所述,MAM 建置外掛程式/工具會在編譯時使用適當的 MAM 對應項自動重寫 AndroidX 程式庫中的類別。

限制和特殊情況

預設註冊

您的應用程式可以透過稱為 預設註冊的簡化程序,交替註冊應用程式保護原則。 此功能主要用於支援尚未整合 MSAL 的私人企業營運應用程式。

警告

預設註冊會伴隨著重大的取捨, 因此不建議使用。 利用預設註冊的應用程式不支援條件式存取,無法從 Microsoft 服務的 SSO 中受益,而且非 Intune 帳戶無法使用。 如果您的應用程式會出貨至公用 App Store,則不支援預設註冊。

預設註冊會強制使用者安裝公司入口網站,並完成 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 App SDK 無法將保護套用至獨立的進程。 支援) (android:isolatedProcess 的隔離處理程序需要新增下面的中繼資料標籤。

警告

藉由新增此中繼資料,您的應用程式宣告隔離的處理程序無法公開組織資料。 您的應用程式負責保證這一點。

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

自訂螢幕Capture限制

如果您的應用程式包含會略過 Android 層級限制的WindowFLAG_SECURE自訂螢幕擷取功能,您必須先檢查螢幕擷取原則,才能允許完整存取該功能。 例如,如果您的應用程式使用自訂轉譯引擎將目前檢視轉譯至 PNG 檔案,您必須先檢查 AppPolicy.getIsScreenCaptureAllowed()

如果您的應用程式不包含任何自訂或協力廠商的螢幕擷取功能,您不需要採取任何動作來限制螢幕擷取。 螢幕擷取原則會自動在層級針對 Window 所有 MAM 整合應用程式強制執行。

系統會視需要封鎖作業系統或其他應用程式對擷取您應用程式中 A Window 的任何嘗試。 例如,如果使用者嘗試透過 Android 內建的螢幕擷取畫面或螢幕錄製功能來擷取您應用程式的螢幕畫面,擷取會自動受限,而不需要您的應用程式參與。

原則強制執行限制

  • 使用內容解析程式:「傳輸或接收」Intune 原則可能會封鎖或部分封鎖使用內容解析程式存取另一個應用程式中的內容提供者。 這會導致 ContentResolver 方法傳回 null 或擲回失敗值 (例如, openOutputStream 如果被封鎖) 則會擲回 FileNotFoundException 。 應用程式可以透過呼叫來判斷無法透過內容解析程式寫入資料是由原則 (所造成,還是會由原則) 所造成:

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

    或者,如果沒有相關聯的活動:

    MAMPolicyManager.getCurrentThreadPolicy().getIsSaveToLocationAllowed(contentURI);
    

    在第二種情況下,多重身分識別應用程式必須注意適當地設定執行緒身分識別 (或將明確身分識別傳遞給 getPolicyForIdentity 呼叫) 。

匯出的服務

Intune App SDK 中包含的 AndroidManifest.xml 檔案包含 MAMNotificationReceiverService,該服務必須是匯出的服務,才能讓公司入口網站傳送通知至受管理的應用程式。 服務會檢查呼叫者,以確保只允許公司入口網站傳送通知。

反射限制

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

Robolectric

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

如果您需要在 Robolectric 下測試應用程序,建議的解決方法是將應用程序類邏輯移動到協助程序,並使用未繼承自 MAMApplication 的應用程序類生成單元測試 apk。