Hướng dẫn dành cho nhà phát triển này giải thích cách trình kiểm soát chính sách thiết bị (DPC) có thể thay mặt người dùng thiết bị quản lý các bản cập nhật hệ thống Android.
Giới thiệu
Các thiết bị Android có thể nhận và cài đặt bản cập nhật qua mạng không dây (OTA) cho hệ thống và phần mềm ứng dụng. Android thông báo cho người dùng thiết bị rằng có bản cập nhật hệ thống và người dùng thiết bị có thể cài đặt bản cập nhật ngay lập tức hoặc sau này.
Khi sử dụng DPC, quản trị viên CNTT có thể quản lý bản cập nhật hệ thống cho người dùng thiết bị. DPC có thể sở hữu một thiết bị được quản lý hoàn toàn (được gọi là chủ sở hữu thiết bị) hoặc có thể sở hữu một hồ sơ công việc (được gọi là chủ sở hữu trang doanh nghiệp). Bảng 1 cho thấy cách chủ sở hữu thiết bị có thể quản lý các bản cập nhật hệ thống, trong khi chủ sở hữu hồ sơ chỉ có thể báo cáo thông tin về các bản cập nhật hệ thống.
Bảng 1: Những nhiệm vụ mà DPC có thể thực hiện tuỳ thuộc vào chế độ của chủ sở hữu
Kiểm tra các bản cập nhật đang chờ xử lý
Bản cập nhật đang chờ xử lý là một bản cập nhật hệ thống cho một thiết bị chưa được cài đặt. DPC của bạn có thể giúp quản trị viên CNTT kiểm tra xem thiết bị nào có bản cập nhật hệ thống đang chờ xử lý và có thể yêu cầu người dùng thiết bị cài đặt các bản cập nhật quan trọng ngay lập tức.
Chủ sở hữu thiết bị và chủ sở hữu hồ sơ chạy trong Android 8.0 (API cấp 26) trở lên
có thể kiểm tra xem thiết bị có bản cập nhật hệ thống đang chờ xử lý hay không. Gọi DevicePolicyManager.getPendingSystemUpdate()
để trả về null
nếu thiết bị đã cập nhật. Nếu một bản cập nhật hệ thống đang chờ xử lý, phương thức này sẽ trả về thông tin về bản cập nhật đó.
Tìm hiểu thêm về bản cập nhật đang chờ xử lý
Sau khi gọi getPendingSystemUpdate()
, bạn có thể kiểm tra dữ liệu được trả về
SystemUpdateInfo
để tìm hiểu thêm về bản cập nhật đang chờ xử lý. Chiến lược phát hành đĩa đơn
ví dụ sau đây cho thấy cách bạn có thể biết được thời điểm một bản cập nhật đang chờ xử lý được đưa ra lần đầu tiên
có sẵn cho thiết bị:
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)); }
Lệnh gọi lại hệ thống
Khi có bản cập nhật, hệ thống Android sẽ thông báo cho chủ sở hữu thiết bị về bản cập nhật mới. Trên Android 8.0 trở lên, hệ thống cũng sẽ thông báo cho chủ sở hữu hồ sơ.
Trong lớp con DeviceAdminReceiver
, hãy ghi đè phương thức
Lệnh gọi lại onSystemUpdatePending()
. Bạn không cần đăng ký hoặc quảng cáo để DPC nhận được lệnh gọi lại. Hệ thống có thể gọi phương thức này nhiều lần cho một bản cập nhật, vì vậy, hãy kiểm tra trạng thái của bản cập nhật trước khi phản hồi. Gọi getPendingSystemUpdate()
để tìm hiểu thêm về bản cập nhật hệ thống trong lệnh gọi lại. Ví dụ sau đây cho thấy cách thực hiện việc này:
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. // ... } }
Khi một hệ thống có nhiều DPC, chẳng hạn như hồ sơ công việc trên các thiết bị được quản lý đầy đủ, thì cả chủ sở hữu thiết bị và chủ sở hữu hồ sơ đều nhận được lệnh gọi lại.
Cập nhật chính sách
Chủ sở hữu thiết bị có thể kiểm soát thời điểm cài đặt bản cập nhật bằng cách đặt chính sách cập nhật hệ thống cục bộ cho thiết bị. Chính sách cập nhật hệ thống có thể là một trong ba loại sau:
- Tự động
- Cài đặt bản cập nhật hệ thống ngay khi có (không cần người dùng tương tác). Việc đặt loại chính sách này sẽ cài đặt ngay mọi bản cập nhật đang chờ xử lý có thể bị hoãn hoặc đang chờ thời gian bảo trì.
- Trong cửa sổ
- Cài đặt bản cập nhật hệ thống trong quá trình bảo trì hằng ngày cửa sổ (không có sự tương tác của người dùng). Đặt thời gian bắt đầu và kết thúc của khoảng thời gian bảo trì hằng ngày, tính bằng phút trong ngày, khi tạo chính sách mới theo khoảng thời gian.
- Bị hoãn
- Trì hoãn việc cài đặt bản cập nhật hệ thống trong 30 ngày. Sau khi khoảng thời gian 30 ngày kết thúc, hệ thống sẽ nhắc người dùng thiết bị cài đặt bản cập nhật.
Khoảng thời gian trì hoãn
Hệ thống giới hạn mỗi bản cập nhật ở một lần hoãn 30 ngày. Khoảng thời gian này bắt đầu khi trước tiên, hệ thống sẽ trì hoãn việc cập nhật và đặt chính sách hoãn mới sẽ không kéo dài khoảng thời gian.
Ngoài việc trì hoãn, Android có thể không cài đặt được bản cập nhật vì các lý do khác, chẳng hạn như không có kết nối, không đủ dung lượng ổ đĩa hoặc pin yếu.
Hệ thống sẽ đặt lại bộ hẹn giờ hoãn 30 ngày nếu có bản cập nhật khác trong khoảng thời gian đó, cho phép quản trị viên CNTT có cơ hội thử các bản cập nhật hệ thống kết hợp. Sau 30 ngày mà không có bản cập nhật mới nào, hệ thống sẽ nhắc người dùng cài đặt tất cả bản cập nhật đang chờ xử lý. Sau đó, khi có bản cập nhật hệ thống mới, khoảng thời gian 30 ngày sẽ bắt đầu lại.
Cách thiết lập chính sách
Bạn có thể thiết lập chính sách cập nhật trong Android 8.0 (API cấp 26) trở lên. Để chỉ định thời điểm thiết bị cài đặt bản cập nhật hệ thống, hãy tạo một thực thể của SystemUpdatePolicy
bằng một trong ba loại được nêu trên. Để đặt chính sách, chủ sở hữu thiết bị sẽ gọi phương thức DevicePolicyManager
setSystemUpdatePolicy()
. Mã mẫu sau đây cho biết cách bạn có thể thực hiện việc này. Để xem ví dụ về chính sách theo cửa sổ, hãy xem tài liệu về 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);
Bạn không thể thay đổi các thực thể chính sách sau khi tạo. Để thay đổi thời điểm thiết bị
cài đặt bản cập nhật, bạn có thể tạo và đặt chính sách mới. Để xóa một chính sách khỏi
thiết bị khác, hãy gọi setSystemUpdatePolicy()
truyền null
làm đối số policy
.
Sau khi DPC của bạn xoá một chính sách, người dùng thiết bị sẽ thấy thông báo về bất kỳ
các bản cập nhật hệ thống hiện có.
Các ứng dụng có thể gọi getSystemUpdatePolicy()
để nhận
chính sách hiện tại cho thiết bị. Nếu phương thức này trả về null
, điều này có nghĩa là
bạn hiện chưa đặt chính sách này.
Khoảng thời gian cố định
Để đóng băng phiên bản hệ điều hành trong những khoảng thời gian quan trọng, chẳng hạn như dịp lễ hoặc các thời điểm bận rộn khác, chủ sở hữu thiết bị có thể tạm ngưng cập nhật hệ thống trong tối đa 90 ngày. Khi một thiết bị đang trong khoảng thời gian đóng băng, nó sẽ hoạt động như sau:
- Thiết bị không nhận được thông báo nào về các bản cập nhật hệ thống đang chờ xử lý.
- Các bản cập nhật hệ thống cho hệ điều hành chưa được cài đặt.
- Người dùng thiết bị không thể tự kiểm tra các bản cập nhật hệ thống trong phần Cài đặt.
Hệ thống thực thi một khoảng thời gian đệm bắt buộc là 60 ngày sau mọi khoảng thời gian đóng băng đã xác định để ngăn thiết bị bị đóng băng vô thời hạn. Hãy nhớ rằng việc đóng băng bản cập nhật hệ thống có thể khiến thiết bị không nhận được các bản cập nhật quan trọng.
Bạn đặt khoảng thời gian đóng băng cho chính sách cập nhật. Bạn không thể đặt khoảng thời gian cố định mà không đặt một chính sách. Khi thiết bị nằm ngoài khoảng thời gian đóng băng mà bạn đã đặt, hành vi chính sách thông thường (tự động, cửa sổ hoặc bị hoãn) được áp dụng.
Cách đặt khoảng thời gian đóng băng
Bạn có thể đặt khoảng thời gian đóng băng trong Android 9 (API cấp 28) trở lên. Một thiết bị chủ sở hữu đặt khoảng thời gian đóng băng cho chính sách cập nhật hệ thống trước khi đặt chính sách cho thiết bị. Các bước thực hiện như sau:
- Tạo chính sách cập nhật hệ thống mới (hoặc lấy chính sách hiện tại).
- Đặt khoảng thời gian đóng băng trên chính sách bằng cách gọi
setFreezePeriods()
. - Đặt chính sách và thời gian đóng băng cho thiết bị bằng cách gọi
setSystemUpdatePolicy()
.
Vì khoảng thời gian đóng băng lặp lại hằng năm, nên ngày bắt đầu và ngày kết thúc của khoảng thời gian này được biểu thị bằng giá trị tháng và ngày. Ngày bắt đầu phải bắt đầu lúc ít nhất 60 ngày sau khi kết thúc khoảng thời gian treo trước đó. Ví dụ sau đây cho biết cách bạn có thể đặt hai khoảng thời gian đóng băng cho chính sách cập nhật hệ thống hiện có:
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 ... }
Có cả ngày bắt đầu và ngày kết thúc. Nếu ngày bắt đầu lớn hơn
ngày kết thúc (chẳng hạn như winterSale
trong ví dụ trước), ngày cố định
khoảng thời gian này sẽ kéo dài sang năm sau.
Khi đặt khoảng thời gian đóng băng trên chính sách cập nhật hệ thống, Android sẽ kiểm tra các yêu cầu sau:
- Không có khoảng thời gian đóng băng nào dài hơn 90 ngày.
- Khoảng thời gian giữa các khoảng thời gian đóng băng ít nhất là 60 ngày.
- Khoảng thời gian cố định không chồng chéo nhau.
- Không có khoảng thời gian đóng băng trùng lặp.
Khi đặt chính sách cập nhật hệ thống cho một thiết bị, Android sẽ lặp lại các thử nghiệm này và bao gồm mọi khoảng thời gian đóng băng hiện tại hoặc trước đây cho thiết bị.
Android sẽ gửi một SystemUpdatePolicy.ValidationFailedException
khi
bất kỳ chương trình kiểm thử nào trong số này đều không thành công.
Để nhận danh sách các khoảng thời gian đóng băng đã đặt trước đó trên đối tượng chính sách cập nhật hệ thống, tất cả ứng dụng đã cài đặt đều có thể gọi SystemUpdatePolicy.getFreezePeriods()
. Ví dụ sau đây gọi phương thức này để ghi lại các khoảng thời gian bị treo của thiết bị:
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()); } }
Năm nhuận
Android sử dụng lịch ISO 8601 (còn gọi là Dương lịch) để tính toán khoảng thời gian đóng băng và bỏ qua năm nhuận. Điều này có nghĩa là ngày 29 tháng 2 không được công nhận là ngày hợp lệ và được coi là ngày 28 tháng 2. Do đó, ngày 29 tháng 2 không được tính khi tính toán thời lượng của khoảng thời gian ngừng hoạt động.
Phát triển và kiểm thử
Trong khi phát triển và kiểm thử tính năng cập nhật hệ thống của DPC, bạn có thể cần tạo nhiều khoảng thời gian đóng băng. Vì Android kiểm tra khoảng thời gian 60 ngày giữa các khoảng thời gian đóng băng trước đây, nên bạn có thể không đặt được khoảng thời gian đóng băng mới nếu không xoá bản ghi của các khoảng thời gian trước đó. Để xoá trạng thái treo của thiết bị bản ghi thời gian, hãy chạy lệnh sau trong Cầu gỡ lỗi Android (adb) shell:
adb shell dpm clear-freeze-period-record
Bạn có thể xác nhận rằng thiết bị đang trong thời gian bị treo bằng cách kiểm tra người dùng giao diện của các bản cập nhật hệ thống bị vô hiệu hoá.
Bản cập nhật hệ thống Google Play (Chính thống)
Bản cập nhật hệ thống Google Play (còn gọi là bản cập nhật chính) được tải xuống tự động nhưng cần khởi động lại thiết bị để cài đặt. Các các bản cập nhật sẽ không kích hoạt quá trình tự động khởi động lại mà sẽ được cài đặt trên người dùng, quản trị viên hoặc chính sách tiếp theo đã khởi động lại. Các lần khởi động lại do chính sách cập nhật hệ thống kích hoạt sẽ cài đặt bản cập nhật hệ thống Google/OEM liên quan và mọi bản cập nhật Hệ thống Google Play đã tải xuống trước đó.
Bạn cũng có thể cài đặt thủ công Bản cập nhật hệ thống Google Play bằng cách chuyển đến phần Cài đặt > Giới thiệu > Phiên bản Android > Bản cập nhật hệ thống Google Play.
Khôi phục bản cập nhật
Trong một số trường hợp, công cụ Khôi phục bản cập nhật hệ thống của Google Play (GPSUR) có thể được dùng để khôi phục trạng thái thiết bị do Bản cập nhật hệ thống Google Play có vấn đề cài đặt. Công cụ này nên được người dùng nâng cao sử dụng hoặc khi được hướng dẫn để thực hiện do đó có thể làm mất dữ liệu. Dưới đây là cách sử dụng GPSUR công cụ:
- Nếu Cầu gỡ lỗi Android (adb) đang chạy trên máy của bạn, hãy dừng dịch vụ adb trước khi tiếp tục để dịch vụ này không ảnh hưởng đến quá trình khôi phục. Để dừng adb, hãy chạy
adb kill-server
. - Mở công cụ GPSUR.
- Nhấp vào Allow ADB truy cập để cho phép công cụ giao tiếp với kiểm thử thiết bị thông qua adb.
- Nhấp vào Thêm thiết bị mới.
- Chọn thiết bị của bạn trong danh sách rồi nhấp vào Kết nối. Danh sách này có thể không chứa tên đầy đủ của thiết bị.
- Trên màn hình thiết bị, hãy chọn Luôn cho phép từ máy tính này rồi nhấp vào OK để chấp nhận kết nối gỡ lỗi qua USB.
- Chọn thiết bị đã kết nối trong trình duyệt.
- Văn bản của nút trên trang sẽ chuyển từ Không có bản rollback nào thành Rollback Recent Updates (Huỷ bỏ các bản cập nhật gần đây) nếu có bản rollback trên thiết bị của bạn. Nhấp vào Huỷ các bản cập nhật gần đây.
- Đọc các cảnh báo trên cửa sổ bật lên Confirm Rollback (Xác nhận khôi phục) rồi nhấp vào Confirm (Xác nhận).
- Chờ quá trình khôi phục hoàn tất. Sau khi hoàn tất, một cửa sổ bật lên Rollback Successful (Đã hoàn tất việc khôi phục) sẽ xuất hiện và thiết bị sẽ khởi động lại. Hiện đã an toàn để rút phích cắm thiết bị.
Tài nguyên khác
Để tìm hiểu thêm về các bản cập nhật hệ thống, hãy đọc tài liệu OTA của Dự án nguồn mở Android Tài liệu về Cập nhật.