एआईडीएल भाषा

AIDL भाषा, Java भाषा पर आधारित है. फ़ाइलों में इंटरफ़ेस अनुबंध और इस अनुबंध में इस्तेमाल किए गए अलग-अलग डेटा टाइप और कॉन्स्टेंट के बारे में बताया जाता है.

पैकेज

हर AIDL फ़ाइल की शुरुआत एक वैकल्पिक पैकेज से होती है. यह पैकेज, अलग-अलग बैकएंड में मौजूद पैकेज के नामों से मेल खाता है. पैकेज का एलान इस तरह दिखता है:

    package my.package;

Java की तरह, AIDL फ़ाइलों को फ़ोल्डर स्ट्रक्चर में होना चाहिए, जो उनके पैकेज से मेल खाता हो. पैकेज my.package वाली फ़ाइलें, फ़ोल्डर my/package/ में होनी चाहिए.

प्रकार

AIDL फ़ाइलों में, कई ऐसी जगहें होती हैं जहां टाइप तय किए जा सकते हैं. AIDL भाषा में इस्तेमाल किए जा सकने वाले टाइप की सटीक सूची देखने के लिए, AIDL बैकएंड के टाइप देखें.

एनोटेशन

AIDL भाषा के कई हिस्सों में एनोटेशन इस्तेमाल किए जा सकते हैं. एनोटेशन की सूची और उन्हें कहां लागू किया जा सकता है, इसके लिए AIDL एनोटेशन देखें.

इंपोर्ट

अन्य इंटरफ़ेस में तय किए गए टाइप का इस्तेमाल करने के लिए, आपको सबसे पहले बिल्ड सिस्टम में डिपेंडेंसी जोड़नी होंगी. cc_* और java_* Soong मॉड्यूल में, जहां Android प्लैटफ़ॉर्म बिल्ड में srcs के तहत सीधे तौर पर .aidl फ़ाइलों का इस्तेमाल किया जाता है वहां aidl: { include_dirs: ... } फ़ील्ड का इस्तेमाल करके डायरेक्ट्री जोड़ी जा सकती हैं. aidl_interface का इस्तेमाल करके इंपोर्ट करने के बारे में जानने के लिए, यहां जाएं.

इंपोर्ट कुछ इस तरह दिखता है:

    import some.package.Foo;  // explicit import

एक ही पैकेज में किसी टाइप को इंपोर्ट करते समय, पैकेज को हटाया जा सकता है. हालांकि, पैकेज को शामिल न करने पर, इंपोर्ट करने से जुड़ी गड़बड़ियां हो सकती हैं. ऐसा तब होता है, जब टाइप को पैकेज के बिना तय किया जाता है और उन्हें ग्लोबल नेमस्पेस में रखा जाता है. आम तौर पर, सभी टाइप को नेमस्पेस में रखा जाना चाहिए:

    import Foo;  // same as my.package.Foo

टाइप तय करना

AIDL फ़ाइलें आम तौर पर उन टाइप को तय करती हैं जिनका इस्तेमाल इंटरफ़ेस के तौर पर किया जाता है.

इंटरफ़ेस

यहां AIDL इंटरफ़ेस का एक उदाहरण दिया गया है:

    interface ITeleport {
        // Location defined elsewhere
        void teleport(Location baz, float speed);
        String getName();

        // ITeleportCallback defined elsewhere
        void methodWithCallback(ITeleportCallback callback);

        // ITeleportSession defined elsewhere
        ITeleportSession getASubInterface();
    }

इंटरफ़ेस, ऑब्जेक्ट को कई तरीकों से तय करता है. तरीके oneway (oneway void doFoo()) या सिंक्रोनस हो सकते हैं. अगर किसी इंटरफ़ेस को oneway (oneway interface ITeleport {...}) के तौर पर तय किया जाता है, तो उसके सभी तरीके अपने-आप oneway हो जाते हैं. Oneway तरीके, एसिंक्रोनस तरीके से भेजे जाते हैं और कोई नतीजा नहीं देते. एक ही थ्रेड से एक ही बाइंडर में जाने वाले एकतरफ़ा तरीके भी क्रम से लागू होते हैं. हालांकि, ये अलग-अलग थ्रेड पर लागू हो सकते हैं. थ्रेड सेट अप करने के तरीके के बारे में जानने के लिए, AIDL बैकएंड थ्रेड मैनेजमेंट देखें.

Binder, कई इंटरफ़ेस और Binder ऑब्जेक्ट को Binder इंटरफ़ेस के ज़रिए शेयर करने की अनुमति देता है. AIDL इंटरफ़ेस, अक्सर तरीके के कॉल के हिस्से के तौर पर कॉलबैक का इस्तेमाल करते हैं. जैसे, पिछले उदाहरण में ITeleportCallback के साथ. एक ही तरीके के कॉल या अलग-अलग तरीकों के कॉल के बीच, कॉलबैक ऑब्जेक्ट का फिर से इस्तेमाल किया जा सकता है. इंटरफ़ेस टाइप का एक और सामान्य इस्तेमाल, सब-इंटरफ़ेस या सेशन ऑब्जेक्ट के लिए होता है. इन्हें पिछले उदाहरण में ITeleportSession जैसे तरीकों से वापस लाया जाता है. नेस्टिंग की इस सुविधा की मदद से, अलग-अलग एपीआई को एपीआई या रनटाइम की स्थिति के आधार पर इनकैप्सुलेट किया जा सकता है. उदाहरण के लिए, कोई सेशन किसी संसाधन के मालिकाना हक को दिखा सकता है. जब इंटरफ़ेस को कई बार पास किया जाता है या उन्हें उस क्लाइंट या सर्वर को वापस कर दिया जाता है जहां से वे आए थे, तो वे हमेशा अंडरलाइंग बाइंडर ऑब्जेक्ट की पॉइंटर समानता को बनाए रखते हैं.

मेथड में शून्य या उससे ज़्यादा तर्क हो सकते हैं. तरीकों के लिए आर्ग्युमेंट, in, out या inout हो सकते हैं. इस बदलाव का, आर्ग्युमेंट के टाइप पर क्या असर पड़ता है, इस बारे में जानने के लिए AIDL बैकएंड की दिशा देखें.

पार्सल किए जा सकने वाले ऑब्जेक्ट

बैकएंड के हिसाब से पार्सल किए जा सकने वाले ऑब्जेक्ट बनाने के तरीके के बारे में जानने के लिए, AIDL बैकएंड के कस्टम पार्सल किए जा सकने वाले ऑब्जेक्ट लेख पढ़ें.

Android 10 और इसके बाद के वर्शन में, पार्सल किए जा सकने वाले ऑब्जेक्ट की परिभाषाओं को सीधे तौर पर एआईडीएल में इस्तेमाल किया जा सकता है. इस तरह के पार्सलेबल को स्ट्रक्चर्ड पार्सलेबल कहा जाता है. स्ट्रक्चर्ड और स्टेबल AIDL, AIDL कंपाइलर और हमारे बिल्ड सिस्टम में कैसे काम करते हैं, इस बारे में ज़्यादा जानने के लिए स्ट्रक्चर्ड बनाम स्टेबल AIDL देखें.

उदाहरण के लिए:

    package my.package;

    import my.package.Boo;

    parcelable Baz {
        @utf8InCpp String name = "baz";
        Boo boo;
    }

यूनियन

Android 12 और इसके बाद के वर्शन में, टैग किए गए यूनियन के एलान की सुविधा काम करती है. उदाहरण के लिए:

    package my.package;

    import my.package.FooSettings;
    import my.package.BarSettings;

    union Settings {
        FooSettings fooSettings;
        BarSettings barSettings;
        @utf8InCpp String str;
        int number;
    }

बैकएंड के बारे में ज़्यादा जानकारी के लिए, AIDL Backends Unions देखें.

Enums

Android 11 और इसके बाद के वर्शन में, enum के बारे में जानकारी देने की सुविधा काम करती है. उदाहरण के लिए:

    package my.package;

    enum Boo {
        A = 1 * 4,
        B = 3,
    }

नेस्ट किए गए टाइप के एलान

Android 13 और इसके बाद के वर्शन में, नेस्ट किए गए टाइप के एलान की सुविधा काम करती है. उदाहरण के लिए:

    package my.package;

    import my.package.Baz;

    interface IFoo {
        void doFoo(Baz.Nested nested);  // defined in my/package/Baz.aidl
        void doBar(Bar bar);            // defined below

        parcelable Bar { ... }          // nested type definition
    }

कॉन्स्टेंट

कस्टम AIDL इंटरफ़ेस, पार्सल किए जा सकने वाले ऑब्जेक्ट, और यूनियन में पूर्णांक और स्ट्रिंग कॉन्स्टेंट भी शामिल हो सकते हैं. जैसे:

    const @utf8InCpp String HAPPY = ":)";
    const String SAD = ":(";
    const byte BYTE_ME = 1;
    const int ANSWER = 6 * 7;

कॉन्स्टेंट एक्सप्रेशन

AIDL कॉन्स्टेंट, ऐरे के साइज़, और एन्यूमरेटर को कॉन्स्टेंट एक्सप्रेशन का इस्तेमाल करके तय किया जा सकता है. एक्सप्रेशन में, कोष्ठकों का इस्तेमाल करके ऑपरेशनों को नेस्ट किया जा सकता है. कॉन्स्टेंट एक्सप्रेशन वैल्यू का इस्तेमाल, इंटिग्रल या फ़्लोट वैल्यू के साथ किया जा सकता है.

true और false लिटरल, बूलियन वैल्यू दिखाते हैं. . वाली वैल्यू, लेकिन बिना प्रत्यय वाली वैल्यू, जैसे कि 3.8, को दो वैल्यू माना जाता है. फ़्लोट वैल्यू में f सफ़िक्स होता है, जैसे कि 2.4f. l या L सफ़िक्स वाली पूर्णांक वैल्यू, 64-बिट की लंबी वैल्यू को दिखाती है. ऐसा न होने पर, इंटिग्रल वैल्यू को 8-बिट (बाइट), 32-बिट (इंट), और 64-बिट (लॉन्ग) के बीच सबसे छोटी वैल्यू-प्रिज़र्विंग साइंड टाइप मिलता है. इसलिए, 256 को int माना जाता है. हालांकि, 255 + 1, byte 0 से ज़्यादा है. 0x3 जैसी हेक्स वैल्यू को सबसे पहले, 32-बिट और 64-बिट के बीच की सबसे छोटी वैल्यू-प्रिज़र्विंग अनसाइंड टाइप के तौर पर समझा जाता है. इसके बाद, इसे अनसाइंड वैल्यू के तौर पर फिर से समझा जाता है. इसलिए, 0xffffffff की वैल्यू int है -1. Android 13 से, byte वैल्यू को दिखाने के लिए, u8 सफ़िक्स को 3u8 जैसे कॉन्स्टेंट में जोड़ा जा सकता है. यह प्रत्यय इसलिए ज़रूरी है, ताकि 0xffu8 * 3 जैसे कैलकुलेशन को -3 के तौर पर समझा जा सके, जिसका टाइप byte है. वहीं, 0xff * 3 को 765 के तौर पर समझा जा सके, जिसका टाइप int है.

इस्तेमाल किए जा सकने वाले ऑपरेटर में C++ और Java सिमैंटिक होते हैं. सबसे कम से लेकर सबसे ज़्यादा प्राथमिकता के क्रम में, बाइनरी ऑपरेटर || && | ^ & == != < > <= >= << >> + - * / % हैं. यूनरी ऑपरेटर + - ! ~ हैं.