คู่มือสำหรับนักพัฒนาซอฟต์แวร์นี้อธิบายวิธีที่เครื่องมือควบคุมนโยบายด้านอุปกรณ์ (DPC) จัดการการอัปเดตระบบ Android ในนามของผู้ใช้อุปกรณ์
ข้อมูลเบื้องต้น
อุปกรณ์ Android สามารถรับและติดตั้งการอัปเดตผ่านอากาศ (OTA) ในระบบได้ และซอฟต์แวร์ประยุกต์ Android แจ้งผู้ใช้อุปกรณ์ว่าการอัปเดตระบบ พร้อมใช้งาน และผู้ใช้อุปกรณ์สามารถติดตั้งอัปเดตทันทีหรือภายหลังก็ได้
ผู้ดูแลระบบไอทีสามารถจัดการการอัปเดตระบบให้กับผู้ใช้อุปกรณ์ได้โดยใช้ DPC DPC สามารถเป็นเจ้าของอุปกรณ์ที่มีการจัดการครบวงจร (เรียกว่าเจ้าของอุปกรณ์) หรือเป็นเจ้าของโปรไฟล์งานได้ (เรียกว่าเจ้าของโปรไฟล์) ตารางที่ 1 แสดงวิธีที่เจ้าของอุปกรณ์จัดการระบบได้ แต่เจ้าของโปรไฟล์สามารถรายงานได้เฉพาะข้อมูลเกี่ยวกับการอัปเดตระบบเท่านั้น
ตาราง 1: งานที่ใช้ได้กับ DPC จะขึ้นอยู่กับโหมดเจ้าของ
ตรวจหาการอัปเดตที่รอดำเนินการ
การอัปเดตที่รอดำเนินการคือการอัปเดตระบบสำหรับอุปกรณ์ที่ยังไม่ได้ติดตั้ง DPC ของคุณจะช่วยผู้ดูแลระบบไอทีตรวจสอบว่าอุปกรณ์ใดมีการอัปเดตระบบที่รอดำเนินการอยู่ และ โดยอาจขอให้ผู้ใช้อุปกรณ์ติดตั้งอัปเดตที่สำคัญในทันที
เจ้าของอุปกรณ์และเจ้าของโปรไฟล์ที่ใช้ Android 8.0 (API ระดับ 26) ขึ้นไป
สามารถตรวจสอบว่าอุปกรณ์มีการอัปเดตระบบที่รอดำเนินการหรือไม่ โทร
DevicePolicyManager.getPendingSystemUpdate()
ซึ่งจะแสดงผล null
หากอุปกรณ์เป็นเวอร์ชันล่าสุด หากการอัปเดตระบบรอดำเนินการอยู่ วิธีการนี้จะแสดงข้อมูลเกี่ยวกับการอัปเดต
ดูข้อมูลเพิ่มเติมเกี่ยวกับการอัปเดตที่รอดำเนินการ
หลังจากโทรหา getPendingSystemUpdate()
แล้ว คุณจะตรวจสอบสินค้าที่ส่งคืนได้
SystemUpdateInfo
เพื่อดูข้อมูลเพิ่มเติมเกี่ยวกับการอัปเดตที่รอดำเนินการ
ตัวอย่างต่อไปนี้แสดงวิธีที่คุณอาจทราบเมื่อการอัปเดตที่รอดำเนินการเกิดขึ้นครั้งแรก
พร้อมใช้งานกับอุปกรณ์:
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));
}
Callback ของระบบ
เมื่อมีการอัปเดต ระบบ Android จะแจ้งเจ้าของอุปกรณ์เกี่ยวกับ อัปเดตใหม่ ใน Android 8.0 ขึ้นไป ระบบจะแจ้งให้เจ้าของโปรไฟล์ทราบด้วย
ในคลาสย่อย DeviceAdminReceiver
ให้ลบล้าง
การติดต่อกลับของ onSystemUpdatePending()
คุณไม่จำเป็นต้องใช้
ลงทะเบียนหรือลงโฆษณาให้ DPC เพื่อให้ได้รับการติดต่อกลับ ระบบอาจ
เรียกใช้เมธอดนี้มากกว่า 1 ครั้งสำหรับการอัปเดตครั้งเดียว ดังนั้นโปรดตรวจสอบสถานะการอัปเดต
ก่อนที่จะตอบ โทรหา getPendingSystemUpdate()
เพื่อดูข้อมูลเพิ่มเติมเกี่ยวกับ
การอัปเดตระบบใน Callback ตัวอย่างต่อไปนี้แสดงวิธีดำเนินการดังกล่าว
/**
* 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 มากกว่า 1 รายการ เช่น โปรไฟล์งานในอุปกรณ์ที่มีการจัดการครบวงจร เจ้าของอุปกรณ์และเจ้าของโปรไฟล์จะได้รับการติดต่อกลับทั้งคู่
อัปเดตนโยบาย
เจ้าของอุปกรณ์ควบคุมได้ว่าจะติดตั้งการอัปเดตเมื่อใดด้วยการตั้งค่าระบบในเครื่อง อัปเดตนโยบายสำหรับอุปกรณ์ นโยบายการอัปเดตระบบมี 3 ประเภทดังนี้
- อัตโนมัติ
- ติดตั้งการอัปเดตระบบทันที ว่าง (โดยไม่ต้องมีการโต้ตอบของผู้ใช้) การตั้งค่าประเภทนโยบายนี้จะติดตั้งการอัปเดตที่รอดำเนินการทั้งหมดทันที ซึ่งอาจมีการเลื่อนเวลาการบำรุงรักษาหรือรอช่วงเวลาบำรุงรักษา
- โหมดหน้าต่าง
- ติดตั้งการอัปเดตระบบในช่วงเวลาบำรุงรักษาประจำวัน (โดยไม่ต้องมีการโต้ตอบจากผู้ใช้) กำหนดเวลาเริ่มต้นและสิ้นสุดของช่วงเวลาบำรุงรักษารายวัน เป็นนาที วันนั้นเมื่อสร้างนโยบายกรอบเวลาใหม่
- เลื่อนกำหนดการ
- เลื่อนการติดตั้งการอัปเดตระบบเป็นเวลา 30 วัน หลังจาก 30 วัน สิ้นสุดระยะเวลาแล้ว ระบบจะแจ้งให้ผู้ใช้อุปกรณ์ติดตั้งการอัปเดต
ระยะเวลาเลื่อน
ระบบจะจำกัดการอัปเดตแต่ละครั้งไว้ที่การเลื่อนเวลา 30 วันหนึ่งครั้ง ระยะเวลาจะเริ่มต้นเมื่อ ระบบจะเลื่อนการอัปเดตออกไปก่อน และการตั้งค่านโยบายการเลื่อนใหม่จะไม่ ขยายระยะเวลา
นอกจากการเลื่อนเวลาแล้ว Android อาจติดตั้งอัปเดตไม่ได้ด้วยเหตุผลอื่นๆ เช่น ไม่มีการเชื่อมต่อ พื้นที่ในดิสก์ไม่เพียงพอ หรือแบตเตอรี่เหลือน้อย
ระบบจะรีเซ็ตตัวจับเวลาการเลื่อน 30 วันหากมีการอัปเดตอื่นพร้อมใช้งานในช่วงเวลาดังกล่าว ซึ่งจะช่วยให้ผู้ดูแลระบบไอทีมีโอกาสลองใช้การอัปเดตระบบแบบรวม หลังจากผ่านไป 30 วันโดยไม่มีการอัปเดตใหม่ ระบบจะแจ้งให้ ติดตั้งอัปเดตที่รอดำเนินการทั้งหมด หลังจากนั้น เมื่อการอัปเดตระบบใหม่พร้อมให้ดำเนินการแล้ว ระยะเวลา 30 วันจะเริ่มอีกครั้ง
วิธีกำหนดนโยบาย
คุณตั้งค่านโยบายการอัปเดตได้ใน Android 8.0 (API ระดับ 26) ขึ้นไป หากต้องการระบุ
เวลาที่อุปกรณ์ควรติดตั้งการอัปเดตระบบ ให้สร้างอินสแตนซ์
SystemUpdatePolicy
โดยใช้ 1 ใน 3 ประเภทที่สรุป
ที่ด้านบน หากต้องการตั้งค่านโยบาย เจ้าของอุปกรณ์เรียกใช้เมธอด DevicePolicyManager
setSystemUpdatePolicy()
ตัวอย่างโค้ดต่อไปนี้แสดงวิธีดำเนินการ หากต้องการดูตัวอย่างนโยบายกรอบเวลา ให้ดูที่
ในเอกสารประกอบของ SystemUpdatePolicy
// 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);
เมื่อสร้างอินสแตนซ์นโยบายแล้วจะเปลี่ยนแปลงไม่ได้ วิธีเปลี่ยนเวลาของอุปกรณ์
ติดตั้งการอัปเดต คุณจะสามารถสร้างและตั้งค่านโยบายใหม่ได้ หากต้องการนำนโยบายออกจาก
อุปกรณ์ เรียก setSystemUpdatePolicy()
ผ่าน null
เป็นอาร์กิวเมนต์ policy
หลังจาก DPC นำนโยบายออกแล้ว ผู้ใช้อุปกรณ์จะเห็นการแจ้งเตือนสำหรับการอัปเดตระบบที่พร้อมใช้งาน
แอปจะโทรหา getSystemUpdatePolicy()
เพื่อรับ
นโยบายปัจจุบันของอุปกรณ์ หากเมธอดนี้แสดงผล null
หมายความว่า
ยังไม่ได้กำหนดนโยบายในขณะนี้
ช่วงหยุดทำงาน
เพื่อระงับเวอร์ชันของระบบปฏิบัติการในช่วงเวลาที่สำคัญ เช่น วันหยุดหรือเทศกาลอื่นๆ เจ้าของอุปกรณ์สามารถระงับการอัปเดตระบบได้สูงสุด 90 วัน เมื่อ อุปกรณ์อยู่ในช่วงระยะเวลาค้าง จะมีการทำงานดังนี้
- อุปกรณ์ไม่ได้รับการแจ้งเตือนใดๆ เกี่ยวกับการอัปเดตระบบที่รอดำเนินการ
- ไม่ได้ติดตั้งการอัปเดตระบบสำหรับระบบปฏิบัติการ
- ผู้ใช้อุปกรณ์ไม่สามารถตรวจหาการอัปเดตระบบด้วยตนเองในการตั้งค่า
ระบบจะบังคับใช้ระยะเวลาบัฟเฟอร์ 60 วันตามที่กำหนดไว้หลังจากการระงับชั่วคราวที่กำหนด เพื่อป้องกันการตรึงอุปกรณ์โดยไม่มีกำหนด โปรดทราบว่าการหยุดอัปเดตระบบไว้ชั่วคราวอาจทำให้อุปกรณ์ไม่ได้รับการอัปเดตที่สำคัญ
คุณตั้งค่าระยะเวลาหยุดทำงานในนโยบายการอัปเดต คุณไม่สามารถกำหนดช่วงหยุดทำงานหากไม่ การตั้งค่านโยบาย เมื่ออุปกรณ์ไม่ได้อยู่ในช่วงหยุดทำงานที่คุณตั้งค่าไว้ ตามนโยบายแล้ว (แบบอัตโนมัติ ตามกรอบเวลา หรือเลื่อน)
วิธีกำหนดช่วงหยุดทำงาน
คุณกำหนดช่วงหยุดทำงานใน Android 9 (API ระดับ 28) ขึ้นไปได้ เจ้าของอุปกรณ์จะกำหนดระยะเวลาหยุดทำงานในนโยบายการอัปเดตระบบก่อนที่จะตั้งค่านโยบายสำหรับอุปกรณ์ ขั้นตอนมีดังนี้
- สร้างนโยบายการอัปเดตระบบใหม่ (หรือรับนโยบายปัจจุบัน)
- กำหนดช่วงหยุดทำงานในนโยบายโดยการโทร
setFreezePeriods()
- ตั้งค่านโยบายและระงับการใช้งานอุปกรณ์ด้วยการโทร
setSystemUpdatePolicy()
เนื่องจากช่วงหยุดทำงานนี้เกิดซ้ำทุกปี วันที่เริ่มต้นและวันที่สิ้นสุดของช่วงวันที่ ระยะเวลาจะแสดงด้วยค่าเดือนและวัน วันที่เริ่มต้นต้องอยู่หลังสิ้นสุดระยะเวลาหยุดทำงานก่อนหน้าอย่างน้อย 60 วัน ตัวอย่างต่อไปนี้ แสดงวิธีการตั้งค่าช่วงหยุดทำงาน 2 ช่วงสำหรับนโยบายการอัปเดตระบบที่มีอยู่ ดังนี้
// 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()
ดังต่อไปนี้
ตัวอย่างเช่น เรียกใช้วิธีการนี้เพื่อบันทึกช่วงเวลาที่อุปกรณ์ค้าง:
// 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 (หรือเรียกว่าปฏิทินเกรกอเรียน) เพื่อ จะคำนวณช่วงหยุดทำงานและไม่รวมปีอธิกสุรทิน ซึ่งหมายความว่าวันที่ 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 อัปเดต