애플리케이션 역할 관리

애플리케이션 역할 기능을 사용하면 IT 관리자가 Android 기반 기기에서 관리 애플리케이션에 특별 권한을 부여할 수 있습니다. 특정 역할을 할당하면 앱이 전원 및 백그라운드 제한, 정지, 절전 모드 (Android 14 이상)에서 제외되고 사용자 제어 (예: 강제 종료 및 앱 데이터 삭제와 같은 사용자 작업 포함)가 사용 중지되어 (Android 11 이상) 중단 없이 중요한 기능을 실행할 수 있습니다. 또한 앱은 할당된 역할을 알림으로 받을 수 있으므로 사용자 개입 없이 자체적으로 부트스트랩할 수 있습니다.

기본 요건

기기가 AMAPI 기반 EMM에 의해 관리됩니다 (맞춤 DPC를 사용하는 EMM은 지원되지 않음).

기능 사용을 위한 앱 준비

AMAPI SDK와의 통합은 앱이 할당된 역할을 통지받아 자체 부트스트랩 (즉, 사용자 상호작용 없이 자동 실행)할 수 있도록 하려는 경우에만 필요합니다.

앱에서 AMAPI SDK와 통합

AMAPI SDK 및 앱에 추가하는 방법에 관한 자세한 내용은 AMAPI SDK 통합 가이드를 참고하세요.

앱의 매니페스트에 필수 메타데이터 추가

Android Device Policy (ADP)는 NotificationReceiverService를 구현하는 클래스의 ComponentName를 알아야 할당된 역할을 앱에 알릴 수 있습니다. ADP에서 자동으로 검색할 수 있도록 AndroidManifest.xml에서 서비스를 적절하게 태그해야 합니다.

  • 앱에 enabled이고 android:namecom.google.android.managementapi.notification.NotificationReceiverService.SERVICE_APP_ROLES와 같은 meta-data가 있는 서비스가 정확히 하나 있어야 합니다.
  • 이 서비스의 android:exportedtrue로 설정되어 있어야 합니다.
  • meta-dataandroid:value은 빈 문자열로 설정해야 합니다.
<service
 android:name=".MyNotificationReceiverService"
 android:exported="true">
    <meta-data android:name="com.google.android.managementapi.notification.NotificationReceiverService.SERVICE_APP_ROLES" android:value="" />
</service>

COMPANION_APP 역할을 테스트하는 경우 Android Device Policy가 로컬 명령어 상태 업데이트를 앱에 전송할 수 있도록 서비스에 다음 meta-data도 추가해야 합니다.

<meta-data android:name="com.google.android.managementapi.notification.NotificationReceiverService.SERVICE_COMMAND_STATUS" android:value="" />

NotificationReceiverService를 확장하는 서비스 만들기 (또는 기존 서비스 업데이트)

기존 NotificationReceiverService을 만들거나 업데이트하고 AppRolesListener을 구현하여 앱에 할당된 역할을 수신 대기합니다. 앱에 할당된 역할을 수신 대기하는 데는 getAppRolesListener()만 필요합니다. 앱에 COMPANION_APP 역할이 할당된 경우 getCommandListener()도 구현해야 합니다.

import android.util.Log
import com.google.android.managementapi.approles.AppRolesListener
import com.google.android.managementapi.approles.model.AppRolesSetRequest
import com.google.android.managementapi.approles.model.AppRolesSetResponse
import com.google.android.managementapi.commands.CommandListener
import com.google.android.managementapi.commands.model.Command
import com.google.android.managementapi.notification.NotificationReceiverService

class MyNotificationReceiverService : NotificationReceiverService() {

  // If your app wants to listen for roles assigned
  override fun getAppRolesListener(): AppRolesListener =
    object : AppRolesListener {
      override fun onAppRolesSet(request: AppRolesSetRequest): AppRolesSetResponse {
        val roleTypes = request.roles.map { role -> role.roleType }
        Log.i(TAG, "onAppRolesSet: $roleTypes")

        return AppRolesSetResponse.getDefaultInstance()
      }
    }

 // If your app wants to listen for local command status updates
 // Only relevant for COMPANION_APP role
 override fun getCommandListener(): CommandListener {
    return object : CommandListener {
      override fun onCommandStatusChanged(command: Command) {
         Log.i(TAG, "onCommandStatusChanged")
      }
    }
  }

  private companion object {
    const val TAG = "MyNotificationReceiverService"
  }
}

역할이 여러 번 변경되면 앱에 여러 번 알림이 전송될 수 있습니다. 모든 역할이 삭제되더라도 앱에는 빈 역할 목록이 알림으로 전송됩니다. 이 알림은 앱을 중지된 상태에서 벗어나게 하며 앱에 부여된 예외와 함께 앱은 사용자 상호작용 없이 자체적으로 부트스트랩할 수 있습니다. 앱 역할 알림 및 예외 덕분에 앱이 ACTION_BOOT_COMPLETED 브로드캐스트를 수신할 수 있습니다. 앱이 자체 부트스트랩을 위해 관리 구성에 의존하는 경우 변경사항을 읽고 수신하는 방법은 관리 구성 설정을 참고하세요.

앱 역할 정책으로 기기 프로비저닝

앱 개발자는 EMM을 사용하거나 Android Management API 빠른 시작을 따라 애플리케이션에 앱 역할을 할당하는 것을 테스트할 수 있습니다. AMAPI Colab 노트북을 사용하면 기업을 등록하고, 정책을 만들고,기기를 프로비저닝할 수 있습니다.

앱 역할로 앱 정책 설정

ApplicationPolicy.roles를 사용하여 앱이 갖도록 설계된 앱 역할로 policy를 설정합니다.

다음 예에서는 MTD 앱의 역할을 구성하는 방법을 보여줍니다.

{
  "applications": [

    {
      "packageName": "com.example.mtd",
      "installType": "FORCE_INSTALLED",
      "roles": [
        { "roleType": "MOBILE_THREAT_DEFENSE_ENDPOINT_DETECTION_RESPONSE" }
      ]
    }
  ]
}

정책에 지정된 역할을 할당하기 전에 시스템은 기기의 앱 서명 키 인증서 지문이 Play 스토어의 지문과 일치하는지 확인합니다. 지문이 다르면 역할이 앱에 할당되지 않으며 NonComplianceReason.APP_SIGNING_CERT_MISMATCH 비준수가 EMM에 보고됩니다.

{
  "applications": [

    {
      "packageName": "com.example.mtd",
      "installType": "FORCE_INSTALLED",
      "signingKeyCerts": [
         { "signingKeyCertFingerprintSha256": "base64-encoded-sha256" }
       ],
      "roles": [
        { "roleType": "MOBILE_THREAT_DEFENSE_ENDPOINT_DETECTION_RESPONSE" }
      ]
    }
  ]
}

앱에 관리 구성이 있는 경우 IT 관리자는 애플리케이션 정책에서 관련 restriction의 초기 구성을 설정할 수 있습니다.

{
  "applications": [

    {
      "packageName": "com.example.mtd",
      "installType": "FORCE_INSTALLED",
      "roles": [
        { "roleType": "MOBILE_THREAT_DEFENSE_ENDPOINT_DETECTION_RESPONSE" }
      ],
      "managedConfiguration": {
        "<key>": "<value>"
      }
    }
  ]
}