คู่มือสำหรับนักพัฒนาซอฟต์แวร์นี้อธิบายวิธีที่เครื่องมือควบคุมนโยบายด้านอุปกรณ์ (DPC) จัดการการอัปเดตระบบ Android ในนามของผู้ใช้อุปกรณ์
ข้อมูลเบื้องต้น
อุปกรณ์ Android สามารถรับและติดตั้งการอัปเดตผ่านอากาศ (OTA) ในระบบได้ และซอฟต์แวร์ประยุกต์ Android แจ้งผู้ใช้อุปกรณ์ว่าการอัปเดตระบบ พร้อมใช้งาน และผู้ใช้อุปกรณ์สามารถติดตั้งอัปเดตทันทีหรือภายหลังก็ได้
ผู้ดูแลระบบไอทีสามารถจัดการการอัปเดตระบบให้กับผู้ใช้อุปกรณ์ได้โดยใช้ DPC DPC สามารถเป็นเจ้าของอุปกรณ์ที่มีการจัดการครบวงจร (เรียกว่าเจ้าของอุปกรณ์) หรือเป็นเจ้าของโปรไฟล์งานได้ (เรียกว่าเจ้าของโปรไฟล์) ตารางที่ 1 แสดงวิธีที่เจ้าของอุปกรณ์จัดการระบบได้ แต่เจ้าของโปรไฟล์สามารถรายงานได้เฉพาะข้อมูลเกี่ยวกับการอัปเดตระบบเท่านั้น
ตาราง 1: งานที่ใช้ได้กับ DPC จะขึ้นอยู่กับโหมดเจ้าของ
ตรวจหาการอัปเดตที่รอดำเนินการ
การอัปเดตที่รอดำเนินการคือการอัปเดตระบบสำหรับอุปกรณ์ที่ยังไม่ได้ติดตั้ง 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 อาจติดตั้งอัปเดตไม่ได้ด้วยเหตุผลอื่นๆ เช่น ไม่มีการเชื่อมต่อ พื้นที่ในดิสก์ไม่เพียงพอ หรือแบตเตอรี่เหลือน้อย
ระบบจะรีเซ็ตตัวจับเวลาการเลื่อน 30 วันหากมีการอัปเดตอื่นพร้อมใช้งานในช่วงเวลาดังกล่าว ซึ่งจะช่วยให้ผู้ดูแลระบบไอทีมีโอกาสลองใช้การอัปเดตระบบแบบรวม หลังจากผ่านไป 30 วันโดยไม่มีการอัปเดตใหม่ ระบบจะแจ้งให้ ติดตั้งอัปเดตที่รอดำเนินการทั้งหมด หลังจากนั้น เมื่อการอัปเดตระบบใหม่พร้อมให้ดำเนินการแล้ว ระยะเวลา 30 วันจะเริ่มอีกครั้ง
วิธีกำหนดนโยบาย
คุณตั้งค่านโยบายการอัปเดตได้ใน Android 8.0 (API ระดับ 26) ขึ้นไป หากต้องการระบุ
เวลาที่อุปกรณ์ควรติดตั้งการอัปเดตระบบ ให้สร้างอินสแตนซ์
SystemUpdatePolicy
โดยใช้ 1 ใน 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)
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 วันตามที่กำหนดไว้หลังจากการระงับชั่วคราวที่กำหนด เพื่อป้องกันการตรึงอุปกรณ์โดยไม่มีกำหนด โปรดทราบว่าการหยุดอัปเดตระบบไว้ชั่วคราวอาจทำให้อุปกรณ์ไม่ได้รับการอัปเดตที่สำคัญ
คุณตั้งค่าระยะเวลาหยุดทำงานในนโยบายการอัปเดต คุณไม่สามารถกำหนดช่วงหยุดทำงานหากไม่ การตั้งค่านโยบาย เมื่ออุปกรณ์ไม่ได้อยู่ในช่วงหยุดทำงานที่คุณตั้งค่าไว้ ตามนโยบายแล้ว (แบบอัตโนมัติ ตามกรอบเวลา หรือเลื่อน)
วิธีกำหนดช่วงหยุดทำงาน
คุณกำหนดช่วงหยุดทำงานใน Android 9 (API ระดับ 28) ขึ้นไปได้ เจ้าของอุปกรณ์จะกำหนดระยะเวลาหยุดทำงานในนโยบายการอัปเดตระบบก่อนที่จะตั้งค่านโยบายสำหรับอุปกรณ์ ขั้นตอนมีดังนี้
- สร้างนโยบายการอัปเดตระบบใหม่ (หรือรับนโยบายปัจจุบัน)
- กำหนดช่วงหยุดทำงานในนโยบายโดยการโทร
setFreezePeriods()
- ตั้งค่านโยบายและระงับการใช้งานอุปกรณ์ด้วยการโทร
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
ย้อนกลับการอัปเดต
ในบางกรณี คุณอาจใช้เครื่องมือย้อนกลับการอัปเดตระบบของ Google Play (GPSUR) ใช้เพื่อกู้คืนสถานะอุปกรณ์เนื่องจากการอัปเดตระบบ Google Play ที่เป็นปัญหา ของคุณ ผู้ใช้ขั้นสูงควรใช้เครื่องมือนี้หรือเมื่อได้รับคำแนะนำให้ดำเนินการ กับเจ้าหน้าที่ฝ่ายสนับสนุน เนื่องจากอาจส่งผลให้ข้อมูลสูญหาย วิธีใช้เครื่องมือ GPSUR มีดังนี้
- หากคุณมี Android Debug Bridge (adb) ที่ทำงานอยู่ในเครื่อง ให้หยุด
บริการ adb ก่อนที่จะดำเนินการต่อ เพื่อไม่ให้รบกวน
ย้อนกลับ หากต้องการหยุด adb ให้เรียกใช้
adb kill-server
- เปิดเครื่องมือ GPSUR
- คลิกอนุญาตให้เข้าถึง ADB เพื่ออนุญาตให้เครื่องมือสื่อสารกับการทดสอบ อุปกรณ์ผ่าน adb
- คลิกเพิ่มอุปกรณ์ใหม่
- เลือกอุปกรณ์จากรายการ แล้วคลิกเชื่อมต่อ รายการนี้อาจไม่ มีชื่อเต็มของอุปกรณ์
- บนหน้าจอของอุปกรณ์ ให้เลือกอนุญาตจากคอมพิวเตอร์เครื่องนี้เสมอ แล้วคลิก ตกลง เพื่อยอมรับการเชื่อมต่อการแก้ไขข้อบกพร่อง USB
- เลือกอุปกรณ์ที่เชื่อมต่อในเบราว์เซอร์
- ข้อความปุ่มในหน้าเว็บควรเปลี่ยนจากไม่มีการย้อนกลับเป็น ย้อนกลับการอัปเดตล่าสุด หากมีการย้อนกลับบนอุปกรณ์ คลิกย้อนกลับการอัปเดตล่าสุด
- อ่านคำเตือนในโมดัลยืนยันการย้อนกลับ แล้วคลิกยืนยัน
- รอให้การย้อนกลับเสร็จสมบูรณ์ เมื่อดำเนินการเสร็จแล้ว การย้อนกลับสำเร็จ โมดัลจะปรากฏขึ้นและอุปกรณ์จะรีบูต ตอนนี้สามารถถอดปลั๊กได้อย่างปลอดภัยแล้ว อุปกรณ์
แหล่งข้อมูลเพิ่มเติม
หากต้องการเรียนรู้เพิ่มเติมเกี่ยวกับการอัปเดตระบบ โปรดอ่าน OTA ของโครงการโอเพนซอร์ส Android อัปเดต