다음을 통해 공유


android용 앱 SDK Intune - MAM 시작

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

참고

이 가이드는 여러 가지 개별 단계로 나뉩니다. 먼저 1단계: 통합 계획을 검토합니다.

3단계: MAM을 사용하여 시작

스테이지 Goals

  • Intune 앱 SDK를 다운로드합니다.
  • Intune 앱 SDK에 포함된 파일을 알아봅니다.
  • 애플리케이션에서 Intune 앱 SDK를 참조합니다.
  • 앱 Gradle 빌드 플러그 인을 Intune 구성하거나 명령줄 빌드 도구를 활용합니다.
  • Intune 앱 SDK가 빌드에 제대로 포함되어 있는지 확인합니다.

배경

애플리케이션이 MSAL을 성공적으로 통합했으므로 이제 Intune 앱 SDK를 다운로드하고 애플리케이션의 빌드 프로세스에 포함해야 합니다.

Intune App SDK 통합의 상당 부분은 표준 Android 클래스 및 메서드 호출을 해당 클래스 및 메서드 호출의 Intune 버전으로 대체하는 것입니다. SDK에는 이러한 교체의 대부분을 자동으로 만드는 빌드 도구가 포함되어 있습니다. 이 대체 논리에 대해 자세히 알아보려면 부록클래스 및 메서드 대체 섹션을 참조하세요.

Intune 앱 SDK 다운로드

SDK를 다운로드하려면 SDK 파일 다운로드를 참조하세요.

SDK에 무엇이 있나요?

Intune 앱 SDK는 다음 파일로 구성됩니다.

  • Microsoft. Intune. 맘. SDK.aar: 지원 라이브러리 JAR 파일을 제외한 SDK 구성 요소입니다.
  • com.microsoft.intune.mam.build.jar: SDK를 통합하는 데 도움이 되는 Gradle 플러그 인입니다.
  • CHANGELOG.md: 각 SDK 버전에서 변경된 레코드를 제공합니다.
  • THIRDPARTYNOTICES.TXT: 앱으로 컴파일될 타사 및/또는 OSS 코드를 인정하는 특성 알림입니다.
  • Microsoft. Intune. 맘. SDK. DownlevelStubs.aar: 이 AAR에는 최신 디바이스에만 존재하지만 MAMActivity의 메서드에서 참조되는 Android 시스템 클래스에 대한 스텁이 포함되어 있습니다. 최신 디바이스는 이러한 스텁 클래스를 무시합니다. 이 AAR은 앱이 에서 파생된 클래스에 대해 리플렉션을 수행하고 대부분의 앱에 MAMActivity포함할 필요가 없는 경우에만 필요합니다. AAR에는 모든 클래스를 제외하는 ProGuard 규칙이 포함되어 있습니다.

Intune 앱 라이브러리 참조

Intune 앱 SDK는 외부 종속성이 없는 표준 Android 라이브러리입니다. Microsoft. Intune. 맘. SDK.aar에는 앱 보호 정책을 사용하도록 설정하는 데 필요한 인터페이스와 Microsoft Intune 회사 포털 앱과 상호 운용하는 데 필요한 코드가 모두 포함되어 있습니다.

Android Studio

Microsoft. Intune. 맘. SDK.aar는 Android 라이브러리 참조로 지정해야 합니다. 이 종속성을 빌드에 추가하려면 Android 설명서에서 AAR 또는 JAR을 종속성으로 추가 를 따릅니다.

Visual Studio

.NET MAUI용 Intune 앱 SDK - Android NuGet 패키지를 종속성으로 추가해야 합니다.

NuGet 패키지 관리자를 사용하여 Visual Studio에서 패키지 설치 및 관리 프로세스를 수행합니다.

Microsoft.Intune. 맘. SDK.aar는 네임스페이스로 범위가 지정된 C# 참조를 만들도록 Microsoft.Intune.Mam 바인딩됩니다.

ProGuard

애플리케이션은 이미 ProGuard (또는 다른 축소/난독 처리 메커니즘)를 빌드 단계로 사용할 수 있습니다. Intune 앱 SDK에는 해당 빌드 단계에 포함되어야 하는 ProGuard 구성 규칙이 있습니다. 을 포함합니다 . 위에서 설명한 대로 빌드의 AAR은 SDK의 구성을 ProGuard 단계에 자동으로 통합하므로 필요한 클래스 파일이 유지됩니다. 를 올바르게 포함했으면 입니다 . AAR, 다른 변경이 필요하지 않습니다.

MSAL(Microsoft 인증 라이브러리)은 자체 ProGuard 구성과 함께 제공됩니다. 앱이 MSAL을 통합하는 경우 자세한 내용은 MSAL 설명서를 참조하세요.

빌드 도구

SDK는 MAM 교체를 자동으로 수행하는 빌드 도구(Gradle 빌드용 플러그 인, .NET 빌드의 대상 및 명령줄 도구)를 제공합니다. 이러한 도구는 Java 컴파일에서 생성된 클래스 파일을 변환합니다. 원본 소스 코드를 수정하지 않습니다. Gradle 플러그 인, .NET NuGet 패키지 또는 명령줄 도구를 사용해야 합니다.

빌드 도구만으로는 애플리케이션을 완전히 통합하기에 충분하지 않습니다. 도구는 클래스 및 메서드 교체 만 수행합니다. 다중 ID, 앱 보호 정책 등록, 앱과 디바이스 또는 클라우드 스토리지 위치 간의 데이터 전송을 제한하는 정책 또는 앱이 완전히 Intune 사용하도록 설정되기 전에 완료해야 하는 MSAL 구성과 같은 더 복잡한 SDK 통합을 수행하지 않습니다. 앱과 관련된 통합 지점은 이 설명서의 나머지 부분을 주의 깊게 검토합니다.

디버깅에 미치는 영향

빌드 도구는 컴파일 후 대체를 수행하므로 일부 메서드 이름이 변경됩니다. 따라서 메서드 이름에 설정된 디버깅 중단점이 영향을 받고 예상대로 중단되지 않을 수 있습니다. 줄 번호 중단점은 영향을 받지 않습니다.

스택의 MAM

Intune 앱 SDK 통합은 클래스 및 메서드 교체에 크게 의존하므로 스택 추적 전체에서 mam 볼 수 있습니다. 앱에 앱 보호 정책을 대상으로 하는 계정이 없는 경우 이 모든 MAM 코드는 휴면 MAMActivity 상태입니다. 는 와 동일하게 onMAMCreateActivity작동합니다. 등과 동일하게 onCreate작동합니다. 스택에 표시 mam 될 때마다 먼저 다음을 검사.

  • 계정이 앱 보호 정책의 대상이 되었나요?
  • Intune 회사 포털 설치되어 있나요?

둘 다에 대한 답변이 "예"가 아니면 MAM 코드는 간단한 통과로 작동합니다.

어떤 도구가 필요한가요?

Gradle을 사용하여 앱을 빌드하는 경우 Gradle 빌드 플러그 인과 통합을 참조하세요.

.NET MAUI를 사용하여 앱을 빌드하는 경우 .NET MAUI 대상과 통합을 참조하세요.

위의 두 항목 중 어느 것도 사용하여 앱을 빌드하지 않으면 명령줄 도구와 통합을 참조하세요.

Gradle 빌드 플러그 인과 통합

Intune 앱 SDK 플러그 인은 SDK의 일부로 GradlePlugin/com.microsoft.intune.mam.build.jar 배포됩니다.

Gradle에서 플러그 인을 인식하려면 클래스 경로에 buildscript 추가해야 합니다. 플러그 인은 Javassist에 따라 달라지며 추가해야 합니다. Javassist 종속성에 대한 자세한 내용은 종속성을 참조하세요.

클래스 경로에 추가하려면 루트 build.gradle에 다음을 추가합니다.

buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath "org.javassist:javassist:3.29.2-GA"
        classpath files("$PATH_TO_MAM_SDK/GradlePlugin/com.microsoft.intune.mam.build.jar")
    }
}

그런 다음 플러그 인을 적용하려면 앱 및 동적 기능 모듈의 build.gradle 파일에 다음을 추가합니다.

apply plugin: 'com.microsoft.intune.mam'

기본적으로 플러그 인은 종속성 및 외부 라이브러리에서 project 작동합니다. 테스트 컴파일은 영향을 받지 않습니다.

참고

8.0 Intune 앱 SDK부터는 더 이상 라이브러리를 선택적으로 처리할 수 없습니다. 모든 라이브러리가 처리됩니다.

의존 관계

참고

Android Gradle 플러그 인 버전 3.6.1 이상과 Gradle 버전 5.6.4 이상을 사용해야 합니다.

Gradle 플러그 인에는 Javassist에 대한 종속성이 있으며 Gradle의 종속성 확인에 사용할 수 있어야 합니다. Javassist는 플러그 인을 실행할 때 빌드 시간에만 사용되며 Javassist 코드는 앱에 추가되지 않습니다.

참고

Javassist 버전은 이전 버전과 호환되지 않을 수 있습니다. 일반적으로 Intune 앱 SDK에서 예상하는 정확한 버전을 사용해야 합니다.

  • Intune 앱 SDK ≥ 10.0.0에는 Javassist 3.29.2-GA가 필요합니다.
  • Intune 앱 SDK ≥ 7.0.0에는 Javassist 3.27.0-GA가 필요합니다.
  • Intune 앱 SDK < 7.0.0에는 Javassist 3.22.0-GA가 필요합니다.

또한 MAM SDK 8.0.0+를 사용하는 경우 Gradle 구성에서 다음이 설정되었는지 확인해야 합니다.

compileOptions {
  sourceCompatibility JavaVersion.VERSION_1_8
  targetCompatibility JavaVersion.VERSION_1_8
}

제외

앱의 특정 구성 요소를 다시 쓰기에서 제외하기 위해 추가 구성을 제공할 수 있습니다. 제외는 MAM과 관련이 없는 구성 요소(예: 회사 데이터를 처리하거나 표시하지 않음)에 주로 유용합니다.

다양한 범위에 대해 제외를 구성할 수 있습니다.

  • excludeProjects 은 Gradle 프로젝트 목록을 제외할 수 있습니다. 이러한 제외는 Android 라이브러리 또는 시스템 API와 인터페이스하지 않거나 회사 데이터를 처리하지 않는 프로젝트에 유용합니다. 예를 들어 하위 수준 네트워크 작업을 수행하기 위한 네이티브 코드만 포함하는 프로젝트는 좋은 후보일 수 있습니다. 프로젝트가 Android 라이브러리 또는 시스템 API와 광범위하게 상호 작용하는 경우 이러한 제외는 피해야 합니다.
  • excludeClasses 는 클래스 목록을 제외할 수 있습니다. 이러한 제외는 회사 데이터를 처리하거나 표시하지 않는 클래스에 유용합니다. 예를 들어 시작 화면과 온보딩 Activity이 좋은 후보입니다. 해당 슈퍼클래스가 처리되는 경우 클래스를 제외할 수 없습니다.
  • excludeVariants 에서는 프로젝트 변형을 제외할 수 있습니다. 이러한 제외는 완전한 변형 이름 또는 단일 버전을 참조할 수 있습니다. 앱의 MAM이 아닌 버전을 빌드하려는 경우 특히 유용합니다. 예를 들어 앱에 빌드 유형 debug 이 있고 release 버전이 {noMAM, MAM} 및 {mock, production}인 경우 다음을 지정할 수 있습니다.
    • noMAM noMAM 버전이 있는 모든 변형을 제외하려면 또는
    • noMAMMockDebug 정확한 변형만 제외합니다.

주의

제외는 가볍게 받아들여서는 안 됩니다. 제외를 잘못 적용하면 앱에서 심각한 데이터 누출이 발생할 수 있습니다. 항상 적용하는 제외의 영향을 확인합니다.

제외가 있는 부분 build.gradle 예제

apply plugin: 'com.microsoft.intune.mam'

dependencies {
    implementation project(':product:FooLib')
    implementation project(':product:foo-project')
    implementation "com.microsoft.bar:baz:1.0.0"

    // Include the MAM SDK
    implementation files("$PATH_TO_MAM_SDK/Microsoft.Intune.MAM.SDK.aar")
}
intunemam {
    excludeProjects = [':product:FooLib']
    excludeClasses = ['com.contoso.SplashActivity']
    excludeVariants = ['noMAM']
}

다음과 같은 효과가 있습니다.

  • :product:FooLib 에 포함되어 있으므로 다시 작성되지 않음 excludeProjects
  • :product:foo-project 이 에 있으므로 건너뛰는 를 제외하고 com.contoso.SplashActivity는 다시 작성됩니다. excludeClasses
  • com.microsoft.bar:baz.1.0.0 는 처리를 위해 모든 외부 라이브러리가 포함되어 있기 때문에 다시 작성됩니다.
  • 버전이 있는 변형은 noMAM 다시 작성되지 않습니다.

보고

빌드 플러그 인은 변경 내용에 대한 html 보고서를 생성할 수 있습니다. 이 보고서의 생성을 요청하려면 구성 블록에서 를 intunemam 지정 report = true 합니다. 생성된 경우 보고서는 빌드 디렉터리에 기록 outputs/logs 됩니다.

intunemam {
    report = true
}

확인

빌드 플러그 인은 추가 확인을 실행하여 처리 클래스에서 가능한 오류를 찾을 수 있습니다. 이러한 검사는 잠재적인 플러그 인으로 인한 런타임 오류를 보호하는 데 도움이 됩니다.

빌드에서 확인을 요청하려면 구성 블록에서 를 intunemam 지정 verify = true 합니다. 이렇게 하면 플러그 인 작업에 소요된 시간에 몇 초가 더해질 수 있습니다.

intunemam {
    verify = true
}

일반적으로 확인 실패는 빌드 플러그 인의 버그를 나타냅니다. 오류에 대한 지원을 받으려면 Microsoft 지원으로 문제를 에스컬레이션합니다. Microsoft 지원 계약이 없는 경우 GitHub 문제를 엽니다.

증분 빌드

증분 방식으로 빌드할 수 있도록 하려면 구성 블록에서 를 intunemam 지정 incremental = true 합니다. 이 기능은 변경된 입력 파일만 처리하여 빌드 성능을 향상합니다. 의 incremental 기본 구성은 입니다 false.

intunemam {
    incremental = true
}

동적 기능 모듈 구성

동적 기능 모듈은 앱 프로젝트와 별도로 빌드됩니다. 따라서 동적 기능 모듈도 Gradle 빌드 플러그 인을 적용해야 합니다.

Gradle 플러그 인에서 사용하는 API의 기술적 제한으로 인해 동적 기능 모듈 클래스를 변환할 때 앱 클래스를 다시 처리해야 합니다. 이 작업을 수행하려면 모든 기능 모듈을 디자인된 앱과 동일한 설정으로 구성해야 합니다.

예를 들어 앱에서 클래스를 제외하는 경우 동적 기능 모듈도 해당 클래스를 제외해야 합니다.

.NET MAUI 대상과 통합

Intune 앱 SDK 대상은 SDK의 일부로 Microsoft.Intune 배포됩니다. 마우이. Essentials.android.targets.

.NET MAUI용 Intune 앱 SDK - Android NuGet 패키지가 추가되면 컴파일 시간에 대상이 애플리케이션으로 자동으로 가져옵니다.

명령줄 빌드 도구와 통합

명령줄 빌드 도구는 SDK 드롭의 폴더에서 BuildTool 사용할 수 있습니다. 위에서 자세히 설명한 Gradle 플러그 인/.NET 대상과 동일한 기능을 수행하지만 사용자 지정 빌드 시스템에 통합할 수 있습니다. 더 일반적이므로 호출하기가 더 복잡하므로 가능하면 Gradle 플러그 인/ .NET 대상을 사용해야 합니다.

Command-Line 도구 사용

명령줄 도구는 디렉터리에 있는 BuildTool\bin 제공된 도우미 스크립트를 사용하여 호출할 수 있습니다.

도구에는 다음 매개 변수가 예상됩니다.

매개 변수 필수 설명
--input 수정할 클래스 파일의 jar 파일 및 디렉터리에 대한 세미콜론으로 구분된 목록입니다. 여기에는 다시 작성하려는 모든 jars/디렉터리를 포함해야 합니다.
--output 수정된 클래스를 저장할 jar 파일 및 디렉터리 세미콜론으로 구분된 목록입니다. 입력 항목당 하나의 출력 항목이 있어야 하며 순서대로 나열되어야 합니다.
--classpath 빌드 클래스 경로입니다. 여기에는 jar 및 클래스 디렉터리를 모두 포함할 수 있습니다.
--processed 아니오 빌드 도구의 이전 호출에 의해 이미 처리된 클래스를 포함하는 jar 파일 및 디렉터리 반콜론으로 구분된 목록입니다.
--excludeClasses 아니오 다시 쓰기에서 제외해야 하는 클래스의 이름을 포함하는 세미콜론으로 구분된 목록입니다.
--report 아니오 수정된 클래스에 대한 HTML 보고서를 작성하는 디렉터리입니다. 지정하지 않으면 보고서가 작성되지 않습니다.

선택적 --processed 옵션은 증분 빌드를 사용하도록 설정하는 데 사용됩니다. 여기에 나열된 파일/디렉터리 집합은 입력 및 클래스 경로 목록과 연결되지 않아야 합니다.

Unix와 유사한 시스템에서 세미콜론은 명령 구분 기호입니다. 셸이 명령을 분할하지 않도록 하려면 각 세미콜론을 ''으로 이스케이프하거나 전체 매개 변수를 따옴표로 래핑해야 합니다.

예제 Command-Line 도구 호출

> BuildTool\bin\BuildTool.bat --input build\product-foo-project;libs\bar.jar --output mam-build\product-foo-project;mam-build\libs\bar.jar --classpath build\zap.jar;libs\Microsoft.Intune.MAM.SDK\classes.jar;%ANDROID_SDK_ROOT%\platforms\android-27\android.jar --excludeClasses com.contoso.SplashActivity

다음과 같은 효과가 있습니다.

  • product-foo-project 디렉터리를 로 다시 작성합니다.mam-build\product-foo-project
  • bar.jar 을 로 다시 작성합니다. mam-build\libs\bar.jar
  • zap.jar 은 에만 나열되므로 다시 작성 되지 않습니다 . --classpath
  • 클래스가 com.contoso.SplashActivity 있는 경우에도 클래스를 다시 작성 하지 않습니다 . --input

경고

빌드 도구는 현재 aar 파일을 지원하지 않습니다. aar 파일을 처리할 때 빌드 시스템이 아직 추출 classes.jar 되지 않은 경우 빌드 도구를 호출하기 전에 이 작업을 수행해야 합니다.

MAMApplication 설정

앱이 의 android.app.Application서브클래스를 만드는 경우 빌드 플러그 인/명령줄 도구가 애플리케이션 클래스를 변환합니다.

앱이 을 서브클래스android.app.Application하지 않는 경우 AndroidManifest.xml <application> 태그에서 특성으로 "android:name" 설정 "com.microsoft.intune.mam.client.app.MAMApplication"해야 합니다.

  • 최신 Android SDK 빌드 도구를 사용합니다.
  • 불필요하고 사용되지 않는 모든 라이브러리(예: android.support.v4)를 제거합니다.

자동 교체를 수행한 후에도 Intune 앱 SDK는 Android API에서 제공하는 계약을 계속 유지 관리합니다. 그러나 정책 적용의 결과로 실패 조건이 더 자주 트리거될 수 있습니다. 이러한 Android 모범 사례는 실패 가능성을 줄입니다.

  • 반환할 수 null 있는 Android SDK 함수는 이제 를 반환할 가능성이 높아집니다 null. null 검사가 이러한 함수 호출을 보호하는지 확인합니다.
  • 와 같이 clipboardManager.getPrimaryClipDescription()확인할 수 있는 기능은 MAM 대체 API(예: MAMClipboard.getPrimaryClipDescription(clipboardManager))를 통해 확인해야 합니다.
  • 파생 함수는 슈퍼 클래스 버전을 통해 를 호출해야 합니다.
  • 모호한 방식으로 API를 사용하지 않도록 합니다. 예를 들어 를 확인하지 않고 를 사용하면 Activity.startActivityForResult 이상한 동작이 requestCode 발생합니다.

서비스

정책 적용은 Android 서비스 상호 작용에 영향을 줄 수 있습니다. 와 같은 Context.bindService 바인딩된 서비스 연결을 설정하는 메서드는 의 기본 정책 적용 Service.onBind 으로 인해 실패할 수 있으며 또는 ServiceConnection.onServiceDisconnected가 발생할 ServiceConnection.onNullBinding 수 있습니다. 설정된 바인딩된 서비스와 상호 작용하면 의 Binder.onTransact정책 적용으로 인해 이 SecurityException throw될 수 있습니다.

바인딩된 서비스의 클라이언트는 예외가 클라이언트 애플리케이션의 나머지 부분에 전파되도록 하는 대신 서비스에서 throw된 예외를 검사 것이 좋습니다.

종료 조건

빌드 플러그 인을 구성하거나 명령줄 도구를 빌드 프로세스에 통합한 후 성공적으로 실행되고 있는지 확인합니다.

  • 빌드가 성공적으로 컴파일되고 빌드되는지 확인합니다.
  • 플래그를 구성한 report 다음 보고서 문서를 열고 클래스 및 메서드 교체가 발생하는지 확인합니다.
    • 플러그 인을 사용하는 경우 보고의 단계를 수행 합니다.
    • 명령줄 도구를 사용하는 경우 플래그를 --report 포함합니다.
  • 플러그 인을 사용하는 경우 플래그를 verify 구성하고 오류가 발생하지 않는지 확인합니다. 확인을 참조하세요.
  • build.gradle에서 모든 제외(excludeProjects, excludeClassesexcludeVariants)를 두 번 검사. 각 제외가 필요하고 보호된 데이터를 처리하지 않는지 확인합니다. 과거에는 지나치게 공격적인 제외로 인해 많은 데이터 누출 오류가 발생했습니다.
  • Intune 회사 포털 설치하지 않고 컴파일된 앱을 시작하고, App Protection 정책의 대상이 아닌 Microsoft Entra 사용자와 로그인하고, 앱이 예상대로 작동하는지 확인합니다.
    • 로그아웃하고 Intune 회사 포털 설치된 상태에서 이 테스트를 반복합니다.

FAQ

내 앱은 이전에 빌드 플러그 인 없이 SDK를 통합했습니다. 빌드 플러그 인을 어떻게 사용할 수 있나요?

이전 버전의 Intune 앱 SDK에는 클래스 및 메서드 교체를 수행하는 자동화된 방법이 포함되지 않았으며 개발자는 소스 코드에서 이러한 교체를 수동으로 수행해야 했습니다. 앱이 이전에 이러한 방식으로 통합된 경우 소스 코드를 수정하지 않고 빌드 플러그 인(또는 명령줄 빌드 도구)을 적용하는 것이 안전합니다. 프로젝트는 여전히 MAM SDK를 종속성으로 나열해야 합니다.

다음 단계

모든 종료 조건을 완료한 후 4단계: MAM 통합 Essentials 계속 진행합니다.