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: 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

Tác vụ 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à 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 đ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 sẽ trả về thông tin cập nhật.

Tìm hiểu thêm về một 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 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. Hãy gọi cho 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 thiết lập một hệ thống cục bộ cập nhật chính sách 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ó sẵn (mà không cần sự tương tác của người dùng). 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.
Đã hoãn
Hoãn việc cài đặt các 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 trước tiên, hệ thống sẽ trì hoãn việc cập nhật và việc đặ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 cho các lý do như không có kết nối, dung lượng ổ đĩa không đủ 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 thời gian thử nghiệm — để 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ể 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 khi thiết bị phải 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. Để 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.

Thời gian đóng băng

Để 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ị đ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 sẽ thực thi khoảng thời gian vùng đệm bắt buộc là 60 ngày sau mỗi khoảng thời gian đóng băng đã xác định để tránh đóng băng thiết bị 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 hiển thị hai khoảng thời gian đóng băng trong một năm với vù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 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:

  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à đóng băng khoảng thời gian 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 cố định thời hạn áp dụng chính sách cập nhật hệ thống, Android sẽ kiểm thử 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.
  • 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 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ỳ chương trình kiểm thử nào trong số này đều không thành công.

Để lấy danh sách 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ả cá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 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 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, bạn có thể không đặt được khoảng thời gian treo mới mà không xóa 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 (Mainline)

Bản cập nhật hệ thống Google Play (còn gọi là bản cập nhật Mainline) tự động tải xuống nhưng yêu cầu cài đặt khởi động lại thiết bị. 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.

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.