एआईडीएल भाषा

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

पैकेट

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

    package my.package;

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

प्रकार

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

एनोटेशन

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

आयात

अन्य इंटरफ़ेस में परिभाषित प्रकारों का उपयोग करने के लिए, आपको पहले बिल्ड सिस्टम में निर्भरताएँ जोड़नी होंगी। cc_* और java_* Soong मॉड्यूल में, जहां .aidl फ़ाइलें सीधे एंड्रॉइड प्लेटफ़ॉर्म बिल्ड में 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 हो सकते हैं। यह तर्क प्रकारों को कैसे प्रभावित करता है इसकी चर्चा के लिए, एआईडीएल बैकएंड दिशात्मकता देखें।

पार्सल करने योग्य

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

एंड्रॉइड 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 और उच्चतर समर्थन एनम घोषणाएँ। उदाहरण के लिए:

    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 में शुरू करके, byte मान का प्रतिनिधित्व करने के लिए प्रत्यय u8 3u8 जैसे स्थिरांक में जोड़ा जा सकता है। यह प्रत्यय महत्वपूर्ण है ताकि गणना, जैसे कि 0xffu8 * 3 , को byte प्रकार के साथ -3 के रूप में समझा जाए जबकि 0xff * 3 को int प्रकार के साथ 765 माना जाए।

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