在 Android 9 以下版本中,libsuspend 有一個執行緒
啟動系統暫停作業Android 10
在系統暫停 HIDL 服務中引入同等功能。
這項服務位於系統映像檔中,由 Android 平台提供。
除了每個使用者空間以外,來自 libsuspend
的邏輯大致相同
封鎖系統暫停程序的程序需要與系統暫停通訊。
Libsuspend 和 libpower
在 Android 10 中,「SystemSuspend」服務會取代
libsuspend
。libpower
已重新實作,以依賴
系統暫停服務,而非
/sys/power/wake[un]lock
不必變更 C API
這個虛擬程式碼說明如何實作 acquire_wake_lock
和 release_wake_lock
。
static std::unordered_map<std::string, sp<IWakeLock>> gWakeLockMap;
int acquire_wake_lock(int, const char* id) {
...
if (!gWakeLockMap[id]) {
gWakeLockMap[id] = suspendService->acquireWakeLock(WakeLockType::PARTIAL, id);
}
...
return 0;
}
int release_wake_lock(const char* id) {
...
if (gWakeLockMap[id]) {
auto ret = gWakeLockMap[id]->release();
gWakeLockMap[id].clear();
return 0;
}
...
return -1;
}
執行執行緒
「系統暫停」服務會追蹤使用者透過 暫停計數器它有兩個執行緒:
- main 執行緒會回應繫結器呼叫。
- 暫停執行緒控制系統暫停作業。
主要執行緒
主執行緒會回應來自用戶端的要求,以便分配新的 Wake Lock, 增加/減少暫停計數器。
暫停討論串
暫停執行緒會在迴圈中執行下列作業:
- 讀取來源:
/sys/power/wakeup_count
。 - 取得互斥鎖。確保暫停執行緒不會觸碰 當 main 執行緒嘗試嘗試 這時就會增加或減少main 執行緒遭到封鎖 在暫停計數器到達零時發出或移除 Wake Lock 且 suspend 執行緒正在嘗試執行。
- 等待計數器等於零。
- 將
/sys/power /wakeup_count
中 (從步驟 1) 讀取的值寫入這個檔案。 如果寫入失敗,請返回迴圈的開頭 - 將
mem
寫入至/sys/power/state
。 - 放開互斥鎖。
成功傳回 Wake Lock 的要求時,暫停執行緒會 已封鎖。
系統暫停 API
SystemSuspend API 由兩個介面組成。系統會使用 HIDL 介面 並由原生程序取得 Wake Lock,而 AIDL 介面則用於 SystemServer 與 SystemSuspend 之間的通訊。
ISystem 暫停 HIDL 介面
enum WakeLockType : uint32_t {
PARTIAL,
FULL
};
interface IWakeLock {
oneway release();
};
interface ISystemSuspend {
acquireWakeLock(WakeLockType type, string debugName)
generates (IWakeLock lock);
};
每個要求 Wake Lock 的用戶端都會獲得
IWakeLock
執行個體。與
/sys/power/wake_lock
,可讓您
用戶端,以使用相同的 Wake Lock。如果用戶端持有
IWakeLock
執行個體會終止,繫結器驅動程式和
「系統停權」服務會將其清理乾淨。
ISuspendControlService AIDL 介面
ISuspendControlService 僅供 SystemServer 使用。
interface ISuspendCallback {
void notifyWakeup(boolean success);
}
interface ISuspendControlService {
boolean enableAutosuspend();
boolean registerCallback(ISuspendCallback callback);
boolean forceSuspend();
}
運用 Android HIDL 具備下列優點:
- 如果暫停封鎖程序中斷,可通知系統停權。
- 負責處理系統暫停的執行緒可以給予回呼。