บริการระงับระบบ

ใน 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 ใหม่ การเพิ่ม/ลดตัวนับการระงับ

ระงับชุดข้อความ

เทรดที่ถูกระงับจะดำเนินการต่อไปนี้แบบวนซ้ำ

  1. อ่านจาก /sys/power/wakeup_count
  2. รับ Mutex การดำเนินการนี้จะช่วยให้มั่นใจว่าชุดข้อความที่ระงับจะไม่กระทบกับชุดข้อความ ตัวนับการระงับขณะที่เทรดหลักกำลังพยายาม เพิ่มหรือลดค่าได้ เทรดหลักถูกบล็อก ในการออกหรือนำ Wake Lock เมื่อตัวนับการระงับใช้งานถึง 0 และชุดข้อความที่ระงับกำลังพยายามทำงาน
  3. รอจนกว่าตัวนับมีค่าเท่ากับ 0
  4. เขียนค่าที่อ่านจาก /sys/power /wakeup_count (จากขั้นตอนที่ 1) ไปยังไฟล์นี้ หากการเขียนล้มเหลว ให้กลับไปที่จุดเริ่มต้นของลูป
  5. เริ่มการระงับระบบโดยเขียน mem ถึง /sys/power/state
  6. ปล่อย Mutex

เมื่อคำขอ Wake Lock แสดงผลสำเร็จแล้ว เทรดที่ระงับจะดำเนินการ ถูกบล็อก

วันที่
รูปที่ 1 ระงับการวนซ้ำของชุดข้อความ

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 มีประโยชน์ดังต่อไปนี้

  • หากกระบวนการบล็อกการระงับสิ้นสุดลง คุณจะได้รับการแจ้งเตือนเกี่ยวกับระบบการระงับ
  • คุณขอให้เทรดที่มีหน้าที่ในการระงับระบบโทรกลับได้