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 のプロセス フローを示しています。
ステージ目標
このガイドには、Intune アプリ SDK のアーキテクチャに関する詳細、まれな統合手順に関する情報、その他の役立つコンテンツが含まれています。
SDK の詳細
クラスとメソッドの置換
ビルド ツールを通じて、Intune アプリ SDK は、Android 開発者の統合負担を最小限に抑えようとします。 ビルド ツールが登場する前は、開発者はすべての置換を手動で実行する必要がありました。
注:
アプリは、これらの置換のすべてを自動的に実行する SDK ビルド ツールと統合する必要が生じました。
Android 基本クラスは、Intune 管理を有効にするために、それぞれの MAM に相当するものに置き換えられます。
SDK クラスは、Android 基本クラスと、アプリ独自の派生バージョンのそのクラスの間に存在します。
たとえば、アプリ アクティビティは、継承階層が次のようになる場合があります: AppSpecificActivity 拡張 MAMActivity 拡張 Activity。
MAM レイヤーは、アプリに管理されたワールド ビューをシームレスに提供するために、システム操作の呼び出しをフィルター処理します。
基本クラスに加えて、アプリが派生元で使用せずに使用する可能性がある一部のクラス ( MediaPlayer など) には、同等の MAM が必要なものもあり、 一部のメソッド呼び出しも置き換える必要があります。
次の表は、MAM の代替要素の多くを示しています。
| Android ベース クラス | Intune アプリ SDK の置き換え |
|---|---|
| android.app.アクティビティ | MAMActivity |
| android.app.ActivityGroup | MAMActivityGroup |
| android.app.AliasActivity | MAMAliasActivity |
| android.app.アプリケーション | MAMApplication |
| android.app.Dialog | MAMDialog |
| android.app.AlertDialog.Builder | MAMAlertDialogBuilder |
| android.app.DialogFragment | MAMDialogFragment |
| android.app.ExpandableListActivity | MAMExpandableListActivity |
| android.app.フラグメント | 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() を呼び出す代わりに、 Activity は onMAMCreate() をオーバーライドして super.onMAMCreate() を呼び出す必要があります。
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、ContentProviderClient、ContentResolver、PackageManager などのほとんどのメソッドがラップされているクラスもあれば、DownloadManager、PrintManager、PrintHelper、View、DragEvent、NotificationManager、NotificationManagerCompat などの 1 つまたは 2 つのメソッドしかラップされていないクラスもあります。
MDM と MAM の登録
ステージ 4 の登録と登録で説明したように、Intune アプリ 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 ポリシーによって管理されていることを確認し、ポリシー設定に期待値が含まれていることを確認することをお勧めします。
ポータル サイト ログは、次のいずれかの方法で収集できます。
- ポータル サイトを使用する
- ポータル サイト アプリを開く
- 右上隅にある 3 つのドット メニューを選択します
- [設定] を選択する
- [診断ログ] で、[ログの保存] を選択します
- プロンプトに従って、ポータル サイト ログを保存する出力ディレクトリを選択します。
-
adb shell pullコマンドを使用して、Android デバイスからローカル コンピューターにログを取得します。
- [Android 版 Microsoft Edge を使用して、マネージド アプリ ログにアクセスする]。 これにより、ポータル サイト ログを収集し、MAM 診断を表示するための UI が表示されます。
-
MAMPolicyManager.showDiagnostics(context)を呼び出して、ポータル サイト ログの収集に使用するのと同じ UI を表示します。
ポリシーの変更に伴う迅速なテスト
Intune App SDK のアプリの統合を開発してテストするときに、テスト ユーザーのアプリ保護ポリシー設定を頻繁に変更する場合があります。
既定では、統合アプリは、アクティブな場合、30 分ごとに Intune サービスにチェックインして更新されたポリシーを確認します。 このような待機を回避し、ポータル サイトを介してチェックインを強制的に実行できます。
- ポータル サイトを起動します。 サインインする必要はありません。
- ...メニュー アイコン。
- [設定] を選択します。
- [管理ポリシー] という設定までスクロールします。
- [同期] ボタンを押します。
これにより、チェックインがすぐにスケジュールされ、アプリとアカウントを対象とした最新のポリシーが取得されます。
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.v7 および com.microsoft.intune.mam.client.support.v4 パッケージ内の MAM クラスへのすべての参照を、相当する AndroidX に置き換えることにより、結果として生じるコンパイル時エラーを修正します。
たとえば、 MAMAppCompatActivity への参照は AndroidX の AppCompatActivityに変更する必要があります。
前述のとおり、MAM ビルド プラグイン/ツールは、コンパイル時に、AndroidX ライブラリ内のクラスを同等の適切な MAM 関数で自動的に書き換えます。
制限事項と特殊なケース
既定の登録
アプリケーションは、 既定の登録と呼ばれる簡略化されたプロセスを使用して、代わりにアプリ保護ポリシーに登録できます。 この機能は主に、MSAL を統合していないプライベート基幹業務アプリをサポートするためです。
警告
既定の登録には大きなトレードオフが伴うため、 推奨されません。 既定の登録を利用するアプリでは、条件付きアクセスはサポートされておらず、Microsoft サービスでの SSO のメリットは得られず、Intune 以外のアカウントでは使用できません。 アプリがパブリック アプリ ストアに出荷される場合、既定の登録はサポートされません。
既定の登録では、エンド ユーザーがアプリケーションに参加できるようにする前に、強制的にポータル サイトをインストールし、MAM 登録フローを完了する必要があります。
注:
既定の登録は、ソブリン クラウド対応です。
次の手順で、既定の登録を有効にします。
アプリに MSAL が統合されている場合、または SSO を有効にする必要がある場合は、 MSAL を構成します。 そうでない場合は、この手順をスキップできます。
マニフェストの
<application>タグの下に次の値を追加して、既定の登録を有効にします。<meta-data android:name="com.microsoft.intune.mam.DefaultMAMServiceEnrollment" android:value="true" />MAM ポリシーを有効にするには、マニフェストの
<application>タグの下に次の値を追加します。<meta-data android:name="com.microsoft.intune.mam.MAMPolicyRequired" android:value="true" />
分離されたプロセス
Intune アプリ SDK は、分離されたプロセスに保護を適用できません。
分離プロセス (android:isolatedProcess) をサポートするには、以下のメタデータ タグを追加する必要があります。
警告
このメタデータを追加することで、アプリケーションは分離されたプロセスが organization データを公開できないことを宣言します。 これを保証する責任はアプリケーションにあります。
<meta-data android:name="com.microsoft.intune.mam.AllowIsolatedProcesses" android:value="true" />
カスタム画面Capture制限
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 を適切に設定する (または、
getPolicyForIdentity呼び出しに明示的な ID を渡す) ように注意する必要があります。
エクスポートされたサービス
Intune App SDK に含まれる AndroidManifest.xml ファイルには MAMNotificationReceiverService が含まれています。これは、ポータル サイトがマネージド アプリに通知を送信できるようにエクスポートされたサービスである必要があります。 サービスは、呼び出し元をチェックして、ポータル サイトのみが通知の送信を許可されていることを確認します。
リフレクションの制限事項
一部の MAM 基本クラス ( MAMActivity、 MAMDocumentsProvider など) には、特定の API レベルを超える場合にのみ存在するパラメーターまたは戻り値の型を使用するメソッド (元の Android 基本クラスに基づく) が含まれています。
このため、アプリケーション コンポーネントのすべてのメソッドを列挙するためにリフレクションを使用できるとは限りません。
この制限は MAM に限定されず、アプリ自体が Android 基本クラスからこれらのメソッドを実装した場合に適用される制限と同じです。
Robolectric
Robolectric での Intune アプリ SDK の動作のテストはサポートされていません。 Robolectric で SDK を実行する際には、実際のデバイスやエミュレーター上で正確に模倣しない動作が Robolectric で存在するため、既知の問題があります。
Robolectric でアプリケーションをテストする必要がある場合、推奨される回避策は、アプリケーション クラス ロジックをヘルパーに移動し、MAMApplication から継承しないアプリケーション クラスで単体テスト apk を生成することです。