이 개발자 가이드에서는 기기 정책 컨트롤러 (DPC)가 어떻게 작동하는지 설명합니다. 기기 사용자를 대신하여 Android 시스템 업데이트를 관리합니다.
소개
Android 기기는 무선 업데이트(OTA)를 수신하여 시스템 및 애플리케이션 소프트웨어에 설치할 수 있습니다. Android는 기기 사용자에게 시스템 업데이트가 제공됨을 알리고 기기 사용자는 즉시 또는 나중에 업데이트를 설치할 수 있습니다.
IT 관리자는 DPC를 사용하여 기기 사용자의 시스템 업데이트를 관리할 수 있습니다. DPC 완전 관리형 기기 (기기 소유자라고 함)를 소유하거나 직장 프로필을 소유할 수 있음 (프로필 소유자라고 함) 표 1에는 기기 소유자가 시스템을 관리하는 방법이 나와 있습니다. 프로필 소유자는 시스템 업데이트에 대한 정보만 보고할 수 있습니다.
표 1: DPC에서 사용할 수 있는 작업은 소유자 모드에 따라 다름
작업 | 기기 소유자 | 프로필 소유자 |
---|---|---|
대기 중인 시스템 업데이트 확인하기 | ||
새로운 시스템 업데이트가 있을 때 콜백 수신 | ||
Android가 시스템 업데이트를 설치하는 시기를 제어하기 위한 로컬 업데이트 정책 설정 | ||
중요한 기간 동안 OS 버전 고정 |
대기 중인 업데이트 확인
대기 중인 업데이트는 아직 설치되지 않은 기기의 시스템 업데이트입니다. DPC를 통해 IT 관리자는 대기 중인 시스템 업데이트가 있는 기기를 확인할 수 있습니다. 기기 사용자에게 중요한 업데이트를 즉시 설치하도록 요청할 수도 있습니다.
Android 8.0(API 수준 26) 이상을 실행하는 기기 소유자와 프로필 소유자는 기기에 대기 중인 시스템 업데이트가 있는지 확인할 수 있습니다. 기기가 최신 상태인 경우 null
를 반환하는 DevicePolicyManager.getPendingSystemUpdate()
를 호출합니다. 시스템 업데이트가 대기 중인 경우
메서드가 업데이트에 관한 정보를 반환합니다.
대기 중인 업데이트 자세히 알아보기
getPendingSystemUpdate()
를 호출한 후 반환된
대기 중인 업데이트에 대해 자세히 알아보려면 SystemUpdateInfo
값을 사용하세요. 이
다음 예는 대기 중인 업데이트가 언제 처음으로 변경되었는지 알아내는 방법을 보여줍니다.
기기에서 사용할 수 있습니다.
Kotlin
val firstAvailable = dpm.getPendingSystemUpdate(adminName)?.receivedTime firstAvailable?.let { Log.i(TAG, "Update first available: ${Date(firstAvailable)}") }
자바
SystemUpdateInfo updateInfo = dpm.getPendingSystemUpdate(adminName); if (updateInfo != null) { Long firstAvailable = updateInfo.getReceivedTime(); Log.i(TAG, "Update first available: " + new Date(firstAvailable)); }
시스템 콜백
사용 가능한 업데이트가 있으면 Android 시스템에서 기기 소유자에게 새 업데이트로 이동합니다 Android 8.0 이상에서는 시스템에서 프로필 소유자에게도 알림을 보냅니다.
DeviceAdminReceiver
서브클래스에서 onSystemUpdatePending()
콜백을 재정의합니다. 필요하지 않음
콜백을 수신할 DPC에 대해 등록하거나 광고합니다. 시스템은 단일 업데이트에 대해 이 메서드를 두 번 이상 호출할 수 있으므로 응답하기 전에 업데이트 상태를 확인하세요. getPendingSystemUpdate()
를 호출하여 콜백에서 시스템 업데이트에 관해 자세히 알아봅니다. 다음의 예시는 그 방법을 나타냅니다.
Kotlin
/** * Called when a new update is available. */ override fun onSystemUpdatePending(context: Context?, intent: Intent?, receivedTime: Long) { // System update information is supported in API level 26 or higher. if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) { return } val updateInfo = getManager(context) .getPendingSystemUpdate(getWho(context)) ?: return if (updateInfo.securityPatchState == SystemUpdateInfo.SECURITY_PATCH_STATE_TRUE) { // Perhaps install because this is a security patch. // ... } }
자바
/** * Called when a new update is available. */ public void onSystemUpdatePending (Context context, Intent intent, long receivedTime) { // System update information is supported in API level 26 or higher. if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) { return; } SystemUpdateInfo updateInfo = getManager(context) .getPendingSystemUpdate(getWho(context)); if (updateInfo == null) { return; } if (updateInfo.getSecurityPatchState() == SystemUpdateInfo.SECURITY_PATCH_STATE_TRUE) { // Perhaps install because this is a security patch. // ... } }
시스템에 DPC가 두 개 이상 있는 경우(예: 완전 관리 기기의 직장 프로필) 기기 소유자와 프로필 소유자가 모두 콜백을 수신합니다.
정책 업데이트
기기 소유자는 로컬 시스템을 설정하여 업데이트 설치 시기를 제어할 수 있습니다. 기기 정책 업데이트 시스템 업데이트 정책은 다음 세 가지 유형 중 하나일 수 있습니다.
- 자동
- 사용 가능해지면 시스템 업데이트를 설치합니다(사용자 상호작용 없이). 이 정책 유형을 설정하면 대기 중인 업데이트가 즉시 설치됩니다. 지연되거나 유지보수 기간을 기다리는 중일 수 있습니다.
- 창문 있는 벽
- 일일 유지보수 기간 동안 시스템 업데이트를 설치합니다(사용자 상호작용 없음). 일일 유지보수 기간의 시작 및 종료 시간을 분 단위로 설정 새 기간이 설정된 정책을 만들었을 때 적용됩니다.
- 연기됨
- 시스템 업데이트 설치를 30일 동안 연기합니다. 30일이 지나면 시스템에서 기기 사용자에게 업데이트를 설치하라는 메시지를 표시합니다.
연기 기간
시스템은 각 업데이트를 30일 연기로 1회로 제한합니다. 기간은 시스템이 먼저 업데이트를 연기하고 새 연기 정책을 설정할 때 생리 기간 연장
Android는 연기 외에도 연결 불가, 디스크 공간 부족, 배터리 부족 등의 다른 이유로 업데이트를 설치하지 못할 수도 있습니다.
다른 업데이트가 적용될 경우 시스템에서 30일 연기 타이머를 재설정합니다. IT 관리자에게 통합 시스템을 사용해 볼 수 있는 기회가 주어집니다. 업데이트. 새 업데이트 없이 30일이 지나면 시스템에서 사용자에게 대기 중인 모든 업데이트를 설치하라는 메시지가 표시됩니다. 나중에 새 시스템 업데이트가 출시되면 30일의 기간이 다시 시작됩니다.
정책 설정 방법
Android 8.0(API 수준 26) 이상에서 업데이트 정책을 설정할 수 있습니다. 지정
기기에서 시스템 업데이트를 설치해야 하는 경우
SystemUpdatePolicy
에서 설명된 3가지 유형 중 하나를 사용합니다.
참조하세요. 정책을 설정하려면 기기 소유자가 DevicePolicyManager
메서드를 호출합니다.
setSystemUpdatePolicy()
다음 코드는
샘플이 이 작업을 수행하는 방법을 보여줍니다 시간 제한 정책 예시는 SystemUpdatePolicy
문서를 참고하세요.
Kotlin
// Create the system update policy to postpone installation for 30 days. val policy = SystemUpdatePolicy.createPostponeInstallPolicy() // Get a DevicePolicyManager instance to set the policy on the device. val dpm = context.getSystemService(Context.DEVICE_POLICY_SERVICE) as DevicePolicyManager val adminName = getComponentName(context) // Set the policy. dpm.setSystemUpdatePolicy(adminName, policy)
자바
// Create the system update policy to postpone installation for 30 days. SystemUpdatePolicy policy = SystemUpdatePolicy.createPostponeInstallPolicy(); // Get a DevicePolicyManager instance to set the policy on the device. DevicePolicyManager dpm = (DevicePolicyManager) context .getSystemService(Context.DEVICE_POLICY_SERVICE); ComponentName adminName = getComponentName(context); // Set the policy. dpm.setSystemUpdatePolicy(adminName, policy);
정책 인스턴스를 만든 후에는 변경할 수 없습니다. 기기에서 업데이트를 설치하는 시점을 변경하려면 새 정책을 만들고 설정하면 됩니다. 기기에서 정책을 삭제하려면 null
을 policy
인수로 전달하여 setSystemUpdatePolicy()
를 호출합니다.
DPC에서 정책을 삭제하면 기기 사용자에게 사용 가능한 시스템 업데이트에 관한 알림이 표시됩니다.
앱은 getSystemUpdatePolicy()
를 호출하여
기기의 현재 정책 이 메서드가 null
를 반환하면
정책이 현재 설정되어 있지 않습니다.
정지 기간
기기 소유자는 휴일 또는 기타 사용량이 많은 시간과 같은 중요한 기간 동안 OS 버전을 고정하기 위해 시스템 업데이트를 최대 90일 동안 일시중지할 수 있습니다. 사용자가 기기가 정지 기간 내에 있으면 다음과 같이 작동합니다.
- 기기가 대기 중인 시스템 업데이트에 대한 알림을 수신하지 않습니다.
- OS의 시스템 업데이트가 설치되지 않았습니다.
- 기기 사용자는 설정에서 시스템 업데이트를 수동으로 확인할 수 없습니다.
시스템에서는 지정된 동결 기간이 지나면 의무적으로 60일 버퍼 기간을 적용해 기기가 무기한 동결되지 못하도록 합니다. 시스템이 정지된다는 점을 기억하세요 업데이트하면 기기에서 중요한 업데이트를 수신하지 못할 수 있습니다.
<ph type="x-smartling-placeholder">업데이트 정책에 동결 기간을 설정합니다. 정책을 설정하지 않으면 동결 기간을 설정할 수 없습니다. 기기가 설정한 정지 기간을 벗어나면 일반적인 정책 동작 (자동, 기간 설정 또는 연기됨)이 적용됩니다.
동결 기간을 설정하는 방법
Android 9 (API 수준 28) 이상에서 정지 기간을 설정할 수 있습니다. 기기 소유자가 정책을 설정하기 전에 시스템 업데이트 정책에 정지 기간을 설정함 정의합니다. 단계는 다음과 같습니다.
- 새 시스템 업데이트 정책을 만들거나 현재 정책을 가져옵니다.
- 다음을 호출하여 정책의 정지 기간을 설정합니다.
setFreezePeriods()
setSystemUpdatePolicy()
를 호출하여 기기의 정책 및 동결 기간을 설정합니다.
동결 기간은 매년 반복되기 때문에 기간은 월 및 일 값으로 표시됩니다. 시작일은 이전 동결 기간이 끝나고 최소 60일 후 다음 예를 참고하세요. 에서는 기존 시스템 업데이트 정책에 두 가지 정지 기간을 설정하는 방법을 보여줍니다.
Kotlin
// Get the existing policy from the DevicePolicyController instance. val policy = dpm.systemUpdatePolicy ?: return try { // Set the two annual freeze periods on the policy for our retail // point-of-sale devices. val summerSale = FreezePeriod( MonthDay.of(6, 1), MonthDay.of(7, 31)) // Jun 1 - Jul 31 inclusive val winterSale = FreezePeriod( MonthDay.of(11, 20), MonthDay.of(1, 12)) // Nov 20 - Jan 12 inclusive policy.freezePeriods = Arrays.asList(summerSale, winterSale) // Set the policy again to activate the freeze periods. dpm.setSystemUpdatePolicy(adminName, policy) } catch (e: SystemUpdatePolicy.ValidationFailedException) { // There must be previous periods recorded on the device because // summerSale and winterSale don’t overlap and are separated by more // than 60 days. Report the overlap ... }
자바
// Get the existing policy from the DevicePolicyController instance. SystemUpdatePolicy policy = dpm.getSystemUpdatePolicy(); try { // Set the two annual freeze periods on the policy for our // retail point-of-sale devices. FreezePeriod summerSale = new FreezePeriod( MonthDay.of(6, 1), MonthDay.of(7, 31)); // Jun 1 - Jul 31 inclusive FreezePeriod winterSale = new FreezePeriod( MonthDay.of(11, 20), MonthDay.of(1, 12)); // Nov 20 - Jan 12 inclusive policy.setFreezePeriods(Arrays.asList(summerSale, winterSale)); // Don’t forget to set the policy again to activate the freeze periods. dpm.setSystemUpdatePolicy(adminName, policy); } catch (SystemUpdatePolicy.ValidationFailedException e) { // There must be previous periods recorded on the device because summerSale // and winterSale don’t overlap and are separated by more than 60 days. // Report the overlap ... }
시작일과 종료일 모두 포함됩니다. 시작일이 더 긴 경우
종료일보다 (예: 이전 예의 winterSale
) 정지됨
기간은 다음 해까지 연장됩니다.
시스템 업데이트 정책에서 동결 기간을 설정할 때 Android는 다음 요구사항을 테스트합니다.
- 90일을 초과하는 정지 기간이 없습니다.
- 정지 기간 사이의 간격은 60일 이상입니다.
- 고정 기간은 겹치지 않습니다.
- 중복된 정지 기간이 없습니다.
기기의 시스템 업데이트 정책을 설정할 때 Android에서 이러한 테스트를 반복합니다. 여기에는 기기의 현재 또는 과거 정지 기간이 포함됩니다.
이러한 테스트 중 하나라도 실패하면 Android에서 SystemUpdatePolicy.ValidationFailedException
을 발생시킵니다.
시스템 업데이트 정책 객체에 이전에 설정된 동결 기간 목록을 가져오려면 설치된 모든 앱에서 SystemUpdatePolicy.getFreezePeriods()
를 호출하면 됩니다. 다음 예에서는 이 메서드를 호출하여 기기의 정지 기간을 기록합니다.
Kotlin
// Log any freeze periods that might be set on a system update policy. dpm.systemUpdatePolicy?.freezePeriods?.forEach { Log.i(TAG, "Freeze period: $it") }
자바
// Log any freeze periods that might be set on a system update policy. SystemUpdatePolicy currentPolicy = dpm.getSystemUpdatePolicy(); if (currentPolicy != null) { // A policy might not be set. for (FreezePeriod freezePeriod : currentPolicy.getFreezePeriods()) { Log.i(TAG, "Freeze period: " + freezePeriod.toString()); } }
윤년
Android는 ISO 8601 캘린더(그레고리력이라고도 함)를 사용하여 정지 기간을 계산하며 윤년은 무시합니다. 즉, 2월 29일은 유효한 날짜로 인식되지 않으며 2월 28일인 것처럼 처리됩니다. 따라서 동결 기간의 기간을 계산할 때 2월 29일은 계산되지 않습니다.
개발 및 테스트
DPC의 시스템 업데이트 기능을 개발하고 테스트하는 동안 여러 정지 기간을 만들어야 할 수 있습니다. Android는 60일 간격을 확인하기 때문에 새 정지 기간을 설정하지 못할 수도 있습니다. 생리 기간을 줄일 수 있습니다. 기기 정지 해제 마침표 레코드를 추가하려면 Android 디버그 브리지 (adb) 셸:
adb shell dpm clear-freeze-period-record
시스템 업데이트 사용자 인터페이스가 사용 중지되어 있는지 확인하여 기기가 정지 기간에 있는지 확인할 수 있습니다.
Google Play 시스템 업데이트(Mainline)
Google Play 시스템 업데이트 (Mainline 업데이트라고도 함)는 자동으로 다운로드되지만 설치하려면 기기를 재부팅해야 합니다. 이러한 업데이트는 자동 재부팅을 트리거하지 않으며 대신 다음 사용자, 관리자 또는 정책에서 시작된 재부팅 시 설치됩니다. 시스템에 의해 재부팅된 경우 업데이트 정책은 관련 Google/OEM 시스템 업데이트 및 이전에 다운로드한 Google Play 시스템 업데이트
설정 > 정보 > Android 버전 > Google Play 시스템 업데이트로 이동하여 Google Play 시스템 업데이트를 수동으로 설치할 수도 있습니다.
업데이트 롤백하기
Google Play 시스템 업데이트 설치에 문제가 있어 기기 상태를 복구하는 데 Google Play 시스템 업데이트 롤백(GPSUR) 도구를 사용할 수 있는 경우도 있습니다. 이 도구는 데이터 손실이 발생할 수 있으므로 고급 사용자 또는 지원 담당자가 지시한 경우에만 사용해야 합니다. GPSUR을 사용하는 방법은 다음과 같습니다. 도구:
- 컴퓨터에서 Android 디버그 브리지 (adb)가 실행 중인 경우
방해하지 않도록 adb 서비스를 먼저
롤백 프로세스를 수행할 수 있습니다 adb를 중지하려면
adb kill-server
를 실행합니다. - GPSUR 도구를 엽니다.
- Allow ADB access를 클릭하여 도구가 테스트와 통신하도록 허용합니다. adb를 통해 전송할 수 있습니다.
- 새 기기 추가를 클릭합니다.
- 목록에서 기기를 선택하고 연결을 클릭합니다. 이 목록은 전체 기기 이름이 포함됩니다.
- 기기 화면에서 이 컴퓨터에서 항상 허용을 선택하고 확인을 클릭하여 USB 디버깅 연결을 수락합니다.
- 브라우저에서 연결된 기기를 선택합니다.
- 페이지의 버튼 텍스트가 사용 가능한 롤백 없음에서 기기에서 사용 가능한 롤백이 있는 경우 최근 업데이트를 롤백합니다. 최근 업데이트 롤백을 클릭합니다.
- 롤백 확인 모달의 경고를 읽고 확인을 클릭합니다.
- 롤백이 완료될 때까지 기다립니다. 완료되면 Rollback Successful(롤백 성공) 모달이 표시되고 기기가 재부팅됩니다. 이제 기기의 플러그를 뽑아도 됩니다.
추가 리소스
시스템 업데이트에 관해 자세히 알아보려면 Android 오픈소스 프로젝트의 OTA 업데이트 문서