ডায়নামিক AIDL পরিষেবা চালানো

Android 11 ও তার পরবর্তী যেকোনও ভার্সনে, সিস্টেম পার্টিশনে রান করা নেটিভ AIDL পরিষেবা প্রয়োজন অনুযায়ী ডাইনামিক পদ্ধতিতে চালু ও বন্ধ করা যেতে পারে। ডায়নামিক পরিষেবা প্রথমবার অনুরোধ করা হলে শুরু হয় এবং ব্যবহার করা বন্ধ হয়ে গেলে অটোমেটিক বন্ধ হয়ে যায়।

ডায়নামিক রান করা যায় এমন পরিষেবা

এই ফিচারটি শুধুমাত্র নেটিভ পরিষেবার জন্য উপলভ্য যার লাইফসাইকেল init এবং servicemanager দ্বারা নিয়ন্ত্রণ করা যেতে পারে। অ্যাপ প্যাকেজের মধ্যে থাকা পরিষেবা কাজ করে না এবং এর পরিবর্তে বাউন্ড পরিষেবা ব্যবহার করা উচিত।

ডায়নামিক শাটডাউন, পরিষেবা যে প্রসেসে চলে সেটি বন্ধ করে কাজ করে। একই প্রসেসে একাধিক পরিষেবা থাকলে, এই ফিচারের সাথে মানানসই হতে সবকটিকেই ডায়নামিক হিসেবে রেজিস্টার করতে হবে। সব পরিষেবা অব্যবহৃত থাকলে সেই প্রসেসটি বন্ধ হয়ে যাবে।

পরিষেবার init .rc ফাইল কনফিগার করা

কোনও পরিষেবা ডায়নামিকভাবে চালাতে, পরিষেবার init .rc ফাইলের প্রথম service <name> <cmd> লাইনের পরে নিম্নলিখিত বিকল্পগুলি যোগ করুন।

interface aidl serviceName
disabled
oneshot

এইসব বিকল্প নিম্নলিখিত কাজগুলি করে:

  • interface aidl serviceName: servicemanager-কে পরিষেবা খুঁজতে অনুমতি দেয়। পরিষেবা একাধিক ইন্টারফেস ব্যবহার করলে, প্রতিটি ইন্টারফেস আলাদা লাইনে ঘোষণা করুন। এইসব নাম servicemanager যা প্রত্যাশা করে ঠিক তাই হতে হবে এবং প্রসেসের নাম থেকে আলাদা হতে পারে।
  • disabled: বুট করার সময় পরিষেবাটি অটোমেটিক চালু হওয়া আটকায়।
  • oneshot: পরিষেবা বন্ধ হয়ে গেলে, প্রতিবার অটোমেটিক রিস্টার্ট হওয়া আটকায়।

আরও তথ্যের জন্য, AOSP-তে Android Init Language Readme দেখুন।

উদাহরণ:

পরিষেবা রেজিস্টার করা

servicemanager-এর মাধ্যমে প্রতিটি পরিষেবা তৈরি ও রেজিস্টার করা হয়। রেজিস্ট্রেশন প্রায়ই main.cpp নামের ফাইলে হয়, তবে এর প্রয়োগ আলাদা হতে পারে। রেজিস্ট্রেশন সাধারণত এইরকম দেখতে হয়:

using android::defaultServiceManager;

defaultServiceManager()->addService(serviceName, service);

রেজিস্ট্রেশন কখনও কখনও BinderService::publish বা BinderService::instantiate দ্বারা অ্যাবস্ট্রাক্ট করা হয়, যা উপরের কোডকে কল করে।

কোনও পরিষেবা ডায়নামিক হিসেবে রেজিস্টার করতে, এর রেজিস্ট্রেশন কোডটি নিচের কোড দিয়ে পরিবর্তন করুন:

#include <binder/LazyServiceRegistrar.h>

using android::binder::LazyServiceRegistrar;

auto lazyRegistrar = LazyServiceRegistrar::getInstance();
lazyRegistrar.registerService(service, serviceName);

servicemanager, LazyServiceRegistrar-এর সাথে যোগাযোগ করে রেফারেন্স কাউন্টের ভিত্তিতে পরিষেবা বন্ধ করে দেয়।

উদাহরণ:

AIDL পরিষেবা ক্লায়েন্ট কনফিগার করুন

পরিষেবা পাওয়া

কোনও লেজি পরিষেবা রিট্রিভ করতে হলে, প্রথমে পরিষেবাটি চালু করতে হবে এবং তারপরে রিট্রিভ করতে হবে। পরিষেবা ম্যানেজারে getService কল করলে পরিষেবা শুরু হবে, তবে সাধারণত, আপনি পরিষেবা উপলভ্য হওয়ার সাথে সাথেই তা পেতে চান এবং waitForService ভেরিয়েন্ট ব্যবহার করা উচিত। এগুলি কীভাবে ব্যবহার করতে হয় সেই বিষয়ে ব্যাকএন্ড-নির্দিষ্ট ডকুমেন্টেশন দেখুন।

পরিষেবা রিলিজ করা

ডায়নামিক শাটডাউন রেফারেন্স কাউন্টিংয়ের উপর ভিত্তি করে হয়, তাই ব্যবহার না করার সময় ক্লায়েন্টকে অবশ্যই পরিষেবা হোল্ড করে রাখা উচিত নয়।

উদাহরণ:

শাটডাউন করার সুবিধা সাময়িকভাবে বন্ধ করা

আপনি যদি চান যে কোনও পরিষেবা নির্দিষ্ট কিছু কাজ সম্পূর্ণ না হওয়া পর্যন্ত স্বাধীনভাবে চলুক এবং তারপরে ডায়নামিক আচরণে পরিবর্তিত হোক, তাহলে আপনি LazyServiceRegistrar::forcePersist ব্যবহার করে ডায়নামিক শাটডাউন টগল করে চালু ও বন্ধ করতে পারেন। যদি এটি সার্ভার সাইড থেকে কল করা হয়, তাহলে এটি registerService-এর আগে কল করতে হবে।

উদাহরণ: apexservice