ใน Android 9 และต่ำกว่า มีชุดข้อความใน libsuspend
มีหน้าที่เริ่มต้นการระงับระบบ Android 10
มีฟังก์ชันการทำงานที่เทียบเท่าในบริการ Systemการระงับบัญชี HIDL
บริการนี้จะอยู่ในอิมเมจของระบบและให้บริการโดยแพลตฟอร์ม Android
ตรรกะจาก libsuspend
ยังคงเหมือนเดิมเป็นส่วนใหญ่ ยกเว้นพื้นที่ผู้ใช้ทั้งหมด
ที่ขัดขวางการระงับระบบที่จำเป็นต้องติดต่อกับ Systemการระงับบัญชี
ลิขิตและปลดปล่อย
ใน Android 10 บริการ Systemsuspended จะมาแทนที่
libsuspend
นํา libpower
ไปใช้อีกครั้งแล้วเพื่ออาศัย
บริการ Systemsuspended แทน
วันที่ /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;
}
เทรดการดำเนินการ
บริการ Systemsuspended จะติดตามจำนวน Wake Lock ที่ออกด้วย ตัวนับการระงับ ซึ่งมีการดำเนินการ 2 เทรด ได้แก่
- การเรียกใช้ Binder ชุดข้อความหลักจะตอบกลับ
- ชุดข้อความที่ถูกระงับจะควบคุมการระงับของระบบ
เทรดหลัก
เทรดหลักตอบกลับคำขอจากลูกค้าเพื่อจัดสรร Wake Lock ใหม่ การเพิ่ม/ลดตัวนับการระงับ
ระงับชุดข้อความ
เทรดที่ถูกระงับจะดำเนินการต่อไปนี้แบบวนซ้ำ
- อ่านจาก
/sys/power/wakeup_count
- รับ Mutex การดำเนินการนี้จะช่วยให้มั่นใจว่าชุดข้อความที่ระงับจะไม่กระทบกับชุดข้อความ ตัวนับการระงับขณะที่เทรดหลักกำลังพยายาม เพิ่มหรือลดค่าได้ เทรดหลักถูกบล็อก ในการออกหรือนำ Wake Lock เมื่อตัวนับการระงับใช้งานถึง 0 และชุดข้อความที่ระงับกำลังพยายามทำงาน
- รอจนกว่าตัวนับมีค่าเท่ากับ 0
- เขียนค่าที่อ่านจาก
/sys/power /wakeup_count
(จากขั้นตอนที่ 1) ไปยังไฟล์นี้ หากการเขียนล้มเหลว ให้กลับไปที่จุดเริ่มต้นของลูป - เริ่มการระงับระบบโดยเขียน
mem
ถึง/sys/power/state
- ปล่อย Mutex
เมื่อคำขอ Wake Lock แสดงผลสำเร็จแล้ว เทรดที่ระงับจะดำเนินการ ถูกบล็อก
API การระงับระบบ
SystemReach API ประกอบด้วยอินเทอร์เฟซ 2 แบบ มีการใช้อินเทอร์เฟซ HIDL ผ่านกระบวนการแบบเนทีฟเพื่อให้ได้ Wake Lock และใช้อินเทอร์เฟซ AIDL สำหรับ การสื่อสารระหว่าง SystemServer และ Systemการระงับบัญชี
อินเทอร์เฟซ ISystemsuspended 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
ยุติ ไดรเวอร์ Binder และ
บริการ Systemsuspended จะช่วยล้างข้อมูลนี้
อินเทอร์เฟซ IsuspendedControlService AIDL
IHoldControlService มีไว้เพื่อใช้โดย SystemServer เท่านั้น
interface ISuspendCallback {
void notifyWakeup(boolean success);
}
interface ISuspendControlService {
boolean enableAutosuspend();
boolean registerCallback(ISuspendCallback callback);
boolean forceSuspend();
}
การใช้ประโยชน์จาก Android HIDL มีประโยชน์ดังต่อไปนี้
- หากกระบวนการบล็อกการระงับสิ้นสุดลง คุณจะได้รับการแจ้งเตือนเกี่ยวกับระบบการระงับ
- คุณขอให้เทรดที่มีหน้าที่ในการระงับระบบโทรกลับได้