다음을 통해 공유


Android용 Microsoft Intune 앱 SDK 개발자 가이드

Android용 Microsoft Intune 앱 SDK를 사용하면 Intune 앱 보호 정책( APP 또는 MAM 정책이라고도 함)을 네이티브 Java/Kotlin Android 앱에 통합할 수 있습니다. Intune 관리형 애플리케이션은 Intune 앱 SDK와 통합된 애플리케이션입니다. Intune 관리자는 Intune이 앱을 적극적으로 관리할 때 Intune 관리 앱에 앱 보호 정책을 쉽게 배포할 수 있습니다.

중요

Intune은 Intune 앱 SDK에 대한 업데이트를 정기적으로 릴리스합니다. 업데이트를 소프트웨어 개발 릴리스 주기에 통합하고 앱이 최신 앱 보호 정책 설정을 지원하는지 확인할 수 있도록 업데이트를 위해 Intune 앱 SDK 리포지토리를 구독하는 것이 좋습니다.

모든 주요 OS 릴리스 전에 필수 Intune 앱 SDK 업데이트를 수행하여 OS 업데이트로 인해 호환성이 손상되는 변경이 발생할 수 있으므로 앱이 원활하게 계속 실행되도록 할 계획입니다. 주요 OS 릴리스 전에 최신 버전으로 업데이트하지 않으면 호환성이 손상되는 변경이 발생하거나 앱에 앱 보호 정책을 적용할 수 없는 위험이 발생할 수 있습니다.

프로세스 흐름

다음 다이어그램에서는 Android용 Intune 앱 SDK 프로세스 흐름을 제공합니다.

Microsoft Intune에 대한 개략적인 아키텍처 다이어그램

스테이지 목표

이 가이드에는 Intune 앱 SDK의 아키텍처, 일반적이지 않은 통합 단계에 대한 정보 및 기타 유용한 콘텐츠에 대한 자세한 내용이 포함되어 있습니다.

SDK 세부 정보

클래스 및 메서드 대체

빌드 도구를 통해 Intune 앱 SDK는 Android 개발자의 통합 부담을 최소화하려고 시도합니다. 빌드 도구 이전에 개발자는 모든 교체를 수동으로 수행해야 했습니다.

참고

이제 앱은 SDK 빌드 도구와 통합되어야 하며, 이 도구는 이러한 모든 대체를 자동으로 수행합니다.

Android 기본 클래스는 Intune 관리를 사용하도록 설정하기 위해 해당 MAM 등가물로 대체됩니다. SDK 클래스는 Android 기본 클래스와 해당 클래스의 앱 자체 파생 버전 사이에 있습니다. 예를 들어 앱 작업은 다음과 같은 AppSpecificActivity 상속 계층 구조로 끝날 수 있습니다. extends는 MAMActivity 를 확장합니다 Activity. MAM 계층은 앱에 세계의 관리형 보기를 원활하게 제공하기 위해 시스템 작업에 대한 호출을 필터링합니다.

기본 클래스 외에도 에서 파생하지 않고 앱에서 사용할 수 있는 일부 클래스(예: MediaPlayer)에는 MAM 등가물이 필요하고 일부 메서드 호출도 대체해야 합니다. 아래 표에는 많은 MAM 대체 항목이 나와 있습니다.

Android 기본 클래스 Intune 앱 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(AIDL(Android Interface Definition Language) 인터페이스에서 바인더가 생성되지 않은 경우에만 필요)
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에서 파생되는 경우 를 재정의하고 호출 super.onCreate()Activity 하는 onCreate() 대신 를 재정 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, PrintHelperView, DragEventNotificationManagerNotificationManagerCompat).

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 pull Android 디바이스에서 로컬 컴퓨터로 로그를 끌어올 수 있습니다.
  • [Android용 Microsoft Edge를 사용하여 관리되는 앱 로그에 액세스]. 회사 포털 로그를 수집하고 MAM 진단을 보기 위한 UI가 표시됩니다.
  • 를 호출 MAMPolicyManager.showDiagnostics(context) 하여 회사 포털 로그를 수집하기 위한 동일한 UI를 표시합니다.

변경 정책을 사용하여 빠르게 테스트

Intune 앱 SDK의 앱 통합을 개발하고 테스트할 때 테스트 사용자의 앱 보호 정책 설정을 자주 변경할 수 있습니다.

기본적으로 통합 앱은 활성화된 경우 30분마다 업데이트된 정책에 대해 Intune 서비스에 체크 인합니다. 이 대기를 방지하고 회사 포털을 통해 강제로 체크 인할 수 있습니다.

  1. 회사 포털을 시작합니다. 로그인할 필요가 없습니다.
  2. ... 메뉴 아이콘.
  3. 설정을 선택합니다.
  4. "관리 정책"이라는 설정으로 스크롤합니다.
  5. 동기화 단추를 누릅니다.

그러면 즉시 체크 인이 예약되고 앱 및 계정을 대상으로 하는 최신 정책이 검색됩니다.

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.v4 패키지의 MAM 클래스 com.microsoft.intune.mam.client.support.v7 에 대한 모든 참조를 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 앱 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을 반환하거나 실패 값을 throw합니다(예: openOutputStream 차단된 경우 throw FileNotFoundException 됨). 앱은 다음을 호출하여 콘텐츠 확인자를 통해 데이터를 작성하지 못한 것이 정책(또는 정책으로 인해 발생)되었는지 여부를 확인할 수 있습니다.

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

    또는 연결된 활동이 없는 경우 다음을 수행합니다.

    MAMPolicyManager.getCurrentThreadPolicy().getIsSaveToLocationAllowed(contentURI);
    

    이 두 번째 경우 다중 ID 앱은 스레드 ID를 적절하게 설정하거나 호출에 명시적 ID를 전달하기 위해 getPolicyForIdentity 주의해야 합니다.

내보낸 서비스

Intune 앱 SDK에 포함된 AndroidManifest.xml 파일에는 회사 포털이 관리되는 앱에 알림을 보낼 수 있도록 내보낸 서비스여야 하는 MAMNotificationReceiverService가 포함되어 있습니다. 서비스는 호출자를 확인하여 회사 포털만 알림을 보낼 수 있는지 확인합니다.

리플렉션 제한 사항

일부 MAM 기본 클래스(예: MAMActivity, MAMDocumentsProvider)에는 특정 API 수준 위에만 있는 매개 변수 또는 반환 형식을 사용하는 메서드(원래 Android 기본 클래스 기반)가 포함되어 있습니다. 이러한 이유로 리플렉션을 사용하여 앱 구성 요소의 모든 메서드를 열거하는 것이 항상 가능하지는 않을 수 있습니다. 이 제한은 MAM으로 제한되지 않으며 앱 자체가 Android 기본 클래스에서 이러한 메서드를 구현하는 경우 적용되는 것과 동일한 제한 사항입니다.

Robolectric

Robolectric에서 Intune 앱 SDK 동작 테스트는 지원되지 않습니다. 실제 디바이스 또는 에뮬레이터의 동작을 정확하게 모방하지 않는 Robolectric 아래에 있는 동작으로 인해 Robolectric에서 SDK를 실행하는 알려진 문제가 있습니다.

Robolectric에서 애플리케이션을 테스트해야 하는 경우 권장되는 해결 방법은 애플리케이션 클래스 논리를 도우미로 이동하고 MAMApplication에서 상속되지 않는 애플리케이션 클래스를 사용하여 단위 테스트 apk를 생성하는 것입니다.