Microsoft Intune App SDK for Android 開発者ガイド

Microsoft Intune App SDK for Android を使用すると、Intune アプリ保護ポリシー ( APP または MAM ポリシーとも呼ばれます) をネイティブの Java/Kotlin Android アプリに組み込むことができます。 Intune で管理されるアプリケーションは、Intune App SDK と統合されたアプリケーションです。 Intune 管理者は、Intune がアプリをアクティブに管理するときに、Intune で管理されるアプリにアプリ保護ポリシーを簡単に展開できます。

重要

Intune では、 Intune App SDK の更新プログラムが定期的にリリースされます。 更新プログラムをソフトウェア開発リリース サイクルに組み込み、アプリが最新の App Protection ポリシー設定を確実にサポートできるように、更新プログラムについては Intune App SDK リポジトリをサブスクライブすることをお勧めします。

OS の更新によって重大な変更が発生する可能性があるため、すべての主要な OS リリースの前に必須の Intune App SDK 更新プログラムを実行して、アプリがスムーズに実行されるように計画します。 メジャー OS リリースの前に最新バージョンに更新しない場合は、重大な変更が発生したり、アプリにアプリ保護ポリシーを適用できなかったりするリスクが発生する可能性があります。

プロセス フロー

次の図は、Intune App SDK for Android プロセス フローを示しています。

Microsoft Intune のアーキテクチャの概要図。

ステージの目標

このガイドには、Intune App SDK のアーキテクチャ、一般的でない統合手順に関する情報、およびその他の役立つコンテンツの詳細が記載されています。

詳細の SDK

クラスとメソッドの置換

ビルド ツールを通じて、Intune App SDK は Android 開発者の統合の負担を最小限に抑えようとします。 ビルド ツールの前に、開発者はすべての置換を手動で実行する必要があります。

注:

アプリは SDK ビルド ツールと統合する必要があります。これにより、これらの置換がすべて自動的に実行されます。

Android 基本クラスは、Intune 管理を有効にするために、対応する MAM に置き換えられます。 SDK クラスは、Android 基本クラスとそのクラスのアプリ独自の派生バージョンの間に存在します。 たとえば、アプリ アクティビティでは、継承階層が最終的に次のようになります。AppSpecificActivityは、Activityを拡張MAMActivity拡張します。 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 置換クラスで final としてマークされています。 この場合、MAM 置換クラスは、代わりにオーバーライドする必要がある同様の名前付きメソッド (一般に MAMサフィックス) を提供します。 たとえば、 MAMActivity から派生する場合、 onCreate() をオーバーライドして super.onCreate()を呼び出す代わりに、 ActivityonMAMCreate() をオーバーライドし、 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

一部のクラスでは、 ClipboardManagerContentProviderClientContentResolverPackageManager など、ほとんどのメソッドがラップされていますが、他のクラスでは、 DownloadManagerPrintManagerPrintHelperViewDragEventNotificationManagerNotificationManagerCompatなど、1 つまたは 2 つのメソッドのみがラップされます。

MDM と MAM 登録

「ステージ 4 の登録と登録」で説明したように、Intune App SDK は、アカウントがポリシーで保護されるように、アプリが登録するアカウントを "登録" します。 この登録が成功すると、アカウントが管理され、MAM ポリシーがこのアカウントに適用されます。

"登録" という用語は、デバイス管理 (MDM) を有効にするためのエンド ユーザーが開始したプロセスを指すこともできます。 MDM 登録は、App Protection Policy の登録とは完全に分離されています。

SDK 統合アプリは、そのアカウントをデバイス管理に登録せずに、App Protection ポリシーに登録されたアカウントを持つことができます。 同様に、ユーザーは、アプリ保護ポリシーに登録されたアカウントを持つ SDK 統合アプリを持たずに、デバイス管理用のデバイスを登録できます。

通常、開発者と管理者が登録を参照する場合、アプリ保護ポリシーの登録は開発者とエンド ユーザーの両方にほとんど見えないため、MDM 登録を参照します。 MDM 登録の詳細については、「 Android デバイス の登録」を参照してください。

統合のヒント

ポータル サイトのログについて

ポータル サイト ログには、Microsoft エンジニアが問題調査に使用する情報が含まれています。 一部のログは、SDK を統合する開発者にも役立ちます。

特に、ファイル DiagnosticsInfo-scrubbed.log には、MAM によって管理されるアプリに関する情報と、 PolicyDB Information セクションの MAM ポリシーの詳細が含まれています。 すべてのマネージド アプリには、 PolicyDB Information セクションにエントリがあります。 MAM ポリシーがアプリを正しく対象としていることを確認するには、ここでアプリのパッケージ名を探す必要があります。 アプリのパッケージ名がここに表示されない場合は、ログインしたアカウントに MAM ポリシーが適用されていないことを示します。

各 MAM ポリシー設定の詳細については、 Microsoft Intune の Android アプリ保護ポリシー設定に関するページを参照してください。 ポータル サイト ログにこれらの設定がどのように表示されるかについては、「 クライアント アプリ保護ログを確認する」を参照してください。 MAM ポリシーが想定どおりに適用されていない場合は、ポータル サイトのログまたは診断 UI を確認し、アプリが MAM ポリシーによって管理されていることを確認し、ポリシー設定に期待値があることを確認することをお勧めします。

ポータル サイト ログは、次のいずれかの方法で収集できます。

  • ポータル サイトを通じて
    • ポータル サイト アプリを開く
    • 右上隅にある 3 つのドット メニューを選択します
    • [設定] を選択します
    • [診断ログ] で、[ログの保存] を選択します。
    • プロンプトに従って出力ディレクトリを選択し、ポータル サイト ログを保存します。
    • adb shell pull コマンドを使用して、Android デバイスからローカル コンピューターにログをプルします。
  • [Microsoft Edge for Android を使用してマネージド アプリ ログにアクセスする]。 ポータル サイト のログを収集し、MAM 診断を表示するための UI が表示されます。
  • ポータル サイト ログを収集するために同じ UI を表示するには、 MAMPolicyManager.showDiagnostics(context) を呼び出します。

ポリシーの変更による迅速なテスト

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"

次に、 com.microsoft.intune.mam.client.support.v7 および com.microsoft.intune.mam.client.support.v4 パッケージ内の MAM クラスへのすべての参照を AndroidX と同等のパッケージに置き換えることで、結果として得られるコンパイル時エラーを修正します。 たとえば、 MAMAppCompatActivity への参照を AndroidX の AppCompatActivityに変更する必要があります。 上で説明したように、MAM ビルド プラグイン/ツールは、コンパイル時に適切な MAM に相当する AndroidX ライブラリのクラスを自動的に書き換えます。

制限事項と特殊なケース

既定の登録

アプリケーションは、 既定の登録と呼ばれる簡略化されたプロセスを使用して、アプリ保護ポリシーに代わりに登録できます。 この機能は主に、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 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 レベルで自動的に適用されます。

OS または別のアプリがアプリ内の Window をキャプチャしようとすると、必要に応じてブロックされます。 たとえば、ユーザーが Android の組み込みのスクリーンショットや画面記録機能を介してアプリの画面をキャプチャしようとすると、アプリからの参加なしにキャプチャが自動的に制限されます。

ポリシーの適用の制限事項

  • コンテンツ リゾルバーの使用: "転送または受信" Intune ポリシーは、コンテンツ リゾルバーを使用して別のアプリのコンテンツ プロバイダーにアクセスすることをブロックまたは部分的にブロックする場合があります。 これにより、 ContentResolver メソッドは null を返すか、エラー値をスローします (たとえば、 openOutputStream はブロックされた場合に FileNotFoundException をスローします)。 アプリは、次の呼び出しを行うことで、コンテンツ リゾルバーを介してデータを書き込めなかったのがポリシーによって発生した (またはポリシーによって引き起こされる) かどうかを判断できます。

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

    または、関連するアクティビティがない場合:

    MAMPolicyManager.getCurrentThreadPolicy().getIsSaveToLocationAllowed(contentURI);
    

    この 2 番目のケースでは、マルチ ID アプリがスレッド ID を適切に設定するように注意する必要があります (または、明示的な ID を getPolicyForIdentity 呼び出しに渡す)。

エクスポートされたサービス

Intune App SDK に含まれる AndroidManifest.xml ファイルには MAMNotificationReceiverService が含まれています。これは、ポータル サイトがマネージド アプリに通知を送信できるようにするためにエクスポートされたサービスである必要があります。 サービスは呼び出し元をチェックして、ポータル サイトのみが通知の送信を許可されていることを確認します。

リフレクションの制限事項

一部の MAM 基底クラス (たとえば、 MAMActivityMAMDocumentsProvider) には、特定の API レベルの上にのみ存在するパラメーターまたは戻り値の型を使用する (元の Android 基底クラスに基づく) メソッドが含まれています。 このため、リフレクションを使用してアプリ コンポーネントのすべてのメソッドを列挙できるわけではありません。 この制限は MAM に限定されるものではなく、アプリ自体が Android 基本クラスからこれらのメソッドを実装した場合に適用されるのと同じ制限です。

Robolectric

Robolectric での Intune App SDK の動作のテストはサポートされていません。 Robolectric の下で SDK を実行する既知の問題は、実際のデバイスやエミュレーター上の動作を正確に模倣しない Robolectric の下に存在するためです。

Robolectric でアプリケーションをテストする必要がある場合、推奨される回避策は、アプリケーション クラス ロジックをヘルパーに移動し、MAMApplication から継承しないアプリケーション クラスを使用して単体テスト APK を生成することです。