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

Android 用 Microsoft Intune App SDK を使用すると、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のアーキテクチャの概要図。

ステージ Goals

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

詳細の SDK

クラスとメソッドの置換

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

注:

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

Android 基本クラスは、Intune 管理を有効にするために、対応する MAM に置き換えられます。 SDK クラスは、Android 基本クラスとそのクラスのアプリ独自の派生バージョンの間に存在します。 たとえば、アプリ アクティビティは、次のような継承階層で終わる可能性があります。 AppSpecificActivity 拡張 MAMActivityActivityです。 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 から派生する場合は、 をオーバーライドして呼び出super.onCreate()Activityす代わりに、 をonCreate()オーバーライドonMAMCreate()して を呼び出す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

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

MDM と MAM 登録

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

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

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

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

統合のヒント

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

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

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

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

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

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

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

Intune App SDK のアプリの統合を開発してテストする際に、テスト ユーザーのアプリ保護ポリシー設定を頻繁に変更する場合があります。

既定では、統合アプリは Intune サービスにチェックされ、更新されたポリシーは 30 分ごとにアクティブになります。 この待機を回避し、ポータル サイトを介して強制的にチェックインできます。

  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.v4 パッケージ内の MAM クラスへのすべての参照を AndroidX と同等の値にcom.microsoft.intune.mam.client.support.v7置き換えることで、結果のコンパイル時エラーを修正します。 たとえば、 への参照を 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. タグの下のマニフェストに次の値を追加して、MAM ポリシーを <application> 有効にする必要があります。

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

分離プロセス

Intune App SDK は、分離されたプロセスに保護を適用できません。 分離プロセス (android:isolatedProcess) のサポートには、以下のメタデータ タグを追加する必要があります。

警告

このメタデータを追加することで、分離されたプロセスでデータorganization公開できないことがアプリケーションで宣言されます。 お客様のアプリケーションは、これを保証する責任を負います。

<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 を生成することです。