एआईडीएल भाषा

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

पैकेज

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

    package my.package;

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

प्रकार

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

एनोटेशन

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

इंपोर्ट

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

इंपोर्ट कुछ ऐसा दिखेगा:

    import some.package.Foo;  // explicit import

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

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

टाइप तय करें

आम तौर पर, एआईडीएल फ़ाइलें इंटरफ़ेस के तौर पर इस्तेमाल होने वाले टाइप तय करती हैं.

इंटरफ़ेस

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

    interface ITeleport {
        void teleport(Location baz, float speed);
        String getName();
    }

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

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

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

बैकएंड से जुड़े पार्स किए जा सकने वाले पार्सल बनाने के तरीके की जानकारी के लिए, एआईडीएल बैकएंड कस्टम पार्सलेबल हैं.

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

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

    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;
    }

इनम्स

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
    }

स्थिरांक

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

    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 जैसे कैलकुलेशन को byte टाइप के साथ -3 के तौर पर दिखाया जाए, जबकि 0xff * 3 को int टाइप के साथ 765 माना जाए.

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