Android용 Microsoft Intune 앱 SDK를 사용하면 Intune 앱 보호 정책(MAM 정책이라고도 함)을 네이티브 Java/Kotlin Android 앱에 통합할 수 있습니다. Intune 관리 애플리케이션은 Intune 앱 SDK와 통합된 애플리케이션입니다. Intune 관리자는 Intune에서 앱을 적극적으로 관리할 때 Intune 관리 앱에 앱 보호 정책을 쉽게 배포할 수 있습니다.
중요
Intune은 Intune 앱 SDK에 대한 업데이트를 정기적으로 릴리스합니다. 업데이트를 소프트웨어 개발 릴리스 주기에 통합하고 앱이 최신 앱 보호 정책 설정을 지원하도록 할 수 있도록 업데이트를 위해 Intune 앱 SDK 리포지토리를 구독하는 것이 좋습니다.
Intune 업데이트로 인해 호환성이 손상되는 변경이 발생할 수 있으므로 앱이 계속 원활하게 실행되도록 모든 주요 OS 릴리스 전에 필수 Intune 앱 SDK를 업데이트하도록 계획합니다. 주요 OS 릴리스 전에 최신 버전으로 업데이트하지 않으면 호환성이 손상되는 변경 발생 및/또는 앱에 앱 보호 정책을 적용하지 못할 위험이 있습니다.
프로세스 흐름
다음 다이어그램은 Android용 Intune 앱 SDK 프로세스 흐름을 제공합니다.
스테이지 목표
이 가이드에는 Intune 앱 SDK의 아키텍처에 대한 자세한 정보, 흔하지 않은 통합 단계에 대한 정보 및 기타 유용한 콘텐츠가 포함되어 있습니다.
SDK 세부 정보
클래스 및 메서드 바꾸기
빌드 도구를 통해 Intune 앱 SDK는 Android 개발자의 통합 부담을 최소화하려고 시도합니다. 빌드 도구 사용 이전에는 개발자가 모든 교체를 수동으로 수행해야 했습니다.
참고
이제 앱은 이러한 모든 교체를 자동으로 수행하는 SDK 빌드 도구와 통합되어야 합니다.
Android 기본 클래스는 Intune 관리를 사용하도록 설정하기 위해 해당하는 각 MAM으로 대체됩니다.
SDK 클래스는 Android 기본 클래스와 해당 클래스의 앱 자체 파생 버전 사이에 존재합니다.
예를 들어, 앱 활동은 다음과 MAMActivityActivity같은 AppSpecificActivity 상속 계층 구조로 끝날 수 있습니다.
MAM 계층은 관리되는 세계 보기를 앱에 원활하게 제공하기 위해 시스템 작업에 대한 호출을 필터링합니다.
기본 클래스 외에도 앱에서 파생되지 않고 사용할 수 있는 일부 클래스(예: MediaPlayer)에는 MAM에 상응하는 항목이 필요하며 일부 메서드 호출도 바꿔야 합니다.
아래 표에는 많은 MAM 대체 항목이 나열되어 있습니다.
| Android 기본 클래스 | Intune 앱 SDK 교체 |
|---|---|
| android.app.활동 | MAMActivity |
| android.app.ActivityGroup | MAMActivityGroup |
| android.app.AliasActivity | MAMAliasActivity |
| android.app. 신청 | MAMApplication |
| android.app.대화 상자 | 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(바인더가 AIDL(Android 인터페이스 정의 언어) 인터페이스에서 생성되지 않은 경우에만 필요) |
| 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()하는 onCreate() 대신 를 Activity 재정의 onMAMCreate() 하고 super.onMAMCreate()호출해야 합니다.
Java 컴파일러는 MAM에 해당하는 메서드 대신 원래 메서드를 실수로 재정의하지 않도록 최종 제한을 적용해야 합니다.
래핑된 시스템 서비스
일부 시스템 서비스 클래스의 경우 서비스 instance에서 원하는 메서드를 직접 호출하는 대신 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 |
일부 클래스에는 대부분의 메서드가 래핑되어 있는 반면 DownloadManagerViewNotificationManagerPrintManagerPrintHelperNotificationManagerCompatDragEvent(예: ClipboardManager, ContentProviderClient, ContentResolver, 및 .)PackageManager
MDM 및 MAM 등록
4단계의 등록과 등록에서 설명한 대로 Intune 앱 SDK는 계정이 정책으로 보호되도록 앱에서 등록하는 계정을 "등록"합니다. 이 등록이 성공하면 계정이 관리되고 이제 이 계정에 MAM 정책을 적용해야 합니다.
"등록"이라는 용어는 MDM(장치 관리)을 사용하도록 설정하기 위해 최종 사용자가 시작한 프로세스를 의미할 수도 있습니다. MDM 등록은 앱 보호 정책 등록과 완전히 별개입니다.
SDK 통합 앱은 해당 계정을 장치 관리에 등록하지 않고도 앱 보호 정책에 등록된 계정을 가질 수 있습니다. 마찬가지로 사용자는 앱 보호 정책에 등록된 계정이 있는 SDK 통합 앱이 장치 관리에 등록되지 않고도 장치를 등록할 수 있습니다.
일반적으로 개발자와 관리자가 등록을 언급할 때 앱 보호 정책 등록은 개발자와 최종 사용자 모두에게 거의 보이지 않기 때문에 MDM 등록을 언급합니다. MDM 등록에 대한 자세한 내용은 Android 장치 등록 을 참조하세요.
통합 팁
회사 포털 로그 이해
회사 포털 로그에는 Microsoft 엔지니어가 문제 조사에 사용하는 정보가 포함되어 있습니다. 일부 로그는 SDK를 통합하는 개발자에게도 유용할 수 있습니다.
특히 이 파일 DiagnosticsInfo-scrubbed.log 에는 MAM에서 관리하는 앱과 섹션의 MAM 정책 세부 정보에 대한 정보가 포함되어 있습니다.PolicyDB Information
모든 관리형 앱에는 섹션에 항목이 있습니다.PolicyDB Information
MAM 정책이 앱의 대상으로 올바르게 지정되어 있는지 확인하려면 여기에서 앱의 패키지 이름을 찾아야 합니다.
여기에 앱의 패키지 이름이 표시되지 않으면 로그인한 계정에 MAM 정책이 적용되어 있지 않음을 나타냅니다.
각 MAM 정책 설정에 대한 설명은 Microsoft Intune의 Android 앱 보호 정책 설정을 참조하세요. 이러한 설정이 회사 포털 로그에 표시되는 방법에 대한 설명은 클라이언트 앱 보호 로그 검토를 참조하세요. MAM 정책이 예상대로 적용되지 않는 경우 로그 또는 진단 UI를 검사 회사 포털하고, 앱이 MAM 정책에 의해 관리되는지 확인하고, 정책 설정에 예상 값이 있는지 확인하는 것이 좋습니다.
다음 방법 중 하나로 회사 포털 로그를 수집할 수 있습니다.
- 회사 포털을 통해
- 회사 포털 앱 열기
- 오른쪽 위 모서리에 있는 점 세 개 메뉴 선택
- 설정 선택
- 진단 로그에서 로그 저장을 선택합니다.
- 메시지에 따라 회사 포털 로그를 저장할 출력 디렉터리를 선택합니다.
- 명령을 사용하여
adb shell pullAndroid 장치에서 로컬 컴퓨터로 로그를 가져옵니다.
- [Android용 Microsoft Edge를 사용하여 관리되는 앱 로그에 액세스]. 회사 포털 로그를 수집하고 MAM 진단을 보기 위한 UI가 표시됩니다.
- 회사 포털 로그 수집을 위해 동일한 UI를 표시하기 위해 호출
MAMPolicyManager.showDiagnostics(context)합니다.
변경되는 정책으로 빠르게 테스트
Intune 앱 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"
그런 다음 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 이외의 계정에서 사용할 수 없습니다. 앱이 공용 앱 스토어에 출시되는 경우 기본 등록이 지원되지 않습니다.
기본 등록은 최종 사용자가 회사 포털을 설치하고 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" />
Custom Screen Capture 제한
앱에 Android Window수준 FLAG_SECURE 제한을 무시하는 맞춤 화면 캡처 기능이 포함된 경우 기능에 대한 전체 액세스를 허용하기 전에 화면 캡처 정책을 검사해야 합니다.
예를 들어 앱에서 사용자 지정 렌더링 엔진을 사용하여 현재 보기를 PNG 파일로 렌더링하는 경우 먼저 검사AppPolicy.getIsScreenCaptureAllowed()해야 합니다.
앱에 사용자 지정 또는 타사 화면 캡처 기능이 포함되어 있지 않으면 화면 캡처를 제한하는 조치를 취할 필요가 없습니다.
화면 캡처 정책은 모든 MAM 통합 앱 수준에서 Window 자동으로 적용됩니다.
OS 또는 다른 앱이 앱에서 a Window 를 캡처하려는 시도는 필요에 따라 차단됩니다.
예를 들어 사용자가 Android의 기본 제공 스크린샷 또는 화면 녹화 기능을 통해 앱의 화면을 캡처하려고 시도하면 앱의 참여 없이 캡처가 자동으로 제한됩니다.
정책 적용 제한 사항
콘텐츠 해결 프로그램 사용: "전송 또는 받기" Intune 정책은 콘텐츠 확인자를 사용하여 다른 앱의 콘텐츠 공급자에 액세스하는 것을 차단하거나 부분적으로 차단할 수 있습니다. 이렇게 하면
ContentResolver메서드가 null을 반환하거나 실패 값을 throw합니다(예:openOutputStream차단된 경우 throwFileNotFoundException). 앱은 다음을 호출하여 콘텐츠 확인자를 통한 데이터 쓰기 실패가 정책으로 인해 발생했는지(또는 정책으로 인해 발생할 것인지) 확인할 수 있습니다.MAMPolicyManager.getPolicy(currentActivity).getIsSaveToLocationAllowed(contentURI);또는 연결된 활동이 없는 경우:
MAMPolicyManager.getCurrentThreadPolicy().getIsSaveToLocationAllowed(contentURI);이 두 번째 사례에서 다중 ID 앱은 스레드 ID를 적절하게 설정하거나 명시적 ID를 호출에
getPolicyForIdentity전달해야 합니다.
내보낸 서비스
Intune App SDK에 포함된 AndroidManifest.xml 파일에는 MAMNotificationReceiverService가 포함되어 있습니다. 이 서비스는 회사 포털에서 관리되는 앱에 알림을 보낼 수 있도록 내보낸 서비스여야 합니다. 서비스는 호출자를 확인하여 회사 포털만 알림을 보낼 수 있는지 확인합니다.
리플렉션 제한 사항
일부 MAM 기본 클래스(예: MAMActivity, MAMDocumentsProvider)에는 특정 API 수준 이상에만 있는 매개 변수 또는 반환 유형을 사용하는 메서드(원래 Android 기본 클래스 기반)가 포함되어 있습니다.
이러한 이유로 리플렉션을 사용하여 앱 구성 요소의 모든 메서드를 열거하는 것이 항상 가능하지는 않을 수 있습니다.
이 제한은 MAM에만 국한되지 않습니다. 앱 자체에서 Android 기본 클래스에서 이러한 메서드를 구현한 경우 적용되는 것과 동일한 제한입니다.
Robolectric
Robolectric에서 Intune 앱 SDK 동작 테스트는 지원되지 않습니다. 실제 장치 또는 에뮬레이터에서 해당 동작을 정확하게 모방하지 않는 Robolectric에 존재하는 동작으로 인해 Robolectric에서 SDK를 실행하는 데 알려진 문제가 있습니다.
Robolectric에서 애플리케이션을 테스트해야 하는 경우 권장되는 해결 방법은 애플리케이션 클래스 로직을 도우미로 이동하고 MAMApplication에서 상속되지 않는 애플리케이션 클래스로 단위 테스트 apk를 생성하는 것입니다.