Quản lý bản cập nhật hệ thống

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ủa bạn có thể quản lý các bản cập nhật hệ thống Android thay cho người dùng thiết bị.

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 bản cập nhật hệ thống có sẵn 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 đó.

Bằng cách sử dụng DPC, quản trị viên CNTT có thể quản lý các 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 trình bày cách chủ sở hữu thiết bị có thể quản lý 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: Các tác vụ mà DPC có thể thực hiện tuỳ thuộc vào chế độ chủ sở hữu

Việc cần làm Chủ sở hữu thiết bị Chủ sở hữu hồ sơ
Kiểm tra xem có bản cập nhật hệ thống đang chờ xử lý nào không
Nhận lệnh gọi lại khi có bản cập nhật hệ thống mới
Đặt chính sách cập nhật cục bộ để kiểm soát thời điểm Android cài đặt bản cập nhật hệ thống
Cố định phiên bản hệ điều hành trong những khoảng thời gian quan trọng

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à 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 điện DevicePolicyManager.getPendingSystemUpdate() Hàm này sẽ 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 giá trị SystemUpdateInfo được trả về để 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 của mình để nhận 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 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, ví dụ như hồ sơ công việc trên được quản lý hoàn toàn thiết bị, 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ì.
Có 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 thời gian bảo trì hàng ngày, dưới dạng phút ngày, khi tạo chính sách theo khung thời gian mới.
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 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.

Thời gian hoãn

Hệ thống giới hạn mỗi lần cập nhật là 30 ngày. Khoảng thời gian này bắt đầu khi hệ thống hoãn bản cập nhật lần đầu tiên và việc đặt chính sách hoãn mới sẽ không kéo dài khoảng thời gian này.

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 đồng hồ hẹn giờ hoãn 30 ngày nếu có một bản cập nhật khác trong giai đoạn này để giúp quản trị viên CNTT có cơ hội dùng thử hệ thống kết hợp bản cập nhật. Sau 30 ngày mà không có bản cập nhật mới, hệ thống sẽ nhắc cài đặt tất cả cá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 nhưng khoảng thời gian 30 ngày sẽ bắt đầu lại.

Cách đặt chính sách

Bạn có thể đặt 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ần cài đặt các bản cập nhật hệ thống, hãy tạo một phiên bản của SystemUpdatePolicy bằng một trong ba loại đã 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ã sau đây ví dụ cho thấy cách bạn có thể làm điều này. Để xem ví dụ về chính sách 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);

Sau khi tạo, bạn không thể thay đổi các bản sao chính sách. Để 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. Để xoá một chính sách khỏi thiết bị, 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

Để cố định phiên bản hệ điều hành trong các khoảng thời gian quan trọng, chẳng hạn như ngày lễ hoặc các ngày bận rộn chủ sở hữu thiết bị có thể tạm ngưng các bản cập nhật hệ thống trong tối đa 90 ngày. Khi một thiết bị ở trong khoảng thời gian đóng băng, thiết bị 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. Lưu ý rằng hệ thống đóng băng có thể khiến thiết bị không nhận được các bản cập nhật quan trọng.

Hình 1. Thiết lập hai khoảng thời gian đóng băng
Lịch cho thấy hai khoảng thời gian ngừng hoạt động trong một năm với khoảng đệm 60 ngày.

Bạn đặt khoảng thời gian cố định cho một chính sách cập nhật. Bạn không thể đặt khoảng thời gian đóng băng nếu không đặ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:

  1. Tạo một chính sách cập nhật hệ thống mới (hoặc tải chính sách hiện tại).
  2. Đặt khoảng thời gian đóng băng cho chính sách bằng cách gọi điện setFreezePeriods().
  3. Đặt chính sách và thời gian đóng băng cho thiết bị bằng cách gọi setSystemUpdatePolicy().

Vì thời gian cố định 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 đượ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 một 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 quá 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.
  • Các khoảng thời gian khoá không được trùng lặp.
  • 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 kiểm thử 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ỳ kiểm thử nào trong số này 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(). Nội dung sau đây Ví dụ về lệnh gọi phương thức này để ghi lại khoảng thời gian 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 coi là ngày hợp lệ và được coi như ngày 28 tháng 2. Do đó, ngày 29 tháng 2 không được tính khi tính thời gian treo 6 thá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 hệ thống kích hoạt chính sách cập nhật này sẽ cài đặt bản cập nhật hệ thống của Google/OEM được liên kết 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 bản cập nhật hệ thống Google Play theo cách thủ công bằng cách chuyển đế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, bạn có thể sử dụng công cụ Rút lại bản cập nhật hệ thống Google Play (GPSUR) để khôi phục trạng thái thiết bị do quá trình cài đặt Bản cập nhật hệ thống Google Play gặp sự cố. 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ụ:

  1. Nếu bạn đang chạy Cầu gỡ lỗi Android (adb) trên máy của mình, hãy dừng dịch vụ adb trước khi tiếp tục để dịch vụ đó không can thiệp vào quá trình khôi phục. Để dừng adb, hãy chạy adb kill-server.
  2. Mở công cụ GPSUR.
  3. Nhấp vào Cho phép truy cập ADB để cho phép công cụ giao tiếp với chương trình kiểm thử thiết bị thông qua adb.
  4. Nhấp vào Thêm thiết bị mới.
  5. 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ị.
  6. Trên màn hình của 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.
  7. Chọn thiết bị đã kết nối trong trình duyệt.
  8. Văn bản nút trên trang nên chuyển từ Không có khôi phục thành Khôi phục bản cập nhật gần đây nếu có yêu cầu khôi phục 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.
  9. Đọc các cảnh báo trong cửa sổ phụ Xác nhận khôi phục rồi nhấp vào Xác nhận.
  10. 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. Giờ đây, bạn có thể rút thiết bị ra khỏi nguồn điện.

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.