管理系統更新

本開發人員指南將說明裝置政策控制器 (DPC) 如何 代表裝置使用者管理 Android 系統更新。

簡介

Android 裝置可以接收並安裝系統無線更新 (OTA) 和應用程式軟體Android 會通知裝置使用者進行系統更新 可用,且裝置使用者可以立即安裝更新,也可以稍後安裝。

透過您的 DPC,IT 管理員可以管理裝置使用者的系統更新。裝置政策控制器 (DPC) 可以擁有完全受管理的裝置 (稱為裝置擁有者),也可以擁有工作資料夾 稱為商家檔案擁有者。表 1 說明裝置擁有者如何管理系統 更新,但個人資料擁有者只能回報系統更新相關資訊。

表 1:DPC 可使用的工作取決於擁有者模式

工作 裝置擁有者 設定檔擁有者
檢查是否有待處理的系統更新
有可用的新系統更新時接收回呼
設定本機更新政策,控制 Android 安裝系統更新的時間
凍結重要期間的 OS 版本

檢查待更新

待安裝的系統更新是指尚未安裝的裝置所適用的系統更新。 DPC 可以協助 IT 管理員查看哪些裝置有待處理的系統更新,以及 也許可以要求裝置使用者立即安裝重大更新。

在 Android 8.0 (API 級別 26) 以上版本中執行的裝置擁有者和設定檔擁有者 可以檢查裝置是否有待處理的系統更新。致電 DevicePolicyManager.getPendingSystemUpdate()敬上 如果裝置已完成更新,則會傳回 null。如果系統更新待處理 此方法會傳回更新相關資訊。

進一步瞭解待更新項目

呼叫 getPendingSystemUpdate() 後,您可以檢查傳回的 SystemUpdateInfo 的值,進一步瞭解待處理的更新。 以下範例說明如何找出首次有待更新的項目 適用於裝置:

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));
}

系統回呼

有可用的更新時,Android 系統會通知裝置擁有者 更新內容。在 Android 8.0 以上版本中,系統也會通知商家檔案擁有者。

DeviceAdminReceiver 子類別中,覆寫 onSystemUpdatePending() 回呼。不需要 註冊或宣傳 DPC,以接收回呼。系統可能會 多次呼叫此方法來單一更新,因此請檢查更新狀態 然後再做出回應。致電 getPendingSystemUpdate() 進一步瞭解 回呼。以下範例說明如何執行這項作業:

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.
    // ...
  }
}

系統有多個 DPC,例如全代管上的工作資料夾 裝置,裝置擁有者和設定檔擁有者都會收到回呼。

更新政策

裝置擁有者可以設定本機系統,控制安裝更新的時間 更新裝置的政策。系統更新政策可為以下三種類型:

自動
安裝系統更新時立即安裝 則不需要使用者互動設定這個政策類型後,系統會立即安裝所有待處理的更新 可能會延後或等待維護期間執行
附窗戶
在每日維護期間安裝系統更新 回溯期 (不含使用者互動)。設定每日維護期間的開始和結束時間,以分鐘為單位的分鐘數 新的視窗化政策時
延期
將系統更新安裝作業延後 30 天。30 天後 測試期間結束後,系統會提示裝置使用者安裝更新。

延後期間

系統每次更新的時間上限為 30 天。經期始於 系統不會先延後更新及設定新的延後政策 並延長訂閱期

除了延後,Android 可能無法為其他 例如沒有網路連線、磁碟空間不足或電量過低等。

如果另一項更新內容變為另一個狀態,系統會重設 30 天的延後計時器 期間可用 — 讓 IT 管理員有機會試用整合系統 更新。30 天過後,如果仍未更新,系統會提示 使用者就能安裝所有待更新項目。之後當新的系統更新 30 天過後,

如何設定政策

您可以在 Android 8.0 (API 級別 26) 以上版本中設定更新政策。如要指定 裝置應安裝系統更新時,建立 SystemUpdatePolicy 使用本文列出的三種類型之一 。如要設定政策,裝置擁有者會呼叫 DevicePolicyManager 方法 setSystemUpdatePolicy()。以下程式碼 範例示範瞭如何達到這個效果如要查看固定時段政策示例,請前往 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);

政策執行個體建立後即無法變更。如何變更裝置 安裝更新,您可以建立及設定新政策。如要從應用程式中移除政策 裝置,呼叫 setSystemUpdatePolicy()null 做為 policy 引數傳遞。 DPC 移除政策後,裝置使用者就會看到 可用的系統更新

應用程式可以呼叫 getSystemUpdatePolicy() 來取得 裝置目前的政策如果這個方法傳回 null,就表示 目前未設定政策。

凍結期間

在重要期間 (例如假日或其他忙碌期間) 期間凍結 OS 版本 時間,裝置擁有者可暫停系統更新,最長可達 90 天。如果 裝置處於凍結期間,運作方式如下:

  • 裝置不會收到任何關於待處理系統更新的通知。
  • 尚未安裝作業系統的系統更新。
  • 裝置使用者無法手動在「設定」中檢查系統更新。

根據任何定義的凍結後,系統會強制執行必要的 60 天緩衝期 ,以避免裝置無限期凍結。記住,系統凍結 更新可能會使裝置無法接收重大更新。

圖 1.為裝置設定兩個凍結期間
Google 日曆顯示一年內的兩個凍結期間,並提供 60 天緩衝區。

您可以針對更新政策設定凍結期間。請注意,您無法在下列情況下設定凍結期間: 設定政策時裝置未處於您設定的任何凍結期間時 適用一般政策行為 (自動、設定期間或延期)。

如何設定凍結期間

您可以在 Android 9 (API 級別 28) 以上版本中設定凍結期間。裝置 擁有者先為系統更新政策設定凍結期間,再設定政策 供裝置使用步驟如下:

  1. 建立新 (或取得目前的) 系統更新政策。
  2. 如要設定政策的凍結期間,請呼叫 setFreezePeriods()
  3. 透過撥打電話的方式,設定裝置的政策和凍結期間 setSystemUpdatePolicy()

由於凍結期間為每年重複,因此 經期值以月份和日期表示。開始日期必須開始時間為 至少 60 天後。以下範例 ,說明如何為現有的系統更新政策設定兩個凍結期間:

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 ...
}

且開始和結束日皆包含在內。如果開始日期較大 就會結束 (例如上例中的 winterSale),凍結 期間也適用於下一年

設定凍結時 並根據以下規定進行 Android 測試:

  • 凍結期間不得超過 90 天。
  • 凍結期間的間隔至少為 60 天。
  • 凍結期間不重疊。
  • 目前沒有重複的凍結期間。

為裝置設定系統更新政策時,Android 會重複這些測試 ,包括裝置目前或過去的凍結期間。

Android 會在發生以下情況時擲回 SystemUpdatePolicy.ValidationFailedException 有一項測試都會失敗

如要取得先前對系統更新政策物件設定的凍結期間清單, 所有已安裝的應用程式皆可呼叫 SystemUpdatePolicy.getFreezePeriods()。下列 範例會呼叫這個方法來記錄裝置的凍結期間:

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());
  }
}

閏年

Android 使用 ISO 8601 行事曆 (又稱為公曆) 計算凍結期間並忽略閏年。也就是說,2 月 29 日 無法識別為有效日期,並視為 2 月 28 日。 因此,2 月 29 日的凍結期間不會列入計算 。

開發和測試

在開發及測試 DPC 系統更新功能時 就需要建立許多凍結期間由於 Android 會檢查 因此你可能無法設定新的凍結期間 而不需要先清除過去的經期記錄。如何清除裝置的凍結狀態 請在 Android Debug Bridge 中執行下列指令 (ADB) 殼層:

adb shell dpm clear-freeze-period-record

如要確認裝置是否處於凍結期間,請查看使用者 系統更新的介面已停用。

Google Play 系統更新 (Mainline)

Google Play 系統更新 (也稱為 Mainline 更新) 是 自動下載,但需要重新啟動裝置才能安裝。這些 更新不會觸發自動重新啟動,而是安裝在 下次使用者、管理員或政策重新啟動時。由系統觸發的重新啟動 更新政策會安裝相關聯的 Google/原始設備製造商 (OEM) 系統更新 下載先前下載的 Google Play 系統更新

您也可以前往 設定 >關於 >Android 版本 >Google Play 系統更新

其他資源

如要進一步瞭解系統更新,請參閱 Android 開放原始碼專案的 OTA 更新說明文件。