সিস্টেম সাসপেন্ড পরিষেবা

অ্যান্ড্রয়েড 9 এবং তার নিচের সংস্করণে লিবসাসপেন্ডে একটি থ্রেড রয়েছে যা সিস্টেম সাসপেন্ড শুরু করার জন্য দায়ী। Android 10 একটি সিস্টেম সাসপেন্ড HIDL পরিষেবাতে একটি সমতুল্য কার্যকারিতা প্রবর্তন করে৷ এই পরিষেবাটি সিস্টেম ইমেজে অবস্থিত এবং Android প্ল্যাটফর্ম দ্বারা পরিবেশিত হয়। libsuspend থেকে লজিক অনেকাংশে একই থাকে, সিস্টেম সাসপেন্ড ব্লক করার প্রতিটি ইউজারস্পেস প্রক্রিয়া ছাড়া SystemSuspend-এর সাথে যোগাযোগ করতে হবে।

libsuspend এবং libpower

Android 10-এ, SystemSuspend পরিষেবা libsuspend প্রতিস্থাপন করে। C API পরিবর্তন না করে /sys/ power /wake[un]lock এর পরিবর্তে SystemSuspend পরিষেবার উপর নির্ভর করার জন্য libpower পুনরায় প্রয়োগ করা হয়েছে।

এই সিউডোকোড দেখায় কিভাবে 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 পরিষেবা সাসপেন্ড কাউন্টার দিয়ে জারি করা ওয়েক লকগুলির সংখ্যার উপর নজর রাখে। এটি কার্যকর করার দুটি থ্রেড আছে:

  • প্রধান থ্রেড বাইন্ডার কলের উত্তর দেয়।
  • সাসপেন্ড থ্রেড কন্ট্রোল সিস্টেম সাসপেন্ড।

প্রধান থ্রেড

মূল থ্রেডটি নতুন ওয়েক লক বরাদ্দ করার জন্য ক্লায়েন্টদের অনুরোধের উত্তর দেয়, সাসপেন্ড কাউন্টার বৃদ্ধি/কমানোর জন্য।

থ্রেড স্থগিত

সাসপেন্ড থ্রেড একটি লুপে নিম্নলিখিত কাজ করে:

  1. /sys/ power /wakeup_count থেকে পড়ুন।
  2. মিউটেক্স অর্জন করুন। এটি নিশ্চিত করে যে সাসপেন্ড থ্রেডটি সাসপেন্ড কাউন্টারটিকে স্পর্শ করে না যখন প্রধান থ্রেড এটিকে বৃদ্ধি বা হ্রাস করার চেষ্টা করছে। যখন সাসপেন্ড কাউন্টারটি শূন্যে পৌঁছেছে এবং সাসপেন্ড থ্রেডটি চালানোর চেষ্টা করছে তখন মূল থ্রেডটি ওয়েক লকগুলি ইস্যু করা বা অপসারণ করার সময় অবরুদ্ধ করা হয়েছে।
  3. কাউন্টারটি শূন্যের সমান হওয়া পর্যন্ত অপেক্ষা করুন।
  4. এই ফাইলটিতে /sys/ power /wakeup_count (ধাপ 1 থেকে) থেকে পড়া মানটি লিখুন। লিখতে ব্যর্থ হলে, লুপের শুরুতে ফিরে যান
  5. /sys/power/ statemem লিখে সিস্টেম সাসপেন্ড শুরু করুন।
  6. মিউটেক্স ছেড়ে দিন।

যখন একটি ওয়েক লকের জন্য একটি অনুরোধ সফলভাবে ফিরে আসে, তখন সাসপেন্ড থ্রেডটি ব্লক করা হয়।

চিত্র 1. থ্রেড লুপ সাসপেন্ড করুন

সিস্টেম সাসপেন্ড এপিআই

SystemSuspend API দুটি ইন্টারফেস নিয়ে গঠিত। এইচআইডিএল ইন্টারফেসটি নেটিভ প্রসেস দ্বারা ওয়েক লকগুলি অর্জন করতে ব্যবহৃত হয় এবং এআইডিএল ইন্টারফেসটি সিস্টেম সার্ভার এবং সিস্টেম সাসপেন্ডের মধ্যে যোগাযোগের জন্য ব্যবহৃত হয়।

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 ইন্সট্যান্স ধারণ করা একটি ক্লায়েন্ট বন্ধ হয়ে যায়, বাইন্ডার ড্রাইভার এবং SystemSuspend পরিষেবা এটি পরিষ্কার করে।

ISuspendControlService AIDL ইন্টারফেস

ISuspendControlService শুধুমাত্র SystemServer দ্বারা ব্যবহার করার উদ্দেশ্যে করা হয়েছে৷


interface ISuspendCallback {
     void notifyWakeup(boolean success);
}

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

অ্যান্ড্রয়েড এইচআইডিএল ব্যবহার করা নিম্নলিখিত সুবিধাগুলি অফার করে:

  • সাসপেন্ড-ব্লকিং প্রক্রিয়া মারা গেলে, SystemSuspend সূচিত করা যেতে পারে।
  • সিস্টেম সাসপেন্ডের জন্য দায়ী থ্রেডকে কলব্যাক দেওয়া যেতে পারে।