Microsoft Intune App SDK for Android 開發人員指南
Microsoft Intune App SDK for Android 可讓您將 Intune 應用程式保護原則 (也稱為應用程式或 MAM 原則) 併入您的原生 Java/Kotlin Android 應用程式。 Intune 受控應用程式是與 Intune App SDK 整合的應用程式。 Intune 系統管理員可以在 Intune 主動管理應用程式時,輕鬆地將應用程式保護原則部署到 Intune 管理的應用程式。
重要事項
Intune 定期發行 Intune App SDK 的更新。 建議您訂閱 Intune App SDK 存放庫以取得更新,讓您可以將更新納入軟體開發發行週期,並確保您的應用程式支援最新的應用程式保護原則設定。
規劃在每個主要操作系統發行之前採取必要的 Intune App SDK 更新,以確保您的應用程式能繼續順暢地執行,因為操作系統更新可能會導致重大變更。 如果您未在主要作業系統發行之前更新至最新版本,您可能會遇到重大變更和/或無法將應用程式保護原則套用至應用程式的風險。
進程流程
下圖提供 Intune App SDK for Android 程式流程:
階段 Goals
本指南包含有關 Intune App SDK 架構、不常見整合步驟的相關信息,以及其他實用內容的詳細數據。
更詳細的 SDK
類別和方法取代
透過建置工具,Intune 應用程式 SDK 會嘗試將 Android 開發人員的整合負擔降到最低。 在建置工具之前,開發人員需要手動執行所有取代。
注意事項
應用程式現在 必須 與 SDK 建置工具整合,這會自動執行所有這些取代。
Android 基類會取代為其各自的 MAM 對等專案,以啟用 Intune 管理。
SDK 類別存在於 Android 基類和該類別的應用程式本身衍生版本之間。
例如,應用程式活動最後可能會有如下所示的繼承階層: AppSpecificActivity
擴充 MAMActivity
會擴充 Activity
。
MAM 層會篩選對系統作業的呼叫,以便順暢地為您的應用程式提供世界的受控檢視。
除了基類之外,您的應用程式可能不衍生自 (而使用的某些類別,例如 MediaPlayer
) 也有必要的 MAM 對等專案, 而且也必須取代某些方法呼叫。
下表列出許多MAM取代專案。
Android 基類 | Intune App SDK 取代 |
---|---|
android.app.Activity | MAMActivity |
android.app.ActivityGroup | MAMActivityGroup |
android.app.AliasActivity | MAMAliasActivity |
android.app.Application | MAMApplication |
android.app.Dialog | 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.Service | 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 時,您必須覆onMAMCreate()
寫 並呼叫 ,Activity
而不是覆onCreate()
寫和呼叫 super.onCreate()
super.onMAMCreate()
。
Java 編譯程式應該強制執行最終限制,以防止意外覆寫原始方法,而不是 MAM 對等專案。
包裝的系統服務
對於某些系統服務類別,必須在 MAM 包裝函式類別上呼叫靜態方法,而不是直接在服務實例上叫用所需的方法。
例如,對的呼叫 getSystemService(ClipboardManager.class).getPrimaryClip()
必須成為的 MAMClipboardManager.getPrimaryClip(getSystemService(ClipboardManager.class)
呼叫。
同樣地,必要的組建外掛程式會自動進行這些取代。
Android 類別 | Intune App 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
、 和 ,而其他類別只有一或兩個包裝的方法,例如 、PrintManager
DownloadManager
、PrintHelper
、View
、 DragEvent
NotificationManager
和 。NotificationManagerCompat
PackageManager
ContentResolver
ContentProviderClient
MDM 和 MAM 註冊
如第 4 階段的註冊與註冊中所述,Intune 應用程式 SDK 會「註冊」應用程式註冊的帳戶,讓帳戶受到原則保護。 此註冊成功之後,帳戶就會受到管理,而 MAM 原則現在應該套用至此帳戶。
「註冊」一詞也可以參考使用者起始的程式,以啟用 裝置管理 (MDM) 。 MDM 註冊與應用程式保護原則註冊完全分開。
SDK 整合應用程式可以有註冊應用程式保護原則的帳戶,而不需要註冊該帳戶來進行 裝置管理。 同樣地,使用者也可以註冊 裝置管理 的裝置,而不需要任何 SDK 整合的應用程式具有已註冊應用程式保護原則的帳戶。
一般而言,當開發人員和系統管理員參考註冊時,他們會參考 MDM 註冊,因為開發人員和終端使用者大多看不到應用程式保護原則註冊。 如需 MDM 註冊的詳細資訊,請參閱 註冊 Android 裝置 。
整合秘訣
瞭解 公司入口網站 記錄
公司入口網站 記錄包含Microsoft工程師用於問題調查的資訊。 某些記錄也適用於整合SDK的開發人員。
特別是,檔案 DiagnosticsInfo-scrubbed.log
包含 MAM 管理哪些應用程式的相關信息,以及區段中的 PolicyDB Information
MAM 原則詳細數據。
每個 Managed 應用程式在 區段中 PolicyDB Information
都有一個專案。
您應該在這裡尋找應用程式的套件名稱,以確認 MAM 原則已正確地以您的應用程式為目標。
如果您在這裡看不到應用程式的套件名稱,表示登入的帳戶未套用 MAM 原則。
如需每個 MAM 原則設定的說明,請參閱 Microsoft Intune 中的 Android 應用程式保護原則設定。 如需這些設定在 公司入口網站 記錄中顯示方式的說明,請參閱檢閱用戶端應用程式保護記錄。 當 MAM 原則未如預期般強制執行時,建議您檢查 公司入口網站 記錄或診斷 UI、確認您的應用程式是由 MAM 原則管理,並確認原則設定具有預期的值。
您可以使用下列其中一種方式來收集 公司入口網站 記錄:
- 透過 公司入口網站
- 開啟 公司入口網站 應用程式
- 選取右上角的三個點功能表
- 選取 [設定]
- 在 [診斷記錄] 底下,選取 [儲存記錄]
- 依照提示選擇輸出目錄以儲存 公司入口網站 記錄。
- 使用
adb shell pull
命令將記錄從 Android 裝置提取到本機電腦。
- [使用 Microsoft Edge for Android 存取受控應用程式記錄]。 這會顯示收集 公司入口網站 記錄和檢視 MAM 診斷的 UI。
- 呼叫
MAMPolicyManager.showDiagnostics(context)
以顯示用於收集 公司入口網站 記錄的相同UI。
使用變更的原則快速測試
當您正在開發和測試應用程式與 Intune App SDK 的整合時,您可能會經常變更測試使用者的應用程式保護原則設定。
根據預設,整合式應用程式會在使用中時,每隔 30 分鐘向 Intune 服務簽入更新的原則。 您可以避免此等候,並透過下 公司入口網站 強制簽入:
- 啟動 公司入口網站。 您不需要登入。
- 選取 ...功能表圖示。
- 選取 [設定]。
- 捲動至稱為「管理原則」的設定。
- 按 [同步處理] 按鈕。
這會立即排程簽入,並擷取以您的應用程式和帳戶為目標的最新原則。
針對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"
然後,將和套件中 com.microsoft.intune.mam.client.support.v7
com.microsoft.intune.mam.client.support.v4
MAM 類別的所有參考取代為其 AndroidX 對等專案,以修正產生的編譯時期錯誤。
例如, 的 MAMAppCompatActivity
參考應該變更為 AndroidX 的 AppCompatActivity
。
如上所述,MAM 組建外掛程式/工具會在編譯階段自動以適當的 MAM 對等專案重寫 AndroidX 連結庫中的類別。
限制和特殊案例
默認註冊
您的應用程式也可以透過稱為 預設註冊的簡化程式來註冊應用程式保護原則。 這項功能主要是支援尚未整合 MSAL 的私人企業營運應用程式。
警告
默認註冊隨附重大取捨, 不建議使用。 利用默認註冊的應用程式不支援條件式存取、不受益於 SSO 與Microsoft服務,且無法由非 Intune 帳戶使用。 如果您的應用程式隨附至公用應用程式市集,則不支援默認註冊。
默認註冊會強制終端使用者安裝 公司入口網站 並完成 MAM 註冊流程,再允許使用者進入您的應用程式。
注意事項
默認註冊是主權雲端感知。
使用下列步驟啟用預設註冊:
如果您的應用程式整合了 MSAL,或您需要啟用 SSO,請 設定 MSAL。 如果沒有,您可以略過此步驟。
在標記下的
<application>
指令清單中新增下列值,以啟用預設註冊:<meta-data android:name="com.microsoft.intune.mam.DefaultMAMServiceEnrollment" android:value="true" />
在標記下的
<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 層級FLAG_SECURE
限制的Window
自訂螢幕擷取功能,您必須先檢查螢幕擷取原則,才能允許完整存取功能。
例如,如果您的應用程式使用自定義轉譯引擎將目前的檢視轉譯為 PNG 檔案,您必須先檢查 AppPolicy.getIsScreenCaptureAllowed()
。
如果您的應用程式不包含任何自定義或第三方螢幕擷取功能,則不需要採取任何動作來限制螢幕擷取。
螢幕擷取原則會在所有 MAM 整合式應用程式的 Window
層級自動強制執行。
OS 或其他應用程式在應用程式中擷取 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
不支援在 Robolectric 下測試 Intune 應用程式 SDK 行為。 在 Robolectric 下執行 SDK 有一些已知問題,因為 Robolectric 下的行為無法精確地模擬真實裝置或模擬器上的行為。
如果您需要在 Robolectric 下測試應用程式,建議的因應措施是將應用程式類別邏輯移至協助程式,並使用不繼承自 MAMApplication 的應用程式類別來產生單元測試 apk。