خدمة SystemComment

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

libsuspend وlibpower

في Android 10، يتم استبدال خدمة SystemComment libsuspend تمت إعادة تنفيذ "libpower" للاعتماد على خدمة SystemComment بدلاً من /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;
}

سلاسل المحادثات التنفيذ

تتتبع الخدمة SystemComment عدد عمليات قفل التنشيط التي تم إصدارها باستخدام عدّاد التعليق. تتضمن سلسلتَي التنفيذ:

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

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

تجيب سلسلة التعليمات الرئيسية عن طلبات العملاء لتخصيص عمليات قفل تنشيط جديدة، زيادة/تقليل عدّاد التعليق.

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

تنفذ سلسلة التعليق ما يلي في تكرار حلقي:

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

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

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

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

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

واجهة ISystemComment 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، تنظف خدمة SystemComment.

واجهة ICommentControlService AIDL

تم تصميم ICommentControlService للاستخدام بواسطة SystemServer فقط.


interface ISuspendCallback {
     void notifyWakeup(boolean success);
}

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

توفّر لك الاستفادة من Android HIDL المزايا التالية:

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