AIDL পরিষেবাগুলি গতিশীলভাবে চালান৷

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

যে পরিষেবাগুলি গতিশীলভাবে চলতে পারে

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

ডাইনামিক শাটডাউন সেই প্রসেসটিকে বন্ধ করে দেয়, যার মধ্যে সার্ভিসটি চলে। যদি একই প্রসেসে একাধিক সার্ভিস থাকে, তবে এই ফিচারের সাথে সামঞ্জস্যপূর্ণ হতে হলে সেগুলোকে অবশ্যই ডাইনামিক হিসেবে রেজিস্টার করতে হবে। এরপর যখন সমস্ত সার্ভিস অব্যবহৃত থাকবে, তখন সেই প্রসেসটি বন্ধ হয়ে যাবে।

একটি সার্ভিসের init.rc ফাইল কনফিগার করুন

কোনো সার্ভিসকে ডাইনামিকভাবে রান করার জন্য, সার্ভিসটির .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