एआईडीएल भाषा, Java भाषा पर आधारित है. फ़ाइलों में, इंटरफ़ेस कॉन्ट्रैक्ट और इस कॉन्ट्रैक्ट में इस्तेमाल किए जाने वाले अलग-अलग डेटा टाइप और कॉन्स्टैंट की जानकारी दी जाती है.
पैकेज
हर एआईडीएल फ़ाइल, एक ऐसे पैकेज से शुरू होती है जो अलग-अलग बैकएंड में पैकेज के नामों से मेल खाता है. हालांकि, यह पैकेज ज़रूरी नहीं है. पैकेज का एलान इस तरह दिखता है:
package my.package;
Java की तरह, एआईडीएल फ़ाइलें भी अपने पैकेज से मेल खाने वाले फ़ोल्डर स्ट्रक्चर में होनी चाहिए. my.package पैकेज वाली फ़ाइलें, my/package/ फ़ोल्डर में होनी चाहिए.
टाइप
एआईडीएल फ़ाइलों में, कई जगहों पर टाइप तय किए जा सकते हैं. एआईडीएल भाषा में इस्तेमाल किए जा सकने वाले टाइप की पूरी सूची देखने के लिए, एआईडीएल बैकएंड के टाइप देखें.
टिप्पणियां
एआईडीएल भाषा के कई हिस्सों में टिप्पणियां जोड़ी जा सकती हैं. टिप्पणियों की सूची और उन्हें कहां जोड़ा जा सकता है, यह जानने के लिए एआईडीएल की टिप्पणियां देखें .
इंपोर्ट
दूसरे इंटरफ़ेस में तय किए गए टाइप इस्तेमाल करने के लिए, आपको सबसे पहले बिल्ड सिस्टम में डिपेंडेंसी जोड़नी होगी. cc_* और java_* Soong मॉड्यूल में, जहां Android प्लैटफ़ॉर्म के बिल्ड में .aidl फ़ाइलों को सीधे srcs में इस्तेमाल किया जाता है, वहां aidl: { include_dirs: ... } फ़ील्ड का इस्तेमाल करके डायरेक्ट्री जोड़ी जा सकती हैं.
aidl_interface का इस्तेमाल करके इंपोर्ट करने के बारे में जानने के लिए, यहां देखें.
इंपोर्ट इस तरह दिखता है:
import some.package.Foo; // explicit import
एक ही पैकेज में किसी टाइप को इंपोर्ट करते समय, पैकेज को छोड़ा जा सकता है. हालांकि, पैकेज को छोड़ने पर, इंपोर्ट से जुड़ी ऐसी गड़बड़ियां हो सकती हैं जिनमें टाइप को बिना पैकेज के तय किया जाता है और उन्हें ग्लोबल नेमस्पेस में रखा जाता है. आम तौर पर, सभी टाइप को नेमस्पेस में रखा जाना चाहिए:
import Foo; // same as my.package.Foo
टाइप तय करना
एआईडीएल फ़ाइलों में आम तौर पर, ऐसे टाइप तय किए जाते हैं जिनका इस्तेमाल इंटरफ़ेस के तौर पर किया जाता है.
इंटरफ़ेस
यहां एआईडीएल इंटरफ़ेस का एक उदाहरण दिया गया है:
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 {...}) के तौर पर तय किया जाता है, तो उसमें मौजूद सभी तरीके,
implicitly oneway होते हैं. Oneway तरीके, एसिंक्रोनस तरीके से भेजे जाते हैं और इनसे कोई नतीजा नहीं मिलता. एक ही थ्रेड से एक ही बाइंडर पर भेजे जाने वाले एक-तरफ़ा तरीके भी क्रम से लागू होते हैं. हालांकि, ये अलग-अलग थ्रेड पर भी लागू हो सकते हैं. थ्रेड सेट अप करने के तरीके के बारे में जानने के लिए, एआईडीएल बैकएंड में थ्रेड
मैनेजमेंट देखें.
बाइंडर इंटरफ़ेस की मदद से, कई इंटरफ़ेस और बाइंडर ऑब्जेक्ट शेयर किए जा सकते हैं. एआईडीएल इंटरफ़ेस में, अक्सर तरीकों को कॉल करने के दौरान कॉलबैक का इस्तेमाल किया जाता है. जैसे, पिछले उदाहरण में ITeleportCallback का इस्तेमाल किया गया है. एक ही तरीके को कॉल करने या अलग-अलग तरीकों को कॉल करने के दौरान, कॉलबैक ऑब्जेक्ट को फिर से इस्तेमाल किया जा सकता है. इंटरफ़ेस टाइप का एक और सामान्य इस्तेमाल, सब-इंटरफ़ेस या सेशन ऑब्जेक्ट के लिए होता है. इन्हें तरीकों से वापस किया जाता है. जैसे, पिछले उदाहरण में ITeleportSession का इस्तेमाल किया गया है. नेस्टिंग की मदद से, अलग-अलग एपीआई को एपीआई या रनटाइम स्टेट के आधार पर एनकैप्सुलेट किया जा सकता है. उदाहरण के लिए, कोई सेशन किसी खास संसाधन के मालिकाना हक को दिखा सकता है. जब इंटरफ़ेस को कई बार पास किया जाता है या उन्हें क्लाइंट या सर्वर पर वापस भेजा जाता है, तो वे हमेशा, उसके नीचे मौजूद बाइंडर ऑब्जेक्ट की पॉइंटर इक्वालिटी को बनाए रखते हैं.
तरीकों में शून्य या उससे ज़्यादा आर्ग्युमेंट हो सकते हैं. तरीकों के आर्ग्युमेंट
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 और उसके बाद के वर्शन में, एनम के एलान की सुविधा उपलब्ध है. उदाहरण के लिए:
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;
कॉन्स्टैंट एक्सप्रेशन
कॉन्स्टैंट एक्सप्रेशन का इस्तेमाल करके, एआईडीएल कॉन्स्टैंट, ऐरे के साइज़, और एन्यूमरेटर तय किए जा सकते हैं. एक्सप्रेशन में, कार्रवाइयों को नेस्ट करने के लिए, पैरंटheses का इस्तेमाल किया जा सकता है. कॉन्स्टैंट एक्सप्रेशन की वैल्यू का इस्तेमाल, इंटिग्रल या फ़्लोट वैल्यू के साथ किया जा सकता है.
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 से, कॉन्स्टैंट में u8 सफ़िक्स जोड़ा जा सकता है. जैसे, 3u8. इससे byte वैल्यू दिखाई जाती है. यह सफ़िक्स ज़रूरी है, ताकि 0xffu8 * 3 जैसे कैलकुलेशन को byte टाइप के साथ -3 के तौर पर समझा जाए. वहीं, 0xff * 3 को int टाइप के साथ 765 के तौर पर समझा जाए.
इस्तेमाल किए जा सकने वाले ऑपरेटर में, C++ और Java सिमैंटिक्स होते हैं. बाइनरी ऑपरेटर, प्राथमिकता के हिसाब से क्रम में इस तरह होते हैं:
उच्चतम प्राथमिकता के लिए, बाइनरी ऑपरेटर हैं:
|| && | ^ & == != < > <= >= << >> + - * / % यूनरी ऑपरेटर ये हैं: + - ! ~.