एआईडीएल एनोटेशन का समर्थन करता है जो एआईडीएल कंपाइलर को एनोटेट किए गए तत्व के बारे में अतिरिक्त जानकारी देता है, जो जेनरेट किए गए स्टब कोड को भी प्रभावित करता है।
सिंटैक्स जावा के समान है:
@AnnotationName(argument1=value, argument2=value) AidlEntity
यहाँ, एनोटेशननाम AnnotationName
का नाम है, और AidlEntity
एक AIDL इकाई है जैसे interface Foo
, void method()
, या int arg
। उस इकाई से एक एनोटेशन जुड़ा हुआ है जो इसका अनुसरण करता है।
जैसा कि ऊपर दिखाया गया है, कुछ एनोटेशन में कोष्ठक के अंदर तर्क सेट हो सकते हैं। जिन टिप्पणियों में तर्क नहीं है, उन्हें कोष्ठक की आवश्यकता नहीं है। उदाहरण के लिए:
@AnnotationName AidlEntity
ये एनोटेशन जावा एनोटेशन के समान नहीं हैं, हालांकि वे बहुत समान दिखते हैं। उपयोगकर्ता कस्टम एआईडीएल एनोटेशन को परिभाषित नहीं कर सकते हैं; एनोटेशन सभी पूर्व-परिभाषित हैं। कुछ एनोटेशन केवल एक निश्चित बैकएंड को प्रभावित करते हैं और अन्य बैकएंड में नो-ऑप हैं। उनके पास अलग-अलग प्रतिबंध हैं जहां उन्हें संलग्न किया जा सकता है।
नीचे पूर्व-परिभाषित एआईडीएल एनोटेशन की सूची दी गई है:
एनोटेशन | Android संस्करण में जोड़ा गया |
---|---|
nullable | 7 |
utf8InCpp | 7 |
VintfStability | 1 1 |
UnsupportedAppUsage | 10 |
Hide | 1 1 |
Backing | 1 1 |
JavaOnlyStableParcelable | 1 1 |
JavaDerive | 12 |
JavaPassthrough | 12 |
FixedSize | 12 |
Descriptor | 12 |
नल
nullable
घोषणा करता है कि एनोटेट इकाई का मूल्य प्रदान नहीं किया जा सकता है।
यह एनोटेशन केवल मेथड रिटर्न टाइप्स, मेथड पैरामीटर्स और पार्सलेबल फील्ड्स से अटैच किया जा सकता है।
interface IFoo {
// method return types
@nullable Data method();
// method parameters
void method2(in @nullable Data d);
}
parcelable Data {
// parcelable fields
@nullable Data d;
}
एनोटेशन को आदिम प्रकारों से नहीं जोड़ा जा सकता है। निम्नलिखित त्रुटि है।
void method(in @nullable int a); // int is a primitive type
यह एनोटेशन जावा बैकएंड के लिए नो-ऑप है। ऐसा इसलिए है, क्योंकि जावा में, सभी गैर-आदिम प्रकार संदर्भ द्वारा पारित किए जाते हैं, जो null
हो सकता है।
सीपीपी बैकएंड में, @nullable T
एंड्रॉइड 11 या उससे कम में std::unique_ptr<T>
std::optional<T>
एंड्रॉइड 12 या उच्चतर में std::Optional<T> के लिए मैप करता है।
एनडीके बैकएंड में, @nullable T
हमेशा std::optional<T>
पर मैप करता है।
एक सूची-जैसी प्रकार L
के लिए जैसे T[]
या List<T>
, @nullable L
मैप्स से std::optional<std::vector<std::optional<T>>>
(या std::unique_ptr<std::vector<std::unique_ptr<T>>>
एंड्रॉइड 11 या उससे कम के सीपीपी बैकएंड के मामले में)।
इस मानचित्रण का एक अपवाद है। जब T
IBinder
या AIDL इंटरफ़ेस है, @nullable
नो-ऑप है। दूसरे शब्दों में, @nullable IBinder
और IBinder
दोनों समान रूप से android::sp<IBinder>
पर मैप करते हैं, जो पहले से ही अशक्त है क्योंकि यह एक मजबूत पॉइंटर है (CPP रीड्स अभी भी अशक्तता को लागू करता है, लेकिन टाइप अभी भी android::sp<IBinder>
है। )
Android 13 से शुरू होकर, @nullable(heap=true)
का उपयोग पार्सल करने योग्य फ़ील्ड के लिए पुनरावर्ती प्रकारों को मॉडल करने के लिए किया जा सकता है। @nullable(heap=true)
का उपयोग विधि पैरामीटर या रिटर्न प्रकारों के साथ नहीं किया जा सकता है। जब इसके साथ एनोटेट किया जाता है, तो फ़ील्ड को सीपीपी/एनडीके बैकएंड में ढेर-आवंटित संदर्भ std::unique_ptr<T>
में मैप किया जाता है। @nullable(heap=true)
जावा बैकएंड में नो-ऑप है।
utf8InCpp
utf8InCpp
घोषणा करता है कि CPP बैकएंड के लिए UTF8 प्रारूप में एक String
का प्रतिनिधित्व किया जाता है। जैसा कि इसके नाम से संकेत मिलता है, एनोटेशन अन्य बैकएंड के लिए एक नो-ऑप है। विशेष रूप से, String
हमेशा जावा बैकएंड में UTF16 और NDK बैकएंड में UTF8 होती है।
यह एनोटेशन कहीं भी संलग्न किया जा सकता है String
प्रकार का उपयोग किया जा सकता है, जिसमें वापसी मान, पैरामीटर, निरंतर घोषणाएं और पार्सल योग्य फ़ील्ड शामिल हैं।
CPP बैकएंड के लिए, @utf8InCpp String
AIDL मैप्स में std::string
, जबकि String
बिना एनोटेशन मैप्स के android::String16
जहां UTF16 का उपयोग किया जाता है।
ध्यान दें कि utf8InCpp
एनोटेशन का अस्तित्व तार पर तारों को प्रसारित करने के तरीके को नहीं बदलता है। तार के ऊपर तार हमेशा UTF16 के रूप में प्रेषित होते हैं। एक utf8InCpp
एनोटेट स्ट्रिंग को ट्रांसमिट करने से पहले UTF16 में बदल दिया जाता है। जब एक स्ट्रिंग प्राप्त होती है, तो इसे UTF16 से UTF8 में बदल दिया जाता है यदि इसे utf8InCpp
के रूप में एनोटेट किया गया था।
विंटफस्टेबिलिटी
VintfStability
घोषित करती है कि एक उपयोगकर्ता-परिभाषित प्रकार (इंटरफ़ेस, पार्सल करने योग्य, और एनम) का उपयोग पूरे सिस्टम और विक्रेता डोमेन में किया जा सकता है। सिस्टम-विक्रेता इंटरऑपरेबिलिटी के बारे में अधिक जानकारी के लिए एचएएल के लिए एआईडीएल देखें।
एनोटेशन प्रकार के हस्ताक्षर को नहीं बदलता है, लेकिन जब इसे सेट किया जाता है, तो प्रकार का उदाहरण स्थिर के रूप में चिह्नित किया जाता है ताकि यह विक्रेता और सिस्टम प्रक्रियाओं में यात्रा कर सके।
एनोटेशन को केवल उपयोगकर्ता-परिभाषित प्रकार की घोषणाओं से जोड़ा जा सकता है जैसा कि नीचे दिखाया गया है:
@VintfStability
interface IFoo {
....
}
@VintfStability
parcelable Data {
....
}
@VintfStability
enum Type {
....
}
जब किसी प्रकार को VintfStability
के साथ एनोटेट किया जाता है, तो उस प्रकार में संदर्भित किसी अन्य प्रकार को भी इस तरह से एनोटेट किया जाना चाहिए। नीचे दिए गए उदाहरण में, Data
और IBar
दोनों को VintfStability
के साथ एनोटेट किया जाना चाहिए।
@VintfStability
interface IFoo {
void doSomething(in IBar b); // references IBar
void doAnother(in Data d); // references Data
}
@VintfStability // required
interface IBar {...}
@VintfStability // required
parcelable Data {...}
इसके अलावा, विंटफस्टेबिलिटी के साथ एनोटेट किए गए प्रकारों को परिभाषित करने वाली VintfStability
फाइलें केवल aidl_interface
सूंग मॉड्यूल प्रकार का उपयोग करके बनाई जा सकती हैं, जिसमें stability
संपत्ति "vintf"
पर सेट होती है।
aidl_interface {
name: "my_interface",
srcs: [...],
stability: "vintf",
}
असमर्थित ऐप उपयोग
UnsupportedAppUsage
एनोटेशन दर्शाता है कि एनोटेट किया गया AIDL प्रकार गैर-SDK इंटरफ़ेस का हिस्सा है जिसे लीगेसी ऐप्स के लिए एक्सेस किया जा सकता है। छिपे हुए एपीआई के बारे में अधिक जानकारी के लिए गैर-एसडीके इंटरफेस पर प्रतिबंध देखें।
UnsupportedAppUsage
एनोटेशन जनरेट किए गए कोड के व्यवहार को प्रभावित नहीं करता है। एनोटेशन केवल उसी नाम के जावा एनोटेशन के साथ जेनरेट किए गए जावा क्लास को एनोटेट करता है।
// in AIDL
@UnsupportedAppUsage
interface IFoo {...}
// in Java
@android.compat.annotation.UnsupportedAppUsage
public interface IFoo {...}
यह गैर-जावा बैकएंड के लिए नो-ऑप है।
समर्थन
Backing
एनोटेशन एआईडीएल एनम प्रकार के भंडारण प्रकार को निर्दिष्ट करता है।
@Backing(type="int")
enum Color { RED, BLUE, }
CPP बैकएंड में, उपरोक्त int32_t
प्रकार के C++ एनम वर्ग का उत्सर्जन करता है।
enum class Color : int32_t {
RED = 0,
BLUE = 1,
}
यदि एनोटेशन को छोड़ दिया जाता है, तो type
को byte
माना जाता है, जो सीपीपी बैकएंड के लिए int8_t
पर मैप करता है।
type
तर्क केवल निम्नलिखित अभिन्न प्रकारों पर सेट किया जा सकता है:
-
byte
(8-बिट चौड़ा) -
int
(32-बिट चौड़ा) -
long
(64-बिट चौड़ा)
JavaOnlyStableParcelable
JavaOnlyStableParcelable
एक पार्सल योग्य घोषणा (परिभाषा नहीं) को स्थिर के रूप में चिह्नित करता है ताकि इसे अन्य स्थिर एआईडीएल प्रकारों से संदर्भित किया जा सके।
स्थिर एआईडीएल के लिए आवश्यक है कि सभी उपयोगकर्ता-परिभाषित प्रकार स्थिर हों। पार्सल के लिए, स्थिर होने के लिए यह आवश्यक है कि इसके क्षेत्रों को एआईडीएल स्रोत फ़ाइल में स्पष्ट रूप से वर्णित किया गया हो।
parcelable Data { // Data is a structured parcelable.
int x;
int y;
}
parcelable AnotherData { // AnotherData is also a structured parcelable
Data d; // OK, because Data is a structured parcelable
}
यदि पार्सल करने योग्य असंरचित (या अभी घोषित) था, तो इसे संदर्भित नहीं किया जा सकता है।
parcelable Data; // Data is NOT a structured parcelable
parcelable AnotherData {
Data d; // Error
}
JavaOnlyStableParcelable
आपको चेक को ओवरराइड करने देता है जब आपके द्वारा संदर्भित पार्सल योग्य Android SDK के हिस्से के रूप में पहले से ही सुरक्षित रूप से उपलब्ध हो।
@JavaOnlyStableParcelable
parcelable Data;
parcelable AnotherData {
Data d; // OK
}
जावाडेरिव
JavaDerive
स्वचालित रूप से Java बैकएंड में पार्सल योग्य प्रकारों के लिए तरीके बनाता है।
@JavaDerive(equals = true, toString = true)
parcelable Data {
int number;
String str;
}
क्या उत्पन्न करना है इसे नियंत्रित करने के लिए एनोटेशन को अतिरिक्त पैरामीटर की आवश्यकता होती है। समर्थित पैरामीटर हैं:
-
equals=true
equals
औरhashCode
विधियों को उत्पन्न करता है। -
toString=true
toString
विधि उत्पन्न करता है जो प्रकार और फ़ील्ड के नाम को प्रिंट करता है। उदाहरण के लिए:Data{number: 42, str: foo}
जावा डिफॉल्ट
JavaDefault
, Android 13 में जोड़ा गया है, यह नियंत्रित करता है कि क्या डिफ़ॉल्ट कार्यान्वयन संस्करण समर्थन उत्पन्न होता है ( setDefaultImpl
के लिए)। स्थान बचाने के लिए यह समर्थन अब डिफ़ॉल्ट रूप से उत्पन्न नहीं होता है।
जावापासथ्रू
JavaPassthrough
जेनरेट किए गए Java API को मनमाने ढंग से Java एनोटेशन के साथ एनोटेट करने देता है।
एआईडीएल में निम्नलिखित एनोटेशन
@JavaPassthrough(annotation="@android.annotation.Alice")
@JavaPassthrough(annotation="@com.android.Alice(arg=com.android.Alice.Value.A)")
बनना
@android.annotation.Alice
@com.android.Alice(arg=com.android.Alice.Value.A)
जेनरेट किए गए जावा कोड में।
annotation
पैरामीटर का मान सीधे उत्सर्जित होता है। एआईडीएल कंपाइलर पैरामीटर के मान को नहीं देखता है। यदि कोई जावा-स्तरीय सिंटैक्स त्रुटि है, तो इसे एआईडीएल कंपाइलर द्वारा नहीं बल्कि जावा कंपाइलर द्वारा पकड़ा जाएगा।
इस एनोटेशन को किसी भी एआईडीएल इकाई से जोड़ा जा सकता है। यह एनोटेशन गैर-जावा बैकएंड के लिए नो-ऑप है।
निर्धारित माप
FixedSize
एक संरचित पार्सल योग्य को निश्चित आकार के रूप में चिह्नित करता है। एक बार चिह्नित होने के बाद, पार्सल करने योग्य को इसमें नए फ़ील्ड जोड़ने की अनुमति नहीं होगी। पार्सल योग्य के सभी क्षेत्रों को निश्चित आकार के प्रकार भी होने चाहिए, जिनमें आदिम प्रकार, एनम, निश्चित आकार के सरणियाँ और अन्य पार्सलेबल शामिल हैं जिन्हें FixedSize
के साथ चिह्नित किया गया है।
यह विभिन्न बिटनेस में कोई गारंटी प्रदान नहीं करता है और मिश्रित-बिटनेस संचार के लिए इस पर भरोसा नहीं किया जाना चाहिए।
डिस्क्रिप्टर
Descriptor
एक इंटरफ़ेस के इंटरफ़ेस डिस्क्रिप्टर को जबरन निर्दिष्ट करता है।
package android.foo;
@Descriptor(value="android.bar.IWorld")
interface IHello {...}
उपरोक्त इंटरफ़ेस का वर्णनकर्ता android.bar.IWorld
है। यदि Descriptor
एनोटेशन गायब है, तो डिस्क्रिप्टर android.foo.IHello
होगा।
यह पहले से प्रकाशित इंटरफ़ेस का नाम बदलने के लिए उपयोगी है। नाम बदलने से पहले नामित इंटरफेस के डिस्क्रिप्टर को इंटरफेस के डिस्क्रिप्टर के समान बनाना दो इंटरफेस को एक दूसरे से बात करने की अनुमति देता है।
@टिप्पणियों में छुपाएं
एआईडीएल कंपाइलर टिप्पणियों में @hide
को पहचानता है और इसे मेटलवा से पिकअप के लिए जावा आउटपुट में भेजता है। यह टिप्पणी सुनिश्चित करती है कि एंड्रॉइड बिल्ड सिस्टम जानता है कि एआईडीएल एपीआई एसडीके एपीआई नहीं हैं।
@टिप्पणियों में पदावनत
AIDL कंपाइलर टिप्पणियों में @deprecated
को एक AIDL इकाई की पहचान करने के लिए एक टैग के रूप में पहचानता है जिसका अब उपयोग नहीं किया जाना चाहिए।
interface IFoo {
/** @deprecated use bar() instead */
void foo();
void bar();
}
प्रत्येक बैकएंड एक बैकएंड-विशिष्ट एनोटेशन/विशेषता के साथ बहिष्कृत संस्थाओं को चिह्नित करता है ताकि क्लाइंट कोड को चेतावनी दी जाए यदि यह बहिष्कृत संस्थाओं को संदर्भित करता है। उदाहरण के लिए, @Deprecated
एनोटेशन और @deprecated
टैग जावा जनरेट किए गए कोड से जुड़े होते हैं।