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

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

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

यह सुविधा सिर्फ़ उन नेटिव सेवाओं के लिए उपलब्ध है जिनके लाइफ़साइकल को 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