이 가이드에서는 Android 엔터프라이즈 배포의 기기를 위한 기기 정책 컨트롤러 (DPC)를 개발하는 방법을 설명합니다. 이전에는 직장 정책 컨트롤러로 알려진 DPC 앱은 기기의 로컬 기기 정책 및 시스템 애플리케이션을 제어합니다.
DPC 정보
Android 엔터프라이즈 배포에서 엔터프라이즈는 사용자 기기의 다양한 측면을 제어합니다. 예를 들어 직장 관련 정보를 사용자의 개인 데이터와 격리하거나, 환경에 승인된 앱을 미리 구성하거나, 기기 기능 (예: 카메라)을 사용 중지합니다.
EMM은 고객이 EMM 콘솔 및 서버와 함께 사용할 수 있는 DPC 앱을 개발합니다. 고객이 관리하는 사용자 기기에 DPC를 배포합니다. DPC는 EMM 콘솔 (및 서버)과 기기 간의 브리지 역할을 합니다. 관리자는 EMM 콘솔을 사용하여 기기 설정 및 앱 구성 등 다양한 작업을 실행합니다.
DPC는 설치된 기기에서 직장 프로필을 만들고 관리합니다. 직장 프로필은 업무 관련 정보를 암호화하고 사용자의 개인 앱 및 데이터와 분리하여 보관합니다. DPC는 직장 프로필을 만들기 전에 기기에서 사용할 관리 Google Play 계정을 프로비저닝할 수도 있습니다.
이 가이드에서는 직장 프로필을 만들고 관리할 수 있는 DPC를 개발하는 방법을 보여줍니다.
EMM용 DPC 지원 라이브러리
EMM용 DPC 지원 라이브러리는 엔터프라이즈 환경에서 Android 기기의 프로비저닝 및 관리를 용이하게 하는 유틸리티 및 도우미 클래스로 구성됩니다. 이 라이브러리를 사용하면 DPC 앱에서 다음과 같은 중요한 기능을 활용할 수 있습니다.
- 관리 Google Play 계정 프로비저닝 지원: DPC 앱에서 관리 Google Play 계정을 프로비저닝하려면 Google Play 및 Google Play 서비스 앱이 최소 버전 요구사항을 충족해야 합니다. 하지만 이러한 앱을 업데이트하는 것은 복잡할 수 있습니다. DPC 지원 라이브러리는 이러한 앱을 업데이트하고 관리 Google Play 계정 프로비저닝 프로세스의 향후 업데이트와의 호환성도 보장합니다. 자세한 내용은 관리 Google Play 계정 프로비저닝 지원을 참고하세요.
- 관리 구성 지원: Play EMM API를 사용하여 승인된 앱의 관리 구성을 처리하는 것이 DPC에서 관리 구성을 구현하는 가장 쉬운 방법입니다. DPC 지원 라이브러리를 사용하면 EMM 콘솔을 사용하여 관리자가 설정한 관리 구성 (이전에는 앱 제한사항)을 적용하는 작업을 Google Play에 위임할 수 있습니다. Play EMM API를 사용하여 관리 구성을 처리하면 설치 중에 앱 구성이 원자적으로 적용될 수 있습니다. DPC에서 이 기능을 사용 설정하는 방법에 대한 자세한 내용은 직장 앱에 관리 구성을 적용하기를 참고하세요.
아래 단계에 따라 라이브러리를 다운로드하세요. 이 가이드에 자세히 설명된 작업은 DPC 지원 라이브러리를 사용하는 것으로 가정합니다.
DPC 지원 라이브러리 다운로드
DPC 지원 라이브러리를 사용하려면 Android Enterprise EMM 공급자 커뮤니티에서 라이브러리를 다운로드하세요. DPC 앱을 빌드할 때 build.gradle 파일에 라이브러리를 추가하고 다른 종속 항목을 처리해야 합니다. 예를 들어 라이브러리에는 11.4.0 Google Play 서비스 인증 클라이언트 라이브러리가 필요합니다.
build.gradle파일에 라이브러리를 추가합니다.
Groovy
implementation(name:'dpcsupport-yyyymmdd', ext:'aar')
Kotlin
implementation(name = "dpcsupport-yyyymmdd", ext = "aar")
- build.gradle 파일에 11.4.0
Google Play 서비스 인증 클라이언트 라이브러리를 추가합니다.
Groovy
implementation 'com.google.android.gms:play-services-auth:11.4.0'
Kotlin
implementation("com.google.android.gms:play-services-auth:11.4.0")
라이브러리를 실행하려면 특정 권한이 필요하므로 Google Play에 업로드할 때 DPC 앱의 매니페스트에 다음 권한을 추가해야 합니다.
<uses-permission android:name= "android.permission.DOWNLOAD_WITHOUT_NOTIFICATION"/> <uses-permission android:name= "android.permission.GET_ACCOUNTS"/> <uses-permission android:name= "android.permission.MANAGE_ACCOUNTS"/> <uses-permission android:name= "android.permission.WRITE_SYNC_SETTINGS"/> <uses-permission android:name= "com.google.android.providers.gsf.permission.READ_GSERVICES"/>
이러한 사전 설정 및 배포 단계 외에도 구현하려는 기능에 따라 DPC 코드에서 특정 라이브러리 기능을 초기화해야 합니다. 자세한 내용은 아래 관련 섹션을 참고하세요.
DPC 만들기
기기 관리 애플리케이션에 사용되는 기존 모델을 기반으로 DPC를 빌드합니다.
특히 앱은
기기 관리에 설명된 대로
DeviceAdminReceiver (android.app.admin 패키지의 클래스)를 서브클래스로 분류해야 합니다.
직장 프로필 만들기
기본 직장 프로필을 만드는 방법을 보여주는 샘플은 GitHub의 BasicManagedProfile을 참고하세요.
이미 개인 프로필이 있는 기기에서 직장 프로필을 만들려면 먼저 FEATURE_MANAGED_USERS 시스템 기능의 존재를 확인하여 기기가 직장 프로필을 지원할 수 있는지 알아봅니다.
Kotlin
if (!packageManager.hasSystemFeature(PackageManager.FEATURE_MANAGED_USERS)) { // This device does not support work profiles! }
자바
PackageManager pm = getPackageManager(); if (!pm.hasSystemFeature(PackageManager.FEATURE_MANAGED_USERS)) { // This device does not support work profiles! }
기기에서 직장 프로필을 지원하는 경우 ACTION_PROVISION_MANAGED_PROFILE 작업을 통해 인텐트를 전송하여 직장 프로필을 만듭니다. (일부 문서에서 관리 프로필은 기업의 Android 컨텍스트에서 직장 프로필과 동일한 의미를 갖는 일반적인 용어입니다.) 기기 관리자 패키지 이름을 추가로 포함합니다.
Kotlin
val provisioningActivity = getActivity() // You'll need the package name for the DPC app. val myDPCPackageName = "com.example.myDPCApp" // Set up the provisioning intent val adminComponent = ComponentName(provisioningActivity.applicationContext, MyAdminReceiver::class.java) provisioningIntent.putExtra(EXTRA_PROVISIONING_DEVICE_ADMIN_COMPONENT_NAME, adminComponent.flattenToString()) if (provisioningIntent.resolveActivity(provisioningActivity.packageManager) == null) { // No handler for intent! Can't provision this device. // Show an error message and cancel. } else { // REQUEST_PROVISION_MANAGED_PROFILE is defined // to be a suitable request code startActivityForResult(provisioningIntent, REQUEST_PROVISION_MANAGED_PROFILE) provisioningActivity.finish() }
자바
Activity provisioningActivity = getActivity(); // You'll need the package name for the DPC app. String myDPCPackageName = "com.example.myDPCApp"; // Set up the provisioning intent Intent provisioningIntent = new Intent("android.app.action.PROVISION_MANAGED_PROFILE"); ComponentName adminComponent = new ComponentName(provisioningActivity.getApplicationContext(), MyAdminReceiver.class); provisioningIntent.putExtra(EXTRA_PROVISIONING_DEVICE_ADMIN_COMPONENT_NAME, adminComponent.flattenToString()); if (provisioningIntent.resolveActivity(provisioningActivity.getPackageManager()) == null) { // No handler for intent! Can't provision this device. // Show an error message and cancel. } else { // REQUEST_PROVISION_MANAGED_PROFILE is defined // to be a suitable request code startActivityForResult(provisioningIntent, REQUEST_PROVISION_MANAGED_PROFILE); provisioningActivity.finish(); }
시스템은 다음과 같이 하여 이 인텐트에 응답합니다.
- 기기가 암호화되었는지 확인합니다. 그렇지 않으면 시스템에서 사용자에게 계속하기 전에 기기를 암호화하라는 메시지를 표시합니다.
- 직장 프로필을 만듭니다.
- 직장 프로필에서 필수가 아닌 애플리케이션을 삭제합니다.
- DPC 앱을 직장 프로필에 복사하고 DPC 자체를 프로필 소유자로 설정합니다.
onActivityResult()를 재정의하여 프로비저닝이 성공했는지 확인합니다.
Kotlin
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent) { // Check if this is the result of the provisioning activity if (requestCode == REQUEST_PROVISION_MANAGED_PROFILE) { // If provisioning was successful, the result code is // Activity.RESULT_OK if (resultCode == Activity.RESULT_OK) { // Work profile created and provisioned. } else { // Provisioning failed. } return } else { // This is the result of some other activity. Call the superclass. super.onActivityResult(requestCode, resultCode, data) } }
자바
@Override public void onActivityResult(int requestCode, int resultCode, Intent data) { // Check if this is the result of the provisioning activity if (requestCode == REQUEST_PROVISION_MANAGED_PROFILE) { // If provisioning was successful, the result code is // Activity.RESULT_OK if (resultCode == Activity.RESULT_OK) { // Work profile created and provisioned. } else { // Provisioning failed. } return; } else { // This is the result of some other activity. Call the superclass. super.onActivityResult(requestCode, resultCode, data); } }
직장 프로필 사용 설정 완료
프로필이 프로비저닝되면 시스템에서 DPC 앱의
DeviceAdminReceiver.onProfileProvisioningComplete() 메서드를 호출합니다. 이 콜백 메서드를 재정의하여 직장 프로필 사용 설정을 완료합니다.
일반적인 DeviceAdminReceiver.onProfileProvisioningComplete() 콜백 구현은 다음을 실행합니다.
- 기기 정책 설정에 설명된 대로 기기가 EMM의 기기 정책을 준수하는지 확인합니다.
- 관리자가
DevicePolicyManager.enableSystemApp()를 사용하여 직장 프로필 내에서 사용할 수 있도록 한 시스템 애플리케이션을 사용 설정합니다. - 기기에서 관리 Google Play를 사용하는 경우 승인된 앱을 기기에 설치할 수 있도록 직장 프로필에 적절한 계정을 추가합니다.
- 관리 Google Play 계정: 자세한 내용은 관리 Google Play 계정의 작업 환경 보장 및 관리 Google Play 계정 추가를 참고하세요.
- Google 계정:
AccountManager.addAccount()를 사용합니다.
직장 프로필 활성화
이러한 작업을 완료한 후 기기 정책 관리자의
setProfileEnabled() 메서드를 호출하여 직장 프로필을 활성화합니다.
Kotlin
// Get the device policy manager val myDevicePolicyMgr = getSystemService(Context.DEVICE_POLICY_SERVICE) as DevicePolicyManager val componentName = myDeviceAdminReceiver.getComponentName(this) // Set the name for the newly created work profile. myDevicePolicyMgr.setProfileName(componentName, "My New Work Profile") // ...and enable the profile myDevicePolicyMgr.setProfileEnabled(componentName)
자바
// Get the device policy manager DevicePolicyManager myDevicePolicyMgr = (DevicePolicyManager) getSystemService(Context.DEVICE_POLICY_SERVICE); ComponentName componentName = myDeviceAdminReceiver.getComponentName(this); // Set the name for the newly created work profile. myDevicePolicyMgr.setProfileName(componentName, "My New Work Profile"); // ...and enable the profile myDevicePolicyMgr.setProfileEnabled(componentName);
기기 정책 설정
DPC 앱은 조직의 요구사항과 제약 조건을 충족하기 위해 관리자가 설정한 기기 정책을 적용합니다. 예를 들어 보안 정책에 따라 잘못된 비밀번호를 지정한 횟수만큼 시도한 후에 기기를 잠가야 할 수 있습니다. DPC는 EMM 콘솔에 현재 정책을 쿼리한 다음 기기 관리 API를 사용하여 정책을 적용합니다.
기기 정책을 적용하는 방법에 대한 자세한 내용은 정책을 참고하세요.
직장 앱에 관리 구성 적용
관리 구성을 사용하면 고객이 배포를 승인한 앱을 사전 구성하고 구성이 변경되어야 할 때 해당 앱을 쉽게 업데이트할 수 있습니다. 배포 전에 앱을 구성하면 타겟 기기에 앱을 설치할 때 조직의 보안 및 기타 정책이 충족됩니다.
앱 기능은 Google Play에 업로드될 때 앱과 함께 제공되는 XML 스키마 (관리 구성 스키마)에 앱 개발자가 정의합니다 (앱 개발자는 관리 구성 설정에서 자세한 내용을 참고하세요).
이 스키마는 앱에서 가져와 EMM 콘솔에 고객 관리자에게 표시하고, 스키마에 정의된 다양한 옵션이 표시되는 UI를 제공하고, 관리자가 앱의 설정을 사전 구성할 수 있도록 합니다. 관리자가 설정한 결과 관리 구성은 일반적으로 EMM 서버에 저장되며, EMM 서버는 Play EMM API를 사용하여 Managedconfigurationsfordevice 또는 Managedconfigurationsforuser를 설정합니다. 자세한 내용은 Play를 통한 관리 구성을 참고하세요.
관리 구성은 Play EMM API(권장 방법)를 사용하여 앱에 적용하거나 DPC에서 직접 적용할 수 있습니다 (DPC에서 직접 관리 구성 적용 참고). Play EMM API를 사용하면 DPC 지원 라이브러리를 사용하여 DPC 작업을 간소화할 수 있으므로 구현이 쉽다는 장점이 있습니다. 또한 Play EMM API는 다음을 지원합니다.
- 새 앱이 설치될 때 구성을 원자적으로 설정하여 사용자가 앱을 처음 실행할 때 앱이 준비되도록 합니다.
- 사용자별로 구성을 관리할 수 있으므로 기기별로 프로비저닝을 모니터링하지 않아도 됩니다.
Play EMM API를 사용하여 관리 구성 적용
관리 구성에 Play EMM API를 사용하려면 DPC에서 Google Play가 구성을 설정하도록 허용해야 합니다. DPC 지원 라이브러리는 Google Play에서 전송된 구성을 프록시하여 이 작업을 처리합니다.
Play EMM API를 사용하려면 DPC 지원 라이브러리를 다운로드한 후 DPC에서 관리 구성 지원을 사용 설정하세요.
DPC에서 관리 구성 지원 사용 설정
DPC에서 이 클래스를 가져옵니다.
com.google.android.apps.work.dpcsupport.ManagedConfigurationsSupport
관리 구성 라이브러리를 초기화합니다. 이 예에서 'admin'은 DeviceAdminReceiver의 ComponentName입니다.
Kotlin
var managedConfigurationsSupport = ManagedConfigurationsSupport(context, admin)
자바
ManagedConfigurationsSupport managedConfigurationsSupport = new ManagedConfigurationsSupport(context, admin);
관리 구성을 사용 설정합니다.
Kotlin
managedConfigurationsSupport.enableManagedConfigurations()
자바
managedConfigurationsSupport.enableManagedConfigurations();
DPC에서 이 라이브러리를 초기화하면 EMM 콘솔 및 서버에서 Google Play EMM API를 사용하여 승인된 앱에 관리 구성을 적용할 수 있습니다. DPC에서 이러한 작업을 직접 코딩하지 않아도 됩니다. 자세한 내용은 Play를 통한 관리 구성을 참고하세요.
DPC에서 직접 관리 구성 적용
DPC에서 직접 앱의 구성 설정을 변경하려면 DevicePolicyManager.setApplicationRestrictions() 메서드를 호출하고 DPC 앱의 DeviceAdminReceiver, 타겟 앱의 패키지 이름, 관리자가 설정한 앱의 관리 구성을 포함하는 Bundle의 매개변수를 전달합니다. 자세한 내용은 DPC와 EMM 콘솔의 상호작용 방식 및 관리 구성 설정을 참고하세요. 하지만 관리 구성을 적용하는 이 대체 방법은 관리 Google Play 계정 배포에서는 권장되지 않습니다.
Managed Google Play 계정 프로비저닝 지원
DPC 지원 라이브러리에는 관리 Google Play 계정 프로비저닝 지원이 포함되어 있습니다. 이 지원을 사용하려면 먼저 라이브러리를 초기화해야 합니다. 그런 다음 작업 환경을 확인하고 관리 Google Play 계정을 추가할 수 있습니다.
DPC에서 관리 Google Play 계정 지원 초기화
DPC에서 이 클래스를 가져옵니다.
com.google.android.apps.work.dpcsupport.AndroidForWorkAccountSupport
프로비저닝 호환성 라이브러리를 초기화합니다. 이 예에서 'admin'은
DeviceAdminReceiver의 ComponentName입니다.
Kotlin
var androidForWorkAccountSupport = AndroidForWorkAccountSupport(context, admin)
자바
AndroidForWorkAccountSupport androidForWorkAccountSupport = new AndroidForWorkAccountSupport(context, admin);
관리 Google Play 계정의 작업 환경 보장
DPC가 프로필 소유자 모드 (ACTION_PROVISION_MANAGED_PROFILE) 또는 기기 소유자 모드 (ACTION_PROVISION_MANAGED_DEVICE)로 기기를 프로비저닝한 후 다음을 호출하여 기기가 관리 Google Play 계정을 지원할 수 있는지 확인합니다.
Kotlin
androidForWorkAccountSupport.ensureWorkingEnvironment(callback)
자바
androidForWorkAccountSupport.ensureWorkingEnvironment(callback);
콜백은 이 프로세스의 성공 또는 실패를 보고합니다. 콜백이 성공적으로 반환되면 관리 Google Play 계정을 추가할 수 있습니다. 콜백에서 오류를 보고하면 기기에 네트워크 연결이 있는지 확인하라는 메시지를 사용자에게 표시합니다 (예: 다운로드 실패 시). 다른 경우에는 Google에 실패를 신고하세요.
Kotlin
object : WorkingEnvironmentCallback() { override fun onSuccess() { // Can now provision the managed Google Play Account } override fun onFailure(error: Error) { // Notify user, handle error (check network connection) } }
자바
new WorkingEnvironmentCallback() { @Override public void onSuccess() { // Can now provision the managed Google Play Account } @Override public void onFailure(Error error) { // Notify user, handle error (check network connection) } }
관리 Google Play 계정 추가
Android 프레임워크의 AccountManager
는 관리 Google Play 계정을 기기에 추가할 수 있습니다. AccountManager와의 상호작용을 단순화하려면 DPC 지원 라이브러리의 도우미 함수 (아래 예 참고)를 사용하세요. 이 함수는 Google Play 서버에서 반환된 토큰을 처리하고 관리 Google Play 계정의 프로비저닝을 지원합니다. 관리 Google Play 계정이 유효한 상태이면 함수가 반환됩니다.
Kotlin
androidForWorkAccountSupport.addAndroidForWorkAccount(token, accountAddedCallback)
자바
androidForWorkAccountSupport.addAndroidForWorkAccount(token, accountAddedCallback);
token—Google Play EMM APIUsers.generateAuthenticationToken()호출로 생성된 사용자 인증 토큰입니다.accountAddedCallback- 기기에 성공적으로 추가된 관리 Google Play 계정을 반환합니다. 이 콜백에는onAccountReady()및onFailure()메서드가 포함되어야 합니다.
Kotlin
val workAccountAddedCallback = object : WorkAccountAddedCallback() { override fun onAccountReady(account: Account, deviceHint: String) { // Device account was successfully added to the device // and is ready to be used. } override fun onFailure(error: Error) { // The account was not successfully added. Check that the token // provided was valid (it expires after a certain period of time). } }
자바
WorkAccountAddedCallback workAccountAddedCallback = new WorkAccountAddedCallback() { @Override public void onAccountReady(Account account, String deviceHint) { // Device account was successfully added to the device // and is ready to be used. } @Override public void onFailure(Error error) { // The account was not successfully added. Check that the token // provided was valid (it expires after a certain period of time). } };
관련 문서
- Device Administration API에 대해 자세히 알아보려면 Device Administration을 참고하세요.
- Android Enterprise 프로비저닝 방법에 관한 자세한 내용은 Android Enterprise 개발자 가이드의 기기 프로비저닝을 참고하세요.
- 기본 직장 프로필을 만드는 방법을 보여주는 GitHub 샘플은 BasicManagedProfile을 참고하세요.
- 프로필 소유자로서 다른 앱에 구성을 설정하는 방법을 보여주는 GitHub 샘플은 AppRestrictionEnforcer를 참고하세요.