एआईडीएल भाषा

एआईडीएल भाषा शिथिल रूप से जावा भाषा पर आधारित है। फ़ाइलें एक इंटरफ़ेस अनुबंध और इस अनुबंध में उपयोग किए जाने वाले विभिन्न डेटा प्रकार और स्थिरांक निर्दिष्ट करती हैं।

पैकेट

प्रत्येक एआईडीएल फाइलें एक वैकल्पिक पैकेज से शुरू होती हैं जो विभिन्न बैकएंड में पैकेज नामों से मेल खाती है। एक पैकेज घोषणा इस तरह दिखती है:

    package my.package;

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

प्रकार

एआईडीएल फाइलों में ऐसे कई स्थान हैं जहां प्रकार निर्दिष्ट किए जा सकते हैं। AIDL भाषा में समर्थित प्रकारों की सटीक सूची के लिए, AIDL बैकएंड प्रकार देखें।

एनोटेशन

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

आयात

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

एक आयात इस तरह दिखता है:

    import some.package.Foo;  // explicit import

एक ही पैकेज में एक प्रकार का आयात करते समय, पैकेज को छोड़ा जा सकता है। हालांकि, जब पैकेज के बिना प्रकार निर्दिष्ट किए जाते हैं और वैश्विक नामस्थान में डाल दिया जाता है, तो पैकेज को छोड़ने से अस्पष्ट आयात त्रुटियां हो सकती हैं (आमतौर पर सभी प्रकार के नामस्थान होने चाहिए):

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

परिभाषित प्रकार

एआईडीएल फाइलें आम तौर पर उन प्रकारों को परिभाषित करती हैं जिनका उपयोग इंटरफेस के रूप में किया जाता है।

इंटरफेस

एआईडीएल इंटरफ़ेस का एक उदाहरण यहां दिया गया है:

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

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

विधियों में शून्य या अधिक तर्क हो सकते हैं। विधियों के तर्क in , out या inout हो सकते हैं। यह तर्क प्रकारों को कैसे प्रभावित करता है, इस पर चर्चा के लिए, एआईडीएल बैकएंड दिशात्मकता देखें।

पार्सल योग्य

बैकएंड-विशिष्ट पार्सलेबल बनाने के तरीके के विवरण के लिए, एआईडीएल कस्टम पार्सलेबल का बैकएंड करता है

Android 10 और उच्चतर समर्थन सीधे 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;
    }

Enums

Android 11 और उच्चतर समर्थन एनम घोषणाएं। उदाहरण के लिए:

    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;

लगातार अभिव्यक्ति

एआईडीएल स्थिरांक, सरणी आकार और गणक स्थिरांक व्यंजकों का उपयोग करके निर्दिष्ट किए जा सकते हैं। अभिव्यक्ति नेस्ट संचालन के लिए कोष्ठक का उपयोग कर सकते हैं। निरंतर अभिव्यक्ति मूल्यों का उपयोग अभिन्न या फ्लोट मूल्यों के साथ किया जा सकता है।

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

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