기기 정책 컨트롤러 빌드

이 가이드에서는 Android Enterprise 배포에서 기기를 위한 기기 정책 컨트롤러 (DPC)를 개발하는 방법을 설명합니다. 이전에 업무용 정책 컨트롤러라고 했던 DPC 앱은 로컬 기기 정책 및 기기의 시스템 애플리케이션을 제어합니다.

DPC 정보

Android Enterprise 배포에서 기업은 사용자의 개인 정보에서 업무 관련 정보를 격리하거나, 환경에 맞게 승인된 앱을 사전 구성하거나, 기기 기능 (예: 카메라)을 사용 중지하는 등 사용자 기기의 다양한 측면을 제어합니다.

EMM은 고객이 개발자의 EMM 콘솔 및 서버와 함께 사용할 수 있는 DPC 앱을 개발합니다. 고객이 자신이 관리하는 사용자 기기에 DPC를 배포합니다. DPC는 EMM 콘솔 (및 서버)과 기기 간의 가교 역할을 합니다. 관리자는 EMM 콘솔을 사용하여 기기 설정 및 앱 구성을 포함한 다양한 작업을 실행합니다.

DPC는 DPC가 설치된 기기에서 직장 프로필을 만들고 관리합니다. 직장 프로필은 직장 관련 정보를 암호화하여 사용자의 개인 앱 및 데이터와 분리합니다. 직장 프로필을 만들기 전에 DPC는 기기에서 사용할 관리 Google Play 계정을 프로비저닝할 수도 있습니다.

이 가이드에서는 직장 프로필을 만들고 관리할 수 있는 DPC를 개발하는 방법을 보여줍니다.

EMM용 DPC 지원 라이브러리

EMM용 DPC 지원 라이브러리는 엔터프라이즈 환경에서 Android 기기의 프로비저닝과 관리를 용이하게 하는 유틸리티 및 도우미 클래스로 구성됩니다. 이 라이브러리를 사용하면 DPC 앱의 중요한 기능을 활용할 수 있습니다.

  • 관리 Google Play 계정 프로비저닝 지원: DPC 앱에서 관리 Google Play 계정을 프로비저닝하려면 Google Play 및 Google Play 서비스 앱이 최소 버전 요구사항을 충족해야 합니다. 그러나 이러한 앱을 업데이트하는 것은 복잡할 수 있습니다. DPC 지원 라이브러리는 이러한 앱의 업데이트를 처리하고 관리 Google Play 계정 프로비저닝 프로세스의 향후 업데이트와의 호환성도 보장합니다. 자세한 내용은 Managed Google Play 계정 프로비저닝 지원을 참조하세요.
  • 관리 구성 지원: Play EMM API를 사용하여 승인된 앱의 관리 구성을 처리하는 것이 DPC에서 관리 구성을 가장 쉽게 구현할 수 있습니다. DPC 지원 라이브러리를 사용하면 관리자가 EMM 콘솔을 사용하여 설정한 관리 구성 (이전의 앱 제한) 적용 작업을 Google Play에 위임할 수 있습니다. Play EMM API를 사용하여 관리 구성을 처리하면 설치 중에 앱 구성을 원자적으로 적용할 수 있습니다. DPC에서 이 기능을 사용 설정하는 방법에 관한 자세한 내용은 업무용 앱에 관리 구성 적용을 참고하세요.

아래 단계에 따라 라이브러리를 다운로드합니다. 이 가이드에서 설명하는 작업은 DPC 지원 라이브러리를 사용한다고 가정합니다.

DPC 지원 라이브러리 다운로드

DPC 지원 라이브러리를 사용하려면 Android Enterprise EMM 제공업체 커뮤니티에서 라이브러리를 다운로드하세요. build.gradle 파일에 라이브러리를 추가하고 DPC 앱을 빌드할 때 다른 종속 항목을 처리해야 합니다. 예를 들어 라이브러리에는 11.4.0 Google Play 서비스 인증 클라이언트 라이브러리가 필요합니다.

  1. 라이브러리를 build.gradle 파일에 추가합니다.

    Groovy

    implementation(name:'dpcsupport-yyyymmdd', ext:'aar')
    

    Kotlin

    implementation(name = "dpcsupport-yyyymmdd", ext = "aar")
    
  2. 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!
}

Java

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()
}

Java

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)
    }
}

Java

@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() 콜백 구현은 다음을 실행합니다.

직장 프로필 활성화

이러한 작업을 완료하면 기기 정책 관리자의 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)

Java

// 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 콘솔에 현재 정책을 쿼리한 다음 Device Administration 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)

Java

ManagedConfigurationsSupport managedConfigurationsSupport =
    new ManagedConfigurationsSupport(context, admin);

관리 구성을 사용 설정합니다.

Kotlin

managedConfigurationsSupport.enableManagedConfigurations()

Java

managedConfigurationsSupport.enableManagedConfigurations();

DPC에서 이 라이브러리를 초기화하면 EMM 콘솔과 서버에서 Google Play EMM API를 사용하여 DPC에서 직접 이러한 작업을 코딩하는 대신 승인된 앱에 관리 구성을 적용할 수 있습니다. 자세한 내용은 Play를 통한 관리 구성을 참고하세요.

DPC에서 직접 관리 구성 적용

DPC에서 직접 앱의 구성 설정을 변경하려면 DevicePolicyManager.setApplicationRestrictions() 메서드를 호출하고 DPC 앱의 DeviceAdminReceiver, 타겟 앱의 패키지 이름, 관리자가 설정한 앱의 관리 구성을 포함하는 Bundle의 매개변수를 전달합니다. 자세한 내용은 DPC와 EMM 콘솔이 상호작용하는 방식관리 구성 설정을 참고하세요. 하지만 관리 구성을 적용하는 이 대체 방법은 관리 Google Play 계정 배포에서 권장되지 않습니다.

관리 Google Play 계정 프로비저닝 지원

DPC 지원 라이브러리는 관리 Google Play 계정 프로비저닝을 위한 지원을 포함합니다. 이 지원을 사용하려면 먼저 라이브러리를 초기화해야 합니다. 그런 다음 작업 환경을 확인하고 관리 Google Play 계정을 추가하면 됩니다.

DPC에서 관리 Google Play 계정 지원 초기화

DPC에서 다음 클래스를 가져옵니다.

com.google.android.apps.work.dpcsupport.AndroidForWorkAccountSupport

프로비저닝 호환성 라이브러리를 초기화합니다. 이 예에서 'admin'은 DeviceAdminReceiverComponentName입니다.

Kotlin

var androidForWorkAccountSupport = AndroidForWorkAccountSupport(context, admin)

Java

AndroidForWorkAccountSupport androidForWorkAccountSupport =
    new AndroidForWorkAccountSupport(context, admin);

관리 Google Play 계정의 작업 환경 보장

DPC가 프로필 소유자 모드 (ACTION_PROVISION_MANAGED_PROFILE) 또는 기기 소유자 모드 (ACTION_PROVISION_MANAGED_DEVICE)에서 기기를 프로비저닝한 후에는 다음을 호출하여 기기에서 관리 Google Play 계정을 지원할 수 있는지 확인합니다.

Kotlin

androidForWorkAccountSupport.ensureWorkingEnvironment(callback)

Java

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)
    }
}

Java

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)

Java

androidForWorkAccountSupport.addAndroidForWorkAccount(token, accountAddedCallback);
  • token: Google Play EMM API Users.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).
    }
}

Java

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에 관한 자세한 내용은 기기 관리를 참고하세요.
  • Android Enterprise 프로비저닝 방법에 관한 자세한 내용은 Android Enterprise 개발자 가이드의 기기 프로비저닝을 참고하세요.
  • 기본 직장 프로필을 만드는 방법을 보여주는 GitHub 샘플은 BasicManagedProfile을 참고하세요.
  • 프로필 소유자로서 다른 앱에서 구성을 설정하는 방법을 보여주는 GitHub 샘플은 AppRestrictionenforcer를 참고하세요.