خدمة SystemComment

في الإصدار 9 من نظام Android والإصدارات الأقدم، تتوفّر سلسلة محادثات في libsuspend مسؤولة عن بدء تعليق النظام. يقدّم نظام التشغيل Android 10 وظيفة مماثلة في خدمة SystemSuspend HIDL. تتوفّر هذه الخدمة في صورة النظام وتقدّمها منصة Android. يظل المنطق من libsuspend كما هو إلى حد كبير، باستثناء أنّ كل عملية في مساحة المستخدم تحظر تعليق النظام يجب أن تتواصل مع SystemSuspend.

libsuspend وlibpower

في Android 10، تحلّ خدمة SystemSuspend محل libsuspend. تمت إعادة تنفيذ libpower للاعتماد على خدمة SystemSuspend بدلاً من /sys/power/wake[un]lock بدون تغيير واجهة برمجة التطبيقات C.

يوضّح هذا الرمز البرمجي الاصطناعي كيفية تنفيذ 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;
}

سلاسل تنفيذ

تتتبّع خدمة SystemSuspend عدد عمليات قفل الاستيقاظ التي تم إصدارها باستخدام عداد تعليق. يحتوي على سلسلة تنفيذَين:

  • تجيب سلسلة التعليمات الرئيسية على طلبات Binder.
  • يشير هذا المصطلح إلى تعليق نظام عناصر التحكّم في سلسلة المحادثات suspend (التعليق).

سلسلة التعليمات الرئيسية

يردّ الخيط الرئيسي على طلبات العملاء لتخصيص عمليات قفل جديدة للتنشيط، ويؤدي ذلك إلى زيادة أو خفض عدد عمليات التعليق.

تعليق سلسلة المحادثات

ينفِّذ مؤشر التوقّف المُعلَّق ما يلي في حلقة:

  1. يمكنك الاطّلاع على /sys/power/wakeup_count.
  2. الحصول على كائن المزامنة. يضمن ذلك أنّ سلسلة محادثات التعليق لا تلمس عدّاد التعليق بينما تحاول سلسلة التعليمات الرئيسية زيادته أو تقليله. يتم حظر سلسلة التعليمات الرئيسية عند إصدار أو إزالة أقفال الاستيقاظ عندما يصل عداد التعليق إلى القيمة صفر ويحاول تنفيذ سلسلة التعليمات التعليق.
  3. انتظِر إلى أن يساوي العدّاد صفرًا.
  4. اكتب القيمة المقروءة من /sys/power /wakeup_count (من الخطوة 1) في هذا الملف. إذا فشلت الكتابة، ارجع إلى بداية التكرار الحلقي.
  5. ابدأ تعليق النظام عن طريق كتابة mem إلى /sys/power/state.
  6. ارفع قفل المَعلمة.

عند إعادة طلب قفل تنشيط، يتم حظر سلسلة محادثات التعليق.

الشكل 1. تعليق حلقة سلسلة المحادثات

واجهة برمجة التطبيقات SystemComment

تتألّف SystemSuspend API من واجهتَين. يتم استخدام واجهة HIDL من خلال العمليات الأصلية للحصول على عمليات قفل الاستيقاظ، ويتم استخدام واجهة AIDL للتواصل بين SystemServer وSystemSuspend.

واجهة ISystemSuspend 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، ينظّف برنامج تشغيل الربط وخدمة SystemSuspend هذا المثيل.

واجهة ISuspendControlService AIDL

إنّ فئة ISuspendControlService مخصّصة لاستخدام SystemServer فقط.


interface ISuspendCallback {
     void notifyWakeup(boolean success);
}

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

توفّر واجهة HIDL لنظام التشغيل Android المزايا التالية:

  • في حال انتهاء عمل عملية حظر التعليق، يمكن إرسال إشعار SystemComment.
  • يمكن منح سلسلة المحادثات المسؤولة عن تعليق النظام طلبًا للرجوع.