خدمة 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. تعليق حلقة الخيط

SystemSuspend API

تتألّف 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 المزايا التالية:

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