डाइनैमिक तौर पर AIDL सेवाएं चलाना

Android 11 और उसके बाद के वर्शन में, सिस्टम पार्टीशन में चल रही नेटिव AIDL सेवाओं को ज़रूरत के हिसाब से डाइनैमिक तरीके से शुरू और बंद किया जा सकता है. डाइनैमिक सेवाएं, पहली बार अनुरोध किए जाने पर शुरू होती हैं और इस्तेमाल में न होने पर अपने-आप बंद हो जाती हैं.

डाइनैमिक तरीके से चलने वाली सेवाएं

यह सुविधा सिर्फ़ उन नेटिव सेवाओं के लिए उपलब्ध है जिनके लाइफ़साइकल को init और servicemanager कंट्रोल कर सकते हैं. ऐप्लिकेशन पैकेज में मौजूद सेवाओं के लिए, इस सुविधा का इस्तेमाल नहीं किया जा सकता. इसलिए, आपको बाउंड सेवाओं का इस्तेमाल करना चाहिए.

डाइनैमिक शटडाउन, उस प्रोसेस को बंद करके काम करता है जिसमें सेवा चलती है. अगर एक ही प्रोसेस में कई सेवाएं मौजूद हैं, तो इस सुविधा के साथ काम करने के लिए, उन सभी को डाइनैमिक के तौर पर रजिस्टर करना होगा. इसके बाद, जब सभी सेवाओं का इस्तेमाल नहीं किया जाएगा, तब यह प्रोसेस बंद हो जाएगी.

किसी सेवा की init .rc फ़ाइल को कॉन्फ़िगर करना

किसी सेवा को डाइनैमिक तरीके से चलाने के लिए, लीडिंग service <name> <cmd> लाइन के बाद, सेवा की init .rc फ़ाइल में ये विकल्प जोड़ें.

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