시스템 업데이트 관리

이 개발자 가이드에서는 기기 정책 컨트롤러 (DPC)가 어떻게 작동하는지 설명합니다. 기기 사용자를 대신하여 Android 시스템 업데이트를 관리합니다.

소개

Android 기기에서 무선 업데이트 (OTA)를 수신하여 시스템에 설치할 수 있습니다. 애플리케이션 소프트웨어입니다. Android에서 기기 사용자에게 시스템 업데이트를 알립니다. 업데이트를 즉시 또는 나중에 설치할 수 있습니다.

IT 관리자는 DPC를 사용하여 기기 사용자의 시스템 업데이트를 관리할 수 있습니다. DPC는 완전 관리형 기기(기기 소유자라고 함)를 소유하거나 직장 프로필(프로필 소유자라고 함)을 소유할 수 있습니다. 표 1에는 기기 소유자가 시스템을 관리하는 방법이 나와 있습니다. 프로필 소유자는 시스템 업데이트에 대한 정보만 보고할 수 있습니다.

표 1: DPC에 사용 가능한 작업은 소유자 모드에 따라 다름

작업 기기 소유자 프로필 소유자
대기 중인 시스템 업데이트 확인하기
새로운 시스템 업데이트가 있을 때 콜백 수신
Android가 시스템 업데이트를 설치하는 시기를 제어하기 위한 로컬 업데이트 정책 설정
중요한 기간 동안 OS 버전 고정

대기 중인 업데이트 확인

대기 중인 업데이트는 아직 설치되지 않은 기기의 시스템 업데이트입니다. DPC를 통해 IT 관리자는 대기 중인 시스템 업데이트가 있는 기기를 확인할 수 있습니다. 기기 사용자에게 중요한 업데이트를 즉시 설치하도록 요청할 수도 있습니다.

Android 8.0 (API 수준 26) 이상에서 실행되는 기기 소유자 및 프로필 소유자 기기에 대기 중인 시스템 업데이트가 있는지 확인할 수 있습니다. 전화걸기 DevicePolicyManager.getPendingSystemUpdate() 드림 기기가 최신 상태인 경우 null를 반환합니다. 시스템 업데이트가 대기 중인 경우 메서드가 업데이트에 관한 정보를 반환합니다.

대기 중인 업데이트 자세히 알아보기

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가 2개 이상 있는 경우(예: 완전 관리형의 직장 프로필) 기기 소유자와 프로필 소유자 모두 콜백을 수신합니다.

정책 업데이트

기기 소유자는 로컬 시스템을 설정하여 업데이트 설치 시기를 제어할 수 있습니다. 기기 정책 업데이트 시스템 업데이트 정책은 다음 세 가지 유형 중 하나입니다.

자동
시스템 업데이트가 업데이트되는 즉시 설치합니다. (사용자 상호작용 없이) 이 정책 유형을 설정하면 대기 중인 업데이트가 즉시 설치됩니다. 지연되거나 유지보수 기간을 기다리는 중일 수 있습니다.
창문 있음
일일 유지관리 기간 중 시스템 업데이트 설치 (사용자 상호작용 없음) 새 기간 정책을 만들 때 일일 유지보수 기간의 시작과 종료를 하루의 분으로 설정합니다.
연기됨
시스템 업데이트 설치를 30일 동안 연기합니다. 30일이 지나면 시스템에서 기기 사용자에게 업데이트를 설치하라는 메시지를 표시합니다.

연기 기간

시스템에서는 각 업데이트를 30일 연기로 제한합니다. 기간은 시스템이 먼저 업데이트를 연기하고 새 연기 정책을 설정할 때 생리 기간 연장

연기를 한 후에 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);

정책 인스턴스를 만든 후에는 변경할 수 없습니다. 기기를 교체하는 시간을 변경하려면 다음 단계를 따르세요. 새 정책을 만들고 설정할 수 있습니다. 계정에서 정책을 삭제하려면 기기에서 nullpolicy 인수로 전달하는 setSystemUpdatePolicy()를 호출합니다. DPC에서 정책을 삭제하면 기기 사용자에게 관련 알림이 표시됩니다. 사용 가능한 시스템 업데이트가 있습니다.

앱은 getSystemUpdatePolicy()를 호출하여 기기의 현재 정책 이 메서드가 null를 반환하면 정책이 현재 설정되어 있지 않습니다.

정지 기간

휴일 또는 기타 바쁜 기간과 같이 중요한 기간에 OS 버전을 고정하기 위해 기기 소유자는 최대 90일 동안 시스템 업데이트를 정지할 수 있습니다. 사용자가 기기가 정지 기간 내에 있으면 다음과 같이 작동합니다.

  • 기기가 대기 중인 시스템 업데이트에 대한 알림을 수신하지 않습니다.
  • OS의 시스템 업데이트가 설치되지 않았습니다.
  • 기기 사용자는 설정에서 시스템 업데이트를 수동으로 확인할 수 없습니다.

시스템은 정해진 동결 후 필수적으로 60일의 여유 기간을 적용합니다. 기기가 무기한 정지되지 않도록 할 수 있습니다. 시스템이 정지된다는 점을 기억하세요 업데이트하면 기기에서 중요한 업데이트를 수신하지 못할 수 있습니다.

그림 1. 기기에 두 개의 동결 기간이 설정됨
60일의 버퍼가 있는 1년에 두 번의 동결 기간이 표시된 Calendar

업데이트 정책에 정지 기간을 설정합니다. 정지 기간을 설정하려면 정책을 설정할 수 있습니다 기기가 설정한 정지 기간을 벗어나면 일반적인 정책 동작 (자동, 기간 설정 또는 연기됨)이 적용됩니다.

정지 기간 설정 방법

Android 9 (API 수준 28) 이상에서 정지 기간을 설정할 수 있습니다. 기기 소유자는 기기의 정책을 설정하기 전에 시스템 업데이트 정책에 동결 기간을 설정합니다. 단계는 다음과 같습니다.

  1. 새 시스템 업데이트 정책을 만들거나 현재 정책을 가져옵니다.
  2. 다음을 호출하여 정책의 정지 기간을 설정합니다. setFreezePeriods()
  3. 다음을 호출하여 기기의 정책 및 정지 기간을 설정합니다. 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 시스템 업데이트 롤백 (GPSUR) 도구가 문제가 있는 Google Play 시스템 업데이트로 인해 기기 상태를 복구하는 데 사용됨 설치해야 합니다 이 도구는 고급 사용자 또는 고급 사용자가 사용 지침이 있는 경우에만 사용해야 합니다. 데이터 손실을 초래할 수 있으므로 지원 담당자의 도움을 받아야 합니다. GPSUR을 사용하는 방법은 다음과 같습니다. 도구:

  1. 컴퓨터에서 Android 디버그 브리지 (adb)가 실행 중인 경우 방해하지 않도록 adb 서비스를 먼저 롤백 프로세스를 수행할 수 있습니다 adb를 중지하려면 adb kill-server를 실행합니다.
  2. GPSUR 도구를 엽니다.
  3. Allow ADB access를 클릭하여 도구가 테스트와 통신하도록 허용합니다. adb를 통해 전송할 수 있습니다.
  4. 새 기기 추가를 클릭합니다.
  5. 목록에서 기기를 선택하고 연결을 클릭합니다. 이 목록은 전체 기기 이름이 포함됩니다.
  6. 기기 화면에서 이 컴퓨터에서 항상 허용을 선택하고 OK를 눌러 USB 디버깅 연결을 수락합니다.
  7. 브라우저에서 연결된 기기를 선택합니다.
  8. 페이지의 버튼 텍스트가 사용 가능한 롤백 없음에서 기기에서 사용 가능한 롤백이 있는 경우 최근 업데이트를 롤백합니다. 최근 업데이트 롤백을 클릭합니다.
  9. 롤백 확인 모달의 경고를 읽고 확인을 클릭합니다.
  10. 롤백이 완료될 때까지 기다립니다. 완료되면 Rollback Successful(롤백 성공) 모달이 표시되고 기기가 재부팅됩니다. 이제 기기의 전원을 안전하게 분리할 수 있습니다. 있습니다.

추가 리소스

시스템 업데이트에 관해 자세히 알아보려면 Android 오픈소스 프로젝트의 OTA 업데이트 문서