Systemनिलंबित सेवा

Android 9 और उससे पहले के वर्शन में libनिलंबित में एक थ्रेड है यह प्रोसेस, सिस्टम को निलंबित करने की प्रोसेस शुरू करने के लिए ज़िम्मेदार होगी. Android 10 के लिए Systemनिलंबित HIDL सेवा में एक समान फ़ंक्शन की शुरुआत करता है. यह सेवा, सिस्टम इमेज में मौजूद है और Android प्लैटफ़ॉर्म से मिलती है. हर यूज़रस्पेस को छोड़कर, libsuspend का लॉजिक काफ़ी हद तक एक जैसा रहता है सिस्टम सस्पेंड के साथ संपर्क करने के लिए, प्रोसेस को ब्लॉक करना ज़रूरी है.

लिबसस्पेंड और लिबपावर

Android 10 में, Systemनिलंबित सेवा को libsuspend. इन बातों पर भरोसा करने के लिए, libpower को फिर से लागू किया गया इसके बजाय Systemनिलंबित सेवा /sys/power/wake[un]lock इस्तेमाल किया जा सकता है.

यह स्यूडोकोड, 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;
}

एक्ज़ीक्यूशन थ्रेड

सिस्टम सस्पेंड सेवा, जारी किए गए वेक लॉक की संख्या पर नज़र रखती है निलंबन काउंटर. इसमें एक्ज़ीक्यूशन के दो थ्रेड होते हैं:

  • मुख्य थ्रेड में बाइंडर कॉल का जवाब दिया जाता है.
  • सस्पेंड थ्रेड कंट्रोल सिस्टम सस्पेंड.

मुख्य थ्रेड

मुख्य थ्रेड, नए वेक लॉक लागू करने के लिए क्लाइंट के अनुरोधों का जवाब देती है, निलंबन काउंटर को बढ़ाना/कम करना.

थ्रेड निलंबित करें

सस्पेंड थ्रेड एक लूप में ये काम करता है:

  1. /sys/power/wakeup_count से पढ़ा गया.
  2. म्यूटेक्स पाएं. इससे यह पक्का होता है कि निलंबित थ्रेड न छुए मुख्य थ्रेड की कोशिश करते समय निलंबन काउंटर ज़्यादा या कम कर सकते हैं. मुख्य थ्रेड को ब्लॉक किया गया है सस्पेंड काउंटर के शून्य हो जाने पर वेक लॉक जारी करने या हटाने पर और सस्पेंड थ्रेड चलने की कोशिश कर रहा है.
  3. काउंटर के शून्य के बराबर होने तक इंतज़ार करें.
  4. इस फ़ाइल में, /sys/power /wakeup_count (पहले चरण से) से ली गई वैल्यू लिखें. अगर लिखा गया जवाब काम नहीं करता, तो लूप की शुरुआत में वापस जाएं
  5. इस ईमेल पते पर mem लिखकर, सिस्टम को निलंबित करने की प्रक्रिया शुरू करें /sys/power/state.
  6. म्यूटेक्स को छोड़ दें.

जब वेक लॉक का अनुरोध वापस आता है, तो निलंबित थ्रेड ब्लॉक किया गया.

पहली इमेज. थ्रेड लूप को निलंबित करना

सिस्टम सस्पेंड एपीआई

Systemनिलंबित API में दो इंटरफ़ेस होते हैं. HIDL इंटरफ़ेस का इस्तेमाल किया जाता है वेक लॉक को हासिल करने के लिए नेटिव प्रोसेस से और एआईडीएल इंटरफ़ेस का इस्तेमाल SystemServer और System Success के बीच कम्यूनिकेशन.

ISystemनिलंबित HIDL इंटरफ़ेस


enum WakeLockType : uint32_t {
    PARTIAL,
    FULL
};

interface IWakeLock {
    oneway release();
};

interface ISystemSuspend {
    acquireWakeLock(WakeLockType type, string debugName)
        generates (IWakeLock lock);
};

वेक लॉक का अनुरोध करने वाले हर क्लाइंट को एक यूनीक वैल्यू मिलती है IWakeLock इंस्टेंस. यह इससे अलग है /sys/power/wake_lock, जो कई क्लाइंट को उसी नाम से वेक लॉक का इस्तेमाल करना होगा. अगर क्लाइंट ने हाथ में IWakeLock इंस्टेंस खत्म हो जाता है, बाइंडर ड्राइवर और Systemनिलंबित सेवा इसे साफ़ करती है.

IनिलंबितControlService AIDL इंटरफ़ेस

IनिलंबितControlService का इस्तेमाल सिर्फ़ SystemServer के लिए किया गया है.


interface ISuspendCallback {
     void notifyWakeup(boolean success);
}

interface ISuspendControlService {
    boolean enableAutosuspend();
    boolean registerCallback(ISuspendCallback callback);
    boolean forceSuspend();
}

Android HIDL का इस्तेमाल करने पर ये फ़ायदे मिलते हैं:

  • निलंबित करने की किसी प्रोसेस के बंद होने पर, Systemनिलंबित को सूचना दी जा सकती है.
  • सिस्टम निलंबित होने के लिए ज़िम्मेदार थ्रेड को कॉलबैक किया जा सकता है.