本開發人員指南將說明裝置政策控制器 (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 天緩衝期 ,以避免裝置無限期凍結。記住,系統凍結 更新可能會使裝置無法接收重大更新。
您可以針對更新政策設定凍結期間。請注意,您無法在下列情況下設定凍結期間: 設定政策時裝置未處於您設定的任何凍結期間時 適用一般政策行為 (自動、設定期間或延期)。
如何設定凍結期間
您可以在 Android 9 (API 級別 28) 以上版本中設定凍結期間。裝置 擁有者先為系統更新政策設定凍結期間,再設定政策 供裝置使用步驟如下:
- 建立新 (或取得目前的) 系統更新政策。
- 如要設定政策的凍結期間,請呼叫
setFreezePeriods()
。 - 透過撥打電話的方式,設定裝置的政策和凍結期間
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 更新說明文件。