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