จัดการการอัปเดตระบบ

คู่มือสำหรับนักพัฒนาซอฟต์แวร์นี้อธิบายวิธีที่เครื่องมือควบคุมนโยบายด้านอุปกรณ์ (DPC) จัดการการอัปเดตระบบ Android ในนามของผู้ใช้อุปกรณ์

ข้อมูลเบื้องต้น

อุปกรณ์ Android สามารถรับและติดตั้งการอัปเดตผ่านอากาศ (OTA) ในระบบได้ และซอฟต์แวร์ประยุกต์ Android แจ้งผู้ใช้อุปกรณ์ว่าการอัปเดตระบบ พร้อมใช้งาน และผู้ใช้อุปกรณ์สามารถติดตั้งอัปเดตทันทีหรือภายหลังก็ได้

ผู้ดูแลระบบไอทีจะจัดการการอัปเดตระบบสำหรับผู้ใช้อุปกรณ์ได้โดยใช้ DPC DPC สามารถเป็นเจ้าของอุปกรณ์ที่มีการจัดการครบวงจร (เรียกว่าเจ้าของอุปกรณ์) หรือเป็นเจ้าของโปรไฟล์งานได้ (เรียกว่าเจ้าของโปรไฟล์) ตารางที่ 1 แสดงวิธีที่เจ้าของอุปกรณ์จัดการระบบได้ แต่เจ้าของโปรไฟล์สามารถรายงานได้เฉพาะข้อมูลเกี่ยวกับการอัปเดตระบบเท่านั้น

ตาราง 1: งานที่ใช้ได้กับ DPC จะขึ้นอยู่กับโหมดเจ้าของ

งาน เจ้าของอุปกรณ์ เจ้าของโปรไฟล์
ตรวจหาการอัปเดตระบบที่รอดำเนินการ
รับ Callback เมื่อมีการอัปเดตระบบใหม่
ตั้งค่านโยบายการอัปเดตในเครื่องเพื่อควบคุมเวลาที่ Android จะติดตั้งการอัปเดตระบบ
ตรึงเวอร์ชันของระบบปฏิบัติการในช่วงเวลาที่สำคัญ

ตรวจหาการอัปเดตที่รอดำเนินการ

การอัปเดตที่รอดำเนินการคือการอัปเดตระบบสำหรับอุปกรณ์ที่ยังไม่ได้ติดตั้ง DPC จะช่วยผู้ดูแลระบบไอทีตรวจสอบว่าอุปกรณ์ใดมีการอัปเดตระบบที่รอดำเนินการอยู่ และ โดยอาจขอให้ผู้ใช้อุปกรณ์ติดตั้งอัปเดตที่สำคัญในทันที

เจ้าของอุปกรณ์และเจ้าของโปรไฟล์ที่ใช้ 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)}")
}

Java

SystemUpdateInfo updateInfo = dpm.getPendingSystemUpdate(adminName);
if (updateInfo != null) {
  Long firstAvailable = updateInfo.getReceivedTime();
  Log.i(TAG, "Update first available: " + new Date(firstAvailable));
}

Callback ของระบบ

เมื่อมีการอัปเดต ระบบ Android จะแจ้งเจ้าของอุปกรณ์เกี่ยวกับ อัปเดตใหม่ ใน Android 8.0 ขึ้นไป ระบบจะแจ้งให้เจ้าของโปรไฟล์ทราบด้วย

ในคลาสย่อย DeviceAdminReceiver ให้ลบล้าง การติดต่อกลับของ onSystemUpdatePending() ไม่จำเป็นต้องใช้ ลงทะเบียนหรือลงโฆษณาให้ DPC เพื่อให้ได้รับการติดต่อกลับ ระบบอาจ เรียกใช้เมธอดนี้มากกว่า 1 ครั้งสำหรับการอัปเดตครั้งเดียว ดังนั้นโปรดตรวจสอบสถานะการอัปเดต ก่อนที่จะตอบ โทรหา getPendingSystemUpdate() เพื่อดูข้อมูลเพิ่มเติมเกี่ยวกับ การอัปเดตระบบใน Callback ตัวอย่างต่อไปนี้แสดงวิธีดำเนินการดังกล่าว

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.
        // ...
    }
}

Java

/**
 * 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 มากกว่า 1 ตัว เช่น โปรไฟล์งานที่มีการจัดการครบวงจร ทั้งเจ้าของอุปกรณ์ และเจ้าของโปรไฟล์จะได้รับการติดต่อกลับ

อัปเดตนโยบาย

เจ้าของอุปกรณ์ควบคุมได้ว่าจะติดตั้งการอัปเดตเมื่อใดด้วยการตั้งค่าระบบในเครื่อง อัปเดตนโยบายสำหรับอุปกรณ์ นโยบายการอัปเดตระบบมี 3 ประเภทดังนี้

อัตโนมัติ
ติดตั้งการอัปเดตระบบทันที ว่าง (โดยไม่ต้องมีการโต้ตอบของผู้ใช้) การตั้งค่าประเภทนโยบายนี้จะติดตั้งการอัปเดตที่รอดำเนินการทั้งหมดทันที ซึ่งอาจมีการเลื่อนเวลาการบำรุงรักษาหรือรอช่วงเวลาบำรุงรักษา
โหมดหน้าต่าง
ติดตั้งการอัปเดตระบบระหว่างการบำรุงรักษาประจำวัน (โดยที่ผู้ใช้ไม่ต้องโต้ตอบ) กำหนดเวลาเริ่มต้นและสิ้นสุดของช่วงเวลาบำรุงรักษารายวัน เป็นนาที วันนั้นเมื่อสร้างนโยบายกรอบเวลาใหม่
เลื่อนกำหนดการ
เลื่อนการติดตั้งการอัปเดตระบบเป็นเวลา 30 วัน หลังจาก 30 วัน สิ้นสุดระยะเวลาแล้ว ระบบจะแจ้งให้ผู้ใช้อุปกรณ์ติดตั้งการอัปเดต

ช่วงเลื่อน

ระบบจะจำกัดการอัปเดตแต่ละครั้งไว้ที่การเลื่อนเวลา 30 วันหนึ่งครั้ง ระยะเวลาจะเริ่มต้นเมื่อ ระบบจะเลื่อนการอัปเดตออกไปก่อน และการตั้งค่านโยบายการเลื่อนใหม่จะไม่ ขยายระยะเวลา

นอกจากการเลื่อน Android แล้ว Android อาจไม่สามารถติดตั้งอัปเดตสำหรับ สาเหตุต่างๆ เช่น ไม่มีการเชื่อมต่อ พื้นที่ในดิสก์ไม่เพียงพอ หรือแบตเตอรี่เหลือน้อย

ระบบจะรีเซ็ตตัวจับเวลาการเลื่อน 30 วันหากมีการอัปเดตอื่น ได้ในช่วงเวลาดังกล่าว ซึ่งทำให้ผู้ดูแลระบบไอทีมีโอกาสได้ลองใช้ระบบแบบรวม อัปเดต หลังจากผ่านไป 30 วันโดยไม่มีการอัปเดตใหม่ ระบบจะแจ้งให้ ติดตั้งอัปเดตที่รอดำเนินการทั้งหมด หลังจากนั้น เมื่อการอัปเดตระบบใหม่ ช่วงเวลา 30 วันจะเริ่มต้นอีกครั้ง

วิธีกำหนดนโยบาย

คุณสามารถตั้งค่านโยบายการอัปเดตใน Android 8.0 (API ระดับ 26) ขึ้นไปได้ หากต้องการระบุ เวลาที่อุปกรณ์ควรติดตั้งการอัปเดตระบบ ให้สร้างอินสแตนซ์ SystemUpdatePolicy โดยใช้ 1 ใน 3 ประเภทที่สรุป ที่ด้านบน หากต้องการตั้งค่านโยบาย เจ้าของอุปกรณ์เรียกใช้เมธอด DevicePolicyManager setSystemUpdatePolicy() รหัสต่อไปนี้ ตัวอย่างจาก Google จะแสดงวิธีการที่คุณอาจนำไปใช้ หากต้องการดูตัวอย่างนโยบายกรอบเวลา ให้ดูที่ ในเอกสารประกอบของ 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)

Java

// 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);

เมื่อสร้างอินสแตนซ์นโยบายแล้วจะเปลี่ยนแปลงไม่ได้ วิธีเปลี่ยนเวลาของอุปกรณ์ ติดตั้งการอัปเดต คุณจะสามารถสร้างและตั้งค่านโยบายใหม่ได้ หากต้องการนำนโยบายออกจาก อุปกรณ์ เรียก setSystemUpdatePolicy() ผ่าน null เป็นอาร์กิวเมนต์ policy หลังจากที่ DPC นำนโยบายออก ผู้ใช้อุปกรณ์จะเห็นการแจ้งเตือนสำหรับ การอัปเดตระบบที่มีอยู่

แอปจะโทรหา getSystemUpdatePolicy() เพื่อรับ นโยบายปัจจุบันของอุปกรณ์ หากเมธอดนี้แสดงผล null หมายความว่า ยังไม่ได้กำหนดนโยบายในขณะนี้

ช่วงหยุดทำงาน

เพื่อระงับเวอร์ชันของระบบปฏิบัติการในช่วงเวลาที่สำคัญ เช่น วันหยุดหรือเทศกาลอื่นๆ เจ้าของอุปกรณ์สามารถระงับการอัปเดตระบบได้สูงสุด 90 วัน เมื่อ อุปกรณ์อยู่ในช่วงระยะเวลาค้าง จะมีการทำงานดังนี้

  • อุปกรณ์ไม่ได้รับการแจ้งเตือนใดๆ เกี่ยวกับการอัปเดตระบบที่รอดำเนินการ
  • ไม่ได้ติดตั้งการอัปเดตระบบสำหรับระบบปฏิบัติการ
  • ผู้ใช้อุปกรณ์ไม่สามารถตรวจหาการอัปเดตระบบด้วยตนเองในการตั้งค่า

ระบบจะบังคับใช้ระยะเวลาบัฟเฟอร์ 60 วันตามที่กำหนดไว้หลังจากการระงับชั่วคราวที่กำหนด เพื่อป้องกันการตรึงอุปกรณ์โดยไม่มีกำหนด อย่าลืมว่าระบบค้าง การอัปเดตอาจทำให้อุปกรณ์ไม่ได้รับการอัปเดตที่สำคัญ

รูปที่ 1. ตั้งช่วงหยุดทำงาน 2 ช่วงในอุปกรณ์
วันที่ ปฏิทินแสดงช่วงหยุดทำงาน 2 ช่วงใน 1 ปี โดยมีบัฟเฟอร์ 60 วัน

คุณกำหนดช่วงหยุดทำงานในนโยบายการอัปเดต คุณไม่สามารถกำหนดช่วงหยุดทำงานหากไม่ การตั้งค่านโยบาย เมื่ออุปกรณ์ไม่ได้อยู่ในช่วงหยุดทำงานที่คุณตั้งค่าไว้ ตามนโยบายแล้ว (แบบอัตโนมัติ ตามกรอบเวลา หรือเลื่อน)

วิธีกำหนดช่วงหยุดทำงาน

คุณกำหนดช่วงหยุดทำงานใน Android 9 (API ระดับ 28) ขึ้นไปได้ อุปกรณ์ เจ้าของกำหนดช่วงหยุดทำงานในนโยบายการอัปเดตระบบก่อนที่จะตั้งค่านโยบาย สำหรับอุปกรณ์ ขั้นตอนมีดังนี้

  1. สร้างนโยบายการอัปเดตระบบใหม่ (หรือรับนโยบายปัจจุบัน)
  2. กำหนดช่วงหยุดทำงานในนโยบายโดยการโทร setFreezePeriods()
  3. ตั้งค่านโยบายและระงับการใช้งานอุปกรณ์ด้วยการโทร setSystemUpdatePolicy()

เนื่องจากช่วงหยุดทำงานนี้เกิดซ้ำทุกปี วันที่เริ่มต้นและวันที่สิ้นสุดของช่วงวันที่ ระยะเวลาจะแสดงด้วยค่าเดือนและวัน วันที่เริ่มต้นต้องเริ่มที่ อย่างน้อย 60 วันหลังจากสิ้นสุดช่วงหยุดทำงานก่อนหน้านี้ ตัวอย่างต่อไปนี้ แสดงวิธีการตั้งค่าช่วงหยุดทำงาน 2 ช่วงสำหรับนโยบายการอัปเดตระบบที่มีอยู่ ดังนี้

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

Java

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

Java

// 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 (หรือเรียกว่าปฏิทินเกรกอเรียน) เพื่อ จะคำนวณช่วงหยุดทำงานและไม่รวมปีอธิกสุรทิน ซึ่งหมายความว่าวันที่ 29 กุมภาพันธ์ ไม่ใช่วันที่ที่ถูกต้องและจะถือว่าเป็นวันที่ 28 กุมภาพันธ์ ดังนั้น ระบบจึงไม่นับวันที่ 29 กุมภาพันธ์เมื่อคำนวณระยะเวลาของการค้าง 6 เดือน

การพัฒนาและการทดสอบ

ขณะที่คุณกำลังพัฒนาและทดสอบคุณลักษณะการอัปเดตระบบของ DPC คุณอาจ ต้องเกิดช่วงหยุดทำงานหลายครั้ง เพราะ Android ตรวจสอบช่วงเวลา 60 วัน ระหว่างช่วงหยุดทำงานที่ผ่านมา คุณอาจไม่สามารถตั้งช่วงหยุดทำงานใหม่ โดยไม่ล้างข้อมูลของช่วงเวลาที่ผ่านมาก่อน วิธีล้างการหยุดทำงานของอุปกรณ์ ให้เรียกใช้คำสั่งต่อไปนี้ใน Android Debug Bridge (adb) เชลล์:

adb shell dpm clear-freeze-period-record

คุณสามารถยืนยันว่าอุปกรณ์อยู่ในช่วงหยุดทำงานได้โดยการตรวจสอบว่าผู้ใช้ อินเทอร์เฟซสำหรับการอัปเดตระบบถูกปิดใช้งาน

การอัปเดตระบบ Google Play (เมนไลน์)

การอัปเดตระบบ Google Play (เรียกอีกอย่างว่าการอัปเดตเมนไลน์) ดาวน์โหลดโดยอัตโนมัติ แต่ต้องมีการรีบูตอุปกรณ์จึงจะติดตั้งได้ เหล่านี้ การอัปเดตจะไม่ทริกเกอร์การรีบูตโดยอัตโนมัติ แต่จะติดตั้งบน ผู้ใช้ ผู้ดูแลระบบ หรือนโยบายรายถัดไปเริ่มรีบูต การรีบูตที่เกิดจากระบบ นโยบายการอัปเดตจะติดตั้งการอัปเดตระบบ Google/OEM ที่เกี่ยวข้องและ การอัปเดตระบบ Google Play ที่ดาวน์โหลดไว้ก่อนหน้านี้

นอกจากนี้ คุณยังติดตั้งการอัปเดตระบบ Google Play ด้วยตนเองได้โดยไปที่ การตั้งค่า > เกี่ยวกับ > เวอร์ชัน Android > อัปเดตระบบ Google Play

แหล่งข้อมูลเพิ่มเติม

หากต้องการเรียนรู้เพิ่มเติมเกี่ยวกับการอัปเดตระบบ โปรดอ่าน OTA ของโครงการโอเพนซอร์ส Android อัปเดต