延遲裝置更新
高階應用程式可以暫時延後對 Azure 球體作業系統和應用程式映射的更新,以防止更新中斷重要處理。 例如,廚房設備中的 Azure 球體裝置可能會在使用期間延遲更新。 若要有機會延遲更新,應用程式會註冊更新通知。 作業系統下載更新之後,它會通知應用程式,以取得有關更新和要求延遲的詳細資料。
順 延更新 範例示範如何使用事件迴圈和系統事件來延遲更新。
支援 RTApps (即時應用程式) 無法收到更新通知或要求延遲。 高階應用程式負責管理裝置上 RTApps 的更新延遲。
延後要求
延遲更新的應用程式必須包含適當的頁首檔案,並將延遲設定新增至 應用程式資訊清單。
頁首檔案
在專案中包含活動開啟和 sysevent 標頭:
#include <applibs/eventloop.h>
#include <applibs/sysevent.h>
應用程式資訊清單設定
若要收到軟體更新事件的通知,並有機會延遲這類更新,應用程式 資訊清單 檔中包含兩種功能:
- SystemEventNotifications
- SoftwareUpdateDeferral
將 SystemEventNotifications 欄位設定為 true
在 app_manifest.json 檔案中,以接收系統更新事件的通知。 應用程式也必須註冊事件通知,如 通知機制中所述。 設定 SoftwareUpdateDeferral 以 true
讓應用程式延遲並繼續更新。
下列顯示啟用通知和延遲所需的app_manifest.json 設定:
"Capabilities": {
"SystemEventNotifications" : true,
"SoftwareUpdateDeferral" : true
}
通知機制
Azure 球體支援透過事件通知和事件迴圈機制更新延遲。 應用程式會建立一個 EventLoop
單線程物件,讓應用程式收到擱置中事件的通知。
若要接收通知,應用程式會撥打 SysEvent_RegisterForEventNotifications,傳遞下列參數:
- 指向活動迴圈的指標
- 指定
eventBitmask
應用程式要求通知的事件 - 指向應用程式定義之回撥函數的指標
- 傳遞至回撥的選用操作指標
每個執行緒只能使用一個 EventLoop
物件 SysEvent_RegisterForEventNotifications 。 第二次使用不同 EventLoop
物件SysEvent_RegisterForEventNotifications的呼叫將會失敗。
註冊之後,應用程式會呼叫 EventLoop_Run,當事件變更狀態時,會叫用回撥功能。 回撥函數會收到 SysEvent_Events 值,可識別事件種類。 回電則會回電 SysEvent_Info_GetUpdateData ,以瞭解事件是否為作業系統或應用程式更新,以及更新可以延遲多久。 應用程式接著可以決定如何處理事件通知。
Azure 球體可能會針對每個更新事件傳送數個狀態通知:
地位 | 描述 |
---|---|
SysEvent_Status_Pending | 更新事件會發生 10 秒警告,並有機會延遲。 |
SysEvent_Status_Final | 更新事件會發生 10 秒警告,但不會延遲。 |
SysEvent_Status_Deferred | 先前擱置的事件已延遲,稍後會發生。 |
SysEvent_Status_Complete | 軟體更新程式已完成。 此事件通知只會針對應用程式更新傳送。 |
應用程式只有在收到 SysEvent_Status_Pending 通知後,才能要求延遲。 若要允許立即進行更新,應用程式可以忽略通知。
若要延後更新,應用程式會呼叫 SysEvent_DeferEvent,傳遞延遲更新的分鐘數。 如果是作業系統更新,延遲時間上限為 1440 分鐘, (24 小時) 。 對於應用程式更新,延遲期間上限為 10,020 分鐘, (167 小時) 。
應用程式 可以致電SysEvent_ResumeEvent,以暫時結束延遲的更新。 對於應用程式或作業系統更新,成功呼叫 SysEvent_ResumeEvent 重新開機通知程式,因此會傳送新的 SysEvent_Status_Pending 通知。 在收到此通知之前,應用程式不應該再撥 SysEvent_DeferEvent 。
當應用程式收到 SysEvent_Status_Final 通知時,應該準備從 Azure 球體 OS 接收 SIGTERM 訊號。 收到 SIGTERM 訊號時,應用程式應該會執行最終清理並結束。 應用程式不應該在收到 SIGTERM 之前結束;否則,系統可能會在傳送 SIGTERM 之前重新開機。 對於作業系統更新,應用程式應該在裝置重新開機之前執行任何需要的清理動作。 對於應用程式更新,高階應用程式應該先執行任何必要動作,再重新開機裝置上的任何其他應用程式。 代理程式更新目前並未指定要更新的應用程式。
當不再需要通知時,應用程式應呼叫 SysEvent_UnregisterForEventNotifications ,然後 EventLoop_Close 放開配置給事件迴圈物件的記憶體。 請注意,在取消註冊所有活動通知之後,應用程式就可以使用新的 EventLoop
物件。