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ó 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 sẽ 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 đó.

Khi bạn 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 hồ sơ công việc (được gọi là chủ sở hữu hồ sơ). Bảng 1 cho biết cách chủ sở hữu thiết bị có thể quản lý 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ề bản cập nhật hệ thống.

Bảng 1: Các tác vụ có sẵn cho DPC phụ 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ó các bản cập nhật hệ thống đang chờ xử lý không
Nhận lệnh gọi lại khi có bản cập nhật hệ thống mới
Thiết lập 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 giai đoạn 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 dành cho 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 ngay các bản cập nhật quan trọng.

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(), lệnh này sẽ trả về null nếu thiết bị đã cập nhật. Nếu 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ý. Ví dụ sau đây cho thấy cách bạn có thể tìm ra thời điểm một bản cập nhật đang chờ xử lý lần đầu tiên ra mắt 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 đè lệnh gọi lại onSystemUpdatePending(). Bạn không cần phải đăng ký hoặc quảng cáo để DPC của mình 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. Hãy 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 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ụ: hồ sơ công việc trên các thiết bị được quản lý toàn bộ), thì cả chủ sở hữu thiết bị và chủ sở hữu hồ sơ đều sẽ 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ể thuộc một trong ba loại sau:

Tự động
Cài đặt các bản cập nhật hệ thống ngay khi có sẵn (mà không cần người dùng tương tác). Nếu bạn đặt loại chính sách này, thì mọi bản cập nhật đang chờ xử lý có thể bị trì hoãn hoặc đang chờ bảo trì sẽ được cài đặt ngay lập tức.
Cửa sổ
Cài đặt các bản cập nhật hệ thống trong thời gian bảo trì hằng ngày (mà không cần người dùng tương tác). Đặt thời gian bắt đầu và kết thúc của thời gian bảo trì hằng ngày, dưới dạng phút trong ngày, khi tạo một chính sách mới theo khung thời gian.
Trì hoãn
Trì hoãn quá trình cài đặt các bản cập nhật hệ thống trong 30 ngày. Sau khi thời hạn 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 bị hoãn trong vòng 30 ngày. Khoảng thời gian này bắt đầu khi hệ thống trì hoãn quá trình cập nhật lần đầu tiên và việc đặt các chính sách mới cho việc trì hoãn sẽ không kéo dài khoảng thời gian đó.

Ngoài việc bị hoãn, Android có thể không cài đặt được bản cập nhật vì các lý do khác 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ộ tính giờ trì hoãn 30 ngày nếu có một bản cập nhật khác trong khoảng thời gian đó – giúp quản trị viên CNTT có cơ hội dùng thử các bản cập nhật hệ thống kết hợp. Sau khi 30 ngày không có bản cập nhật mới, hệ thống sẽ nhắc người dùng 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, 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ị nên cài đặt các bản cập nhật hệ thống, hãy tạo một thực thể của SystemUpdatePolicy bằng cách sử dụng một trong 3 loại nêu trên. Để đặt một chính sách, chủ sở hữu thiết bị của bạn sẽ gọi phương thức DevicePolicyManager setSystemUpdatePolicy(). Mã mẫu sau đây cho thấy cách bạn có thể thực hiện việc này. Để xem ví dụ về chính sách cửa sổ, hãy xem tài liệu 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 trường hợp chính sách sau khi tạo. Để thay đổi thời điểm thiết bị cài đặt các bản cập nhật, bạn có thể tạo và đặt một chính sách mới. Để xoá một chính sách khỏi một thiết bị, hãy gọi setSystemUpdatePolicy() chuyển null dưới dạng đối số policy. Sau khi DPC xoá một chính sách, người dùng thiết bị sẽ thấy thông báo về mọi bản cập nhật hệ thống hiện có.

Các ứng dụng có thể gọi getSystemUpdatePolicy() để lấy chính sách hiện tại cho thiết bị. Nếu phương thức này trả về null, tức là chính sách hiện chưa được đặt.

Thời gian đóng băng

Để treo 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 thời gian bận khác, 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, 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ý.
  • 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 để tìm 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 đệ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 việc đóng băng thiết bị vô thời hạn. Hãy nhớ rằng việc đóng băng các 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.

Hình 1. Đã đặt hai khoảng thời gian đóng băng cho thiết bị
Lịch hiển thị hai khoảng thời gian đóng băng trong một năm với vùng đệm là 60 ngày.

Bạn đặt khoảng thời gian đóng băng 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 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, chế độ cửa sổ hoặc bị hoãn) sẽ đượ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. Chủ sở hữu thiết bị đặt khoảng thời gian đóng băng cho một chính sách cập nhật hệ thống trước khi đặt chính sách này cho thiết bị. Các bước thực hiện như sau:

  1. Tạo một chính sách mới (hoặc tải chính sách cập nhật hệ thống hiện tại).
  2. Đặt khoảng thời gian đóng băng trên chính sách bằng cách gọi setFreezePeriods().
  3. Đặt chính sách và đặt khoảng 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 ít nhất 60 ngày sau khi kết thúc bất kỳ khoảng thời gian đóng băng nào trước đó. Ví dụ sau cho thấy 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ả ngày bắt đầu và ngày kết thúc đều được tính. 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), thời gian đóng băng sẽ kéo dài sang năm sau.

Khi đặt khoảng thời gian đóng băng cho một 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 quá 90 ngày.
  • Khoảng thời gian giữa các khoảng thời gian đóng băng tối thiểu 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 quá trình kiểm thử này và đưa vào mọi khoảng thời gian treo hiện tại hoặc trước đây của thiết bị đó.

Android sẽ gửi một SystemUpdatePolicy.ValidationFailedException khi bất kỳ quy trình kiểm thử nào trong số này không thành công.

Để xem danh sách khoảng thời gian đóng băng đã đặt trước đó cho đố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 khoảng thời gian đóng băng 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à Lịch Gregorian) để tính toán thời gian đóng băng và nó bỏ qua năm nhuận. Điều này có nghĩa là ngày 29 tháng 2 không được ghi 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 khoảng thời gian đóng bă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 phải tạo nhiều khoảng thời gian đóng băng. Do 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 đó, nên có thể bạn sẽ không thiết lập được khoảng thời gian đóng băng mới nếu trước đó không xoá bản ghi của các khoảng thời gian trước đó. Để xoá bản ghi thời gian đóng băng của thiết bị, hãy chạy lệnh sau trong shell Cầu gỡ lỗi Android (adb):

adb shell dpm clear-freeze-period-record

Bạn có thể xác nhận một thiết bị đang trong thời gian treo bằng cách kiểm tra để đảm bảo rằng giao diện người dùng cho các bản cập nhật hệ thống đã tắt.

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 về Bản cập nhật OTA của Dự án nguồn mở Android.