Dalvik एक्ज़ीक्यूटेबल फ़ॉर्मैट

इस दस्तावेज़ में, .dex फ़ाइलों के लेआउट और कॉन्टेंट के बारे में बताया गया है. इनका इस्तेमाल, क्लास की परिभाषाओं और उनसे जुड़े सहायक डेटा के सेट को सेव करने के लिए किया जाता है.

टाइप के बारे में गाइड

नाम ब्यौरा
बाइट 8-बिट साइंड इंट
ubyte 8-बिट अनसाइंड इंट
छोटा 16-बिट साइंड इंट, लिटिल-एंडियन
ushort 16-बिट का बिना हस्ताक्षर वाला पूर्णांक, लिटिल-एंडियन
आईएनटी 32-बिट साइंड इंट, लिटिल-एंडियन
uint 32-बिट का बिना हस्ताक्षर वाला पूर्णांक, लिटिल-एंडियन
लंबा 64-बिट साइंड इंट, लिटिल-एंडियन
उलॉन्ग 64-बिट का बिना हस्ताक्षर वाला पूर्णांक, लिटिल-एंडियन
sleb128 हस्ताक्षरित LEB128, वैरिएबल लेंथ (नीचे देखें)
uleb128 अनसाइंड किया गया LEB128, वैरिएबल लेंथ (नीचे देखें)
uleb128p1 unsigned LEB128 plus 1, वैरिएबल लेंथ (नीचे देखें)

LEB128

LEB128 ("Little-Endian Base 128") एक वैरिएबल-लेंथ एन्कोडिंग है. इसका इस्तेमाल, किसी भी साइंड या अनसाइंड पूर्णांक के लिए किया जाता है. इस फ़ॉर्मैट को DWARF3 स्पेसिफ़िकेशन से लिया गया है. .dex फ़ाइल में, LEB128 का इस्तेमाल सिर्फ़ 32-बिट की वैल्यू को कोड में बदलने के लिए किया जाता है.

LEB128 के तौर पर कोड की गई हर वैल्यू में एक से पांच बाइट होते हैं. ये सभी बाइट मिलकर, एक 32-बिट वैल्यू को दिखाते हैं. हर बाइट में सबसे अहम बिट सेट होती है. हालांकि, क्रम में मौजूद आखिरी बाइट में सबसे अहम बिट सेट नहीं होती. हर बाइट के बाकी सात बिट पेलोड होते हैं. पहले बाइट में, मात्रा के सबसे कम सार्थक सात बिट होते हैं. दूसरे बाइट में, अगले सात बिट होते हैं. इसी तरह, यह क्रम जारी रहता है. साइन किए गए LEB128 (sleb128) के मामले में, क्रम में मौजूद आखिरी बाइट का सबसे अहम पेलोड बिट, फ़ाइनल वैल्यू जनरेट करने के लिए साइन-एक्सटेंड किया जाता है. बिना हस्ताक्षर वाले मामले में (uleb128), साफ़ तौर पर नहीं दिखाए गए किसी भी बिट को 0 के तौर पर समझा जाता है.

दो बाइट वाली LEB128 वैल्यू का बिटवाइज़ डायग्राम
फ़र्स्ट बाइट दूसरा बाइट
1 bit6 bit5 bit4 bit3 bit2 बिट1 bit0 0 bit13 bit12 bit11 bit10 bit9 bit8 bit7

वैरिएंट uleb128p1 का इस्तेमाल, साइन की गई वैल्यू को दिखाने के लिए किया जाता है. इसमें वैल्यू प्लस एक को uleb128 के तौर पर कोड किया जाता है. इससे -1 (इसे बिना हस्ताक्षर वाली वैल्यू 0xffffffff भी माना जाता है) को एक बाइट में एन्कोड किया जा सकता है. हालांकि, किसी अन्य नेगेटिव नंबर को एन्कोड नहीं किया जा सकता. यह उन मामलों में काम आता है जहां दिखाई गई संख्या या तो नॉन-नेगेटिव होनी चाहिए या -1 (या 0xffffffff) होनी चाहिए. साथ ही, जहां अन्य नेगेटिव वैल्यू की अनुमति नहीं है या जहां बड़े बिना हस्ताक्षर वाली वैल्यू की ज़रूरत नहीं होती है.

यहां फ़ॉर्मैट के कुछ उदाहरण दिए गए हैं:

कोड में बदला गया क्रम sleb128 के तौर पर uleb128 के तौर पर uleb128p1 के तौर पर
0000-1
01110
7f-1127126
80 7f-1281625616255

फ़ाइल का लेआउट

नाम फ़ॉर्मैट ब्यौरा
हेडर header_item हेडर
string_ids string_id_item[] स्ट्रिंग आइडेंटिफ़ायर की सूची. ये इस फ़ाइल में इस्तेमाल की गई सभी स्ट्रिंग के लिए आइडेंटिफ़ायर हैं. इनका इस्तेमाल, फ़ाइल के अंदर नाम देने के लिए (जैसे, टाइप डिस्क्रिप्टर) या कोड में इस्तेमाल किए गए कॉन्स्टेंट ऑब्जेक्ट के तौर पर किया जाता है. इस सूची को स्ट्रिंग के कॉन्टेंट के हिसाब से क्रम से लगाया जाना चाहिए. इसके लिए, UTF-16 कोड पॉइंट वैल्यू का इस्तेमाल किया जाना चाहिए. हालांकि, इसे स्थानीय भाषा के हिसाब से क्रम से नहीं लगाया जाना चाहिए. साथ ही, इसमें कोई डुप्लीकेट एंट्री नहीं होनी चाहिए.
type_ids type_id_item[] टाइप आइडेंटिफ़ायर की सूची. ये इस फ़ाइल में इस्तेमाल किए गए सभी टाइप (क्लास, ऐरे या प्रिमिटिव टाइप) के आइडेंटिफ़ायर हैं. भले ही, इन्हें फ़ाइल में तय किया गया हो या नहीं. इस सूची को string_id इंडेक्स के हिसाब से क्रम में लगाया जाना चाहिए. साथ ही, इसमें डुप्लीकेट एंट्री नहीं होनी चाहिए.
proto_ids proto_id_item[] तरीके के प्रोटोटाइप आइडेंटिफ़ायर की सूची. ये इस फ़ाइल में शामिल किए गए सभी प्रोटोटाइप के आइडेंटिफ़ायर हैं. इस सूची को इस क्रम में क्रमबद्ध किया जाना चाहिए: return-type (type_id इंडेक्स के हिसाब से) के मुख्य क्रम में, इसके बाद आर्ग्युमेंट की सूची के हिसाब से (लेक्सिकोग्राफ़िक क्रम, type_id इंडेक्स के हिसाब से क्रमबद्ध किए गए अलग-अलग आर्ग्युमेंट). सूची में डुप्लीकेट एंट्री नहीं होनी चाहिए.
field_ids field_id_item[] फ़ील्ड आइडेंटिफ़ायर की सूची. ये इस फ़ाइल में मौजूद सभी फ़ील्ड के आइडेंटिफ़ायर हैं. भले ही, उन्हें फ़ाइल में तय किया गया हो या नहीं. इस सूची को क्रम से लगाया जाना चाहिए. इसमें type_id इंडेक्स के हिसाब से तय किया गया टाइप मुख्य क्रम में, string_id इंडेक्स के हिसाब से फ़ील्ड का नाम बीच के क्रम में, और type_id इंडेक्स के हिसाब से टाइप सबसे आखिर के क्रम में होना चाहिए. सूची में कोई डुप्लीकेट एंट्री नहीं होनी चाहिए.
method_ids method_id_item[] तरीके के आइडेंटिफ़ायर की सूची. ये इस फ़ाइल में बताए गए सभी तरीकों के आइडेंटिफ़ायर हैं. भले ही, उन्हें फ़ाइल में तय किया गया हो या नहीं. इस सूची को क्रम से लगाया जाना चाहिए. इसमें type_id इंडेक्स के हिसाब से तय किया गया टाइप मुख्य क्रम, string_id इंडेक्स के हिसाब से तय किया गया तरीका इंटरमीडिएट क्रम, और proto_id इंडेक्स के हिसाब से तय किया गया तरीका माइनर क्रम होता है. सूची में डुप्लीकेट एंट्री नहीं होनी चाहिए.
class_defs class_def_item[] क्लास की परिभाषाओं की सूची. क्लास को इस तरह से क्रम में लगाया जाना चाहिए कि किसी क्लास की सुपरक्लास और लागू किए गए इंटरफ़ेस, सूची में रेफ़र करने वाली क्लास से पहले दिखें. इसके अलावा, एक ही नाम वाली क्लास की डेफ़िनिशन, सूची में एक से ज़्यादा बार नहीं दिखनी चाहिए.
call_site_ids call_site_id_item[] कॉल साइट आइडेंटिफ़ायर की सूची. ये इस फ़ाइल में शामिल सभी कॉल साइटों के आइडेंटिफ़ायर हैं. भले ही, उन्हें फ़ाइल में तय किया गया हो या नहीं. इस सूची को call_site_off के हिसाब से बढ़ते क्रम में लगाया जाना चाहिए.
method_handles method_handle_item[] तरीके की हैंडल की गई सूची. इस फ़ाइल में इस्तेमाल किए गए सभी तरीके के हैंडल की सूची. भले ही, उन्हें फ़ाइल में तय किया गया हो या नहीं. इस सूची को क्रम से नहीं लगाया गया है. इसमें डुप्लीकेट भी हो सकते हैं. ये डुप्लीकेट, लॉजिक के हिसाब से अलग-अलग तरीके से हैंडल किए गए इंस्टेंस से मेल खाएंगे.
डेटा ubyte[] डेटा एरिया, जिसमें ऊपर दी गई टेबल के लिए सहायता से जुड़ा सारा डेटा होता है. अलग-अलग आइटम के लिए, अलाइनमेंट से जुड़ी अलग-अलग शर्तें होती हैं. साथ ही, अगर सही अलाइनमेंट के लिए ज़रूरी हो, तो हर आइटम से पहले पैडिंग बाइट डाली जाती हैं.
link_data ubyte[] स्टैटिक तौर पर लिंक की गई फ़ाइलों में इस्तेमाल किया गया डेटा. इस दस्तावेज़ में, इस सेक्शन में मौजूद डेटा के फ़ॉर्मैट के बारे में नहीं बताया गया है. लिंक नहीं की गई फ़ाइलों में यह सेक्शन खाली होता है. साथ ही, रनटाइम लागू करने की प्रोसेस में इसका इस्तेमाल किया जा सकता है.

कंटेनर फ़ॉर्मैट

वर्शन 41 में, DEX डेटा के लिए नया कंटेनर फ़ॉर्मैट पेश किया गया है. इसका मकसद जगह बचाना है. इस कंटेनर फ़ॉर्मैट की मदद से, कई लॉजिकल DEX फ़ाइलों को एक फ़िज़िकल फ़ाइल में जोड़ा जा सकता है. नया फ़ॉर्मैट, पिछले फ़ॉर्मैट में मौजूद फ़ाइलों को एक साथ जोड़ने का एक आसान तरीका है. हालांकि, इसमें कुछ अंतर हैं:

  • file_size लॉजिकल फ़ाइल का साइज़ है, न कि फ़िज़िकल फ़ाइल का. इसका इस्तेमाल, कंटेनर में मौजूद सभी लॉजिकल फ़ाइलों को दोहराने के लिए किया जा सकता है.
  • लॉजिकल डेक्स फ़ाइलें, कंटेनर में मौजूद किसी भी नए डेटा का रेफ़रंस दे सकती हैं. हालांकि, वे पुराने डेटा का रेफ़रंस नहीं दे सकतीं. इससे dex फ़ाइलें, एक-दूसरे के साथ स्ट्रिंग जैसे डेटा को शेयर कर पाती हैं.
  • सभी ऑफ़सेट, फ़िज़िकल फ़ाइल के हिसाब से होते हैं. हेडर के हिसाब से कोई ऑफ़सेट नहीं है. इससे यह पक्का किया जाता है कि ऑफ़सेट वाले सेक्शन को लॉजिकल फ़ाइलों के बीच शेयर किया जा सकता है.
  • हेडर, कंटेनर की सीमाओं के बारे में बताने के लिए दो नए फ़ील्ड जोड़ता है. यह एक अतिरिक्त जांच है, जिससे कोड को नए फ़ॉर्मैट में पोर्ट करना आसान हो जाता है.
  • data_size और data_off अब इस्तेमाल नहीं किए जाते. डेटा को कई लॉजिकल फ़ाइलों में फैलाया जा सकता है और यह ज़रूरी नहीं है कि डेटा लगातार हो.

बिटफ़ील्ड, स्ट्रिंग, और कॉन्स्टेंट की परिभाषाएं

DEX_FILE_MAGIC

header_item में एम्बेड किया गया

कॉन्स्टेंट ऐरे/स्ट्रिंग DEX_FILE_MAGIC, बाइट की वह सूची है जो .dex फ़ाइल की शुरुआत में दिखनी चाहिए, ताकि उसे इस तरह की फ़ाइल के तौर पर पहचाना जा सके. वैल्यू में जान-बूझकर नई लाइन ("\n" या 0x0a) और शून्य बाइट ("\0" या 0x00) शामिल किया गया है, ताकि कुछ तरह की गड़बड़ियों का पता लगाने में मदद मिल सके. इस वैल्यू में, फ़ॉर्मैट के वर्शन नंबर को तीन दशमलव अंकों के तौर पर भी कोड किया जाता है. फ़ॉर्मैट में बदलाव होने पर, समय के साथ-साथ इस वैल्यू में लगातार बढ़ोतरी होने की उम्मीद है.

ubyte[8] DEX_FILE_MAGIC = { 0x64 0x65 0x78 0x0a 0x30 0x33 0x39 0x00 }
                        = "dex\n039\0"

ध्यान दें: Android 16 के रिलीज़ होने के बाद, फ़ॉर्मैट के 041 वर्शन के लिए सहायता उपलब्ध कराई गई थी. इसमें कंटेनर फ़ॉर्मैट का इस्तेमाल किया जा सकता है.

ध्यान दें: फ़ॉर्मैट के 040 वर्शन के लिए सहायता, Android 10.0 रिलीज़ में जोड़ी गई थी. इससे SimpleNames में इस्तेमाल किए जा सकने वाले वर्णों का सेट बढ़ गया था.

ध्यान दें: Android 9.0 रिलीज़ में, फ़ॉर्मैट के 039 वर्शन के लिए सहायता जोड़ी गई थी. इसमें दो नए बाइटकोड, const-method-handle और const-method-type पेश किए गए थे. (इनके बारे में, सेट किए गए बाइटकोड की खास जानकारी टेबल में बताया गया है.) Android 10 में, वर्शन 039 DEX फ़ाइल फ़ॉर्मैट को बढ़ाता है, ताकि इसमें छिपी हुई एपीआई जानकारी शामिल की जा सके. यह जानकारी सिर्फ़ बूट क्लास पाथ पर मौजूद DEX फ़ाइलों पर लागू होती है.

ध्यान दें: Android 8.0 रिलीज़ में, फ़ॉर्मैट के 038 वर्शन के लिए सहायता जोड़ी गई थी. वर्शन 038 में नए बाइटकोड (invoke-polymorphic और invoke-custom) और मेथड हैंडल के लिए डेटा जोड़ा गया है.

ध्यान दें: Android 7.0 के रिलीज़ होने के बाद, इस फ़ॉर्मैट के 037 वर्शन के लिए सहायता जोड़ी गई थी. वर्शन 037 से पहले, Android के ज़्यादातर वर्शन में फ़ॉर्मैट के वर्शन 035 का इस्तेमाल किया जाता था. वर्शन 035 और 037 के बीच सिर्फ़ यह अंतर है कि 037 में डिफ़ॉल्ट तरीके जोड़े गए हैं और invoke को अडजस्ट किया गया है.

ध्यान दें: फ़ॉर्मैट के कम से कम दो पिछले वर्शन, सार्वजनिक तौर पर उपलब्ध सॉफ़्टवेयर रिलीज़ में इस्तेमाल किए गए हैं. उदाहरण के लिए, Android प्लैटफ़ॉर्म के M3 रिलीज़ (नवंबर–दिसंबर 2007) के लिए 009 वर्शन का इस्तेमाल किया गया था. वहीं, Android प्लैटफ़ॉर्म के M5 रिलीज़ (फ़रवरी–मार्च 2008) के लिए 013 वर्शन का इस्तेमाल किया गया था. कई मामलों में, फ़ॉर्मैट के ये पुराने वर्शन, इस दस्तावेज़ में बताए गए वर्शन से काफ़ी अलग हैं.

ENDIAN_CONSTANT और REVERSE_ENDIAN_CONSTANT

header_item में एम्बेड किया गया

कॉन्स्टेंट ENDIAN_CONSTANT का इस्तेमाल, उस फ़ाइल के एंडियननेस को दिखाने के लिए किया जाता है जिसमें यह मौजूद है. हालांकि, स्टैंडर्ड .dex फ़ॉर्मैट लिटिल-एंडियन होता है, लेकिन लागू करने वाले लोग या कंपनियां बाइट-स्वैपिंग कर सकती हैं. अगर लागू करने के दौरान, किसी हेडर का endian_tag, ENDIAN_CONSTANT के बजाय REVERSE_ENDIAN_CONSTANT है, तो इससे यह पता चल जाएगा कि फ़ाइल को उम्मीद के मुताबिक बाइट-स्वैप किया गया है.

uint ENDIAN_CONSTANT = 0x12345678;
uint REVERSE_ENDIAN_CONSTANT = 0x78563412;

NO_INDEX

class_def_item और debug_info_item में एम्बेड किया गया

कॉन्स्टेंट NO_INDEX का इस्तेमाल यह दिखाने के लिए किया जाता है कि इंडेक्स वैल्यू मौजूद नहीं है.

ध्यान दें: इस वैल्यू को 0 के तौर पर तय नहीं किया गया है, क्योंकि आम तौर पर यह एक मान्य इंडेक्स होता है.

NO_INDEX के लिए चुनी गई वैल्यू को uleb128p1 एन्कोडिंग में एक बाइट के तौर पर दिखाया जा सकता है.

uint NO_INDEX = 0xffffffff;    // == -1 if treated as a signed int

ऐक्सेस फ़्लैग की परिभाषाएं

class_def_item, encoded_field, encoded_method, और InnerClass में एम्बेड किया गया

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

नाम वैल्यू क्लास (और InnerClass एनोटेशन) के लिए फ़ील्ड के लिए तरीकों के लिए
ACC_PUBLIC 0x1 public: हर जगह दिखता है public: हर जगह दिखता है public: हर जगह दिखता है
ACC_PRIVATE 0x2 * private: सिर्फ़ क्लास तय करने वाले को दिखता है private: सिर्फ़ क्लास को तय करने वाले व्यक्ति को दिखता है private: सिर्फ़ क्लास को तय करने वाले व्यक्ति को दिखता है
ACC_PROTECTED 0x4 * protected: पैकेज और सबक्लास के लिए दिखता है protected: पैकेज और सबक्लास के लिए दिखता है protected: पैकेज और सबक्लास के लिए दिखता है
ACC_STATIC 0x8 * static: is not constructed with an outer this reference static: ग्लोबल से क्लास तय करने वाले static: इसमें this तर्क नहीं लिया जाता है
ACC_FINAL 0x10 final: इसे सबक्लास नहीं किया जा सकता final: कंस्ट्रक्शन के बाद बदला नहीं जा सकता final: बदली नहीं जा सकती
ACC_SYNCHRONIZED 0x20     synchronized: इस तरीके को कॉल करने के दौरान, इससे जुड़ा लॉक अपने-आप मिल जाता है.

ध्यान दें: इस वैल्यू को सिर्फ़ तब सेट किया जा सकता है, जब ACC_NATIVE भी सेट हो.

ACC_VOLATILE 0x40   volatile: थ्रेड को सुरक्षित रखने के लिए, ऐक्सेस से जुड़े खास नियम  
ACC_BRIDGE 0x40     ब्रिज मेथड, जिसे कंपाइलर ने टाइप-सेफ़ ब्रिज के तौर पर अपने-आप जोड़ा है
ACC_TRANSIENT 0x80   transient: डिफ़ॉल्ट सीरियलाइज़ेशन से सेव नहीं किया जाना चाहिए  
ACC_VARARGS 0x80     कंपाइलर को आखिरी आर्ग्युमेंट को "rest" आर्ग्युमेंट के तौर पर मानना चाहिए
ACC_NATIVE 0x100     native: नेटिव कोड में लागू किया गया
ACC_INTERFACE 0x200 interface: एक से ज़्यादा बार लागू की जा सकने वाली ऐब्स्ट्रैक्ट क्लास    
ACC_ABSTRACT 0x400 abstract: सीधे तौर पर इंस्टैंशिएट नहीं किया जा सकता   abstract: इस क्लास के लिए लागू नहीं किया गया
ACC_STRICT 0x800     strictfp: फ़्लोटिंग-पॉइंट अरिथमेटिक के लिए सख्त नियम
ACC_SYNTHETIC 0x1000 सोर्स कोड में सीधे तौर पर तय नहीं किया गया है सोर्स कोड में सीधे तौर पर तय नहीं किया गया है सोर्स कोड में सीधे तौर पर तय नहीं किया गया है
ACC_ANNOTATION 0x2000 एनोटेशन क्लास के तौर पर एलान किया गया हो    
ACC_ENUM 0x4000 गिनती किए गए टाइप के तौर पर एलान किया गया हो गिनती की गई वैल्यू के तौर पर एलान किया गया हो  
(इस्तेमाल नहीं किया गया) 0x8000      
ACC_CONSTRUCTOR 0x10000     कंस्ट्रक्टर मेथड (क्लास या इंस्टेंस इनिशियलाइज़र)
ACC_DECLARED_
SYNCHRONIZED
0x20000     synchronized का एलान किया गया है.

ध्यान दें: इससे एक्ज़ीक्यूशन पर कोई असर नहीं पड़ता. हालांकि, इस फ़्लैग के हिसाब से एक्ज़ीक्यूशन पर असर पड़ सकता है.

* इसकी अनुमति सिर्फ़ InnerClass एनोटेशन के लिए है. साथ ही, यह class_def_item में कभी भी चालू नहीं होना चाहिए.

बदला गया UTF-8 एन्कोडिंग

लेगसी सिस्टम के साथ आसानी से काम करने के लिए, .dex फ़ॉर्मैट, स्ट्रिंग डेटा को UTF-8 के स्टैंडर्ड फ़ॉर्म में कोड करता है. इसे MUTF-8 कहा जाता है. यह फ़ॉर्म, स्टैंडर्ड UTF-8 के जैसा ही है. हालांकि, इसमें ये अंतर हैं:

  • सिर्फ़ एक, दो, और तीन बाइट वाली एन्कोडिंग का इस्तेमाल किया जाता है.
  • U+10000U+10ffff रेंज में मौजूद कोड पॉइंट को सरोगेट पेयर के तौर पर कोड किया जाता है. इनमें से हर एक को तीन बाइट वाली कोड की गई वैल्यू के तौर पर दिखाया जाता है.
  • कोड पॉइंट U+0000 को दो बाइट के फ़ॉर्म में कोड किया गया है.
  • सामान्य शून्य बाइट (वैल्यू 0) से पता चलता है कि स्ट्रिंग खत्म हो गई है. यह C भाषा के स्टैंडर्ड इंटरप्रिटेशन के मुताबिक है.

ऊपर दिए गए पहले दो आइटम को इस तरह से दिखाया जा सकता है: MUTF-8, UTF-16 के लिए एन्कोडिंग फ़ॉर्मैट है. यह यूनिकोड वर्णों के लिए, ज़्यादा डायरेक्ट एन्कोडिंग फ़ॉर्मैट नहीं है.

ऊपर दिए गए आखिरी दो आइटम की वजह से, स्ट्रिंग में कोड पॉइंट U+0000 को शामिल करना और इसे C-स्टाइल वाली नल-टर्मिनेटेड स्ट्रिंग के तौर पर इस्तेमाल करना, दोनों एक साथ मुमकिन हो पाता है.

हालांकि, U+0000 की खास एन्कोडिंग का मतलब है कि सामान्य UTF-8 के उलट, MUTF-8 स्ट्रिंग के किसी पेयर पर स्टैंडर्ड C फ़ंक्शन strcmp() को कॉल करने पर मिलने वाला नतीजा, हमेशा असमान स्ट्रिंग की तुलना के सही तरीके से साइन किए गए नतीजे को नहीं दिखाता. जब क्रम (सिर्फ़ समानता नहीं) की बात आती है, तो MUTF-8 स्ट्रिंग की तुलना करने का सबसे आसान तरीका यह है कि उन्हें वर्ण के हिसाब से डिकोड किया जाए और डिकोड की गई वैल्यू की तुलना की जाए. (हालांकि, ज़्यादा बेहतर तरीके से भी लागू किया जा सकता है.)

कैरेक्टर एन्कोडिंग के बारे में ज़्यादा जानकारी के लिए, कृपया The Unicode Standard देखें. MUTF-8, UTF-8 के मुकाबले CESU-8 (यह एन्कोडिंग, UTF-8 की तुलना में कम जानी जाती है) के ज़्यादा करीब है.

encoded_value को कोड में बदलने का तरीका

annotation_element और encoded_array_item में एम्बेड किया गया

encoded_value, किसी भी तरह के डेटा का एन्कोड किया गया हिस्सा होता है. यह डेटा, क्रम के हिसाब से व्यवस्थित होता है. इस तरह की एन्कोडिंग का मकसद, डेटा को छोटा और पार्स करने में आसान बनाना है.

नाम फ़ॉर्मैट ब्यौरा
(value_arg << 5) | value_type ubyte बाइट से यह पता चलता है कि इसके बाद आने वाला value किस तरह का है. साथ ही, ज़्यादा अहमियत वाले तीन बिट में, जानकारी देने वाला कोई तर्क भी शामिल किया जा सकता है. value की अलग-अलग परिभाषाएं यहां दी गई हैं. ज़्यादातर मामलों में, value_arg, इसके ठीक बाद आने वाले value की लंबाई को बाइट में (size - 1) के तौर पर दिखाता है. उदाहरण के लिए, 0 का मतलब है कि वैल्यू के लिए एक बाइट की ज़रूरत होती है. वहीं, 7 का मतलब है कि इसके लिए आठ बाइट की ज़रूरत होती है. हालांकि, यहां बताए गए मामलों में ऐसा नहीं होता.
मान ubyte[] वैल्यू को दिखाने वाले बाइट. इनकी लंबाई अलग-अलग होती है और अलग-अलग value_type बाइट के लिए इनकी व्याख्या अलग-अलग तरीके से की जाती है. हालांकि, ये हमेशा लिटिल-एंडियन होते हैं. ज़्यादा जानकारी के लिए, यहां दी गई वैल्यू की अलग-अलग परिभाषाएं देखें.

वैल्यू के फ़ॉर्मैट

नाम टाइप करें value_type value_arg फ़ॉर्मैट value फ़ॉर्मैट ब्यौरा
VALUE_BYTE 0x00 (कोई नहीं; 0 होना चाहिए) ubyte[1] एक बाइट की पूर्णांक वैल्यू
VALUE_SHORT 0x02 साइज़ - 1 (0…1) ubyte[size] साइन की गई दो बाइट वाली पूर्णांक वैल्यू, साइन-एक्सटेंड की गई
VALUE_CHAR 0x03 साइज़ - 1 (0…1) ubyte[size] बिना साइन की गई दो बाइट वाली पूर्णांक वैल्यू, जिसे शून्य से बढ़ाया गया है
VALUE_INT 0x04 साइज़ - 1 (0…3) ubyte[size] साइन की गई चार बाइट वाली पूर्णांक वैल्यू, साइन-एक्सटेंड की गई
VALUE_LONG 0x06 साइज़ - 1 (0…7) ubyte[size] साइन की गई आठ-बाइट की पूर्णांक वैल्यू, साइन-एक्सटेंड की गई
VALUE_FLOAT 0x10 साइज़ - 1 (0…3) ubyte[size] चार बाइट का बिट पैटर्न, जिसमें दाईं ओर शून्य जोड़े गए हों. साथ ही, इसे IEEE754 32-बिट फ़्लोटिंग पॉइंट वैल्यू के तौर पर समझा गया हो
VALUE_DOUBLE 0x11 साइज़ - 1 (0…7) ubyte[size] आठ-बाइट का बिट पैटर्न, जिसे दाईं ओर से शून्य बढ़ाया गया है. साथ ही, इसे IEEE754 64-बिट फ़्लोटिंग पॉइंट वैल्यू के तौर पर समझा जाता है
VALUE_METHOD_TYPE 0x15 साइज़ - 1 (0…3) ubyte[size] बिना हस्ताक्षर वाली (शून्य से बढ़ी हुई) चार बाइट वाली पूर्णांक वैल्यू, proto_ids सेक्शन में इंडेक्स के तौर पर इंटरप्रेट की जाती है और यह किसी तरीके की टाइप वैल्यू को दिखाती है
VALUE_METHOD_HANDLE 0x16 साइज़ - 1 (0…3) ubyte[size] बिना हस्ताक्षर वाली (शून्य-बढ़ी हुई) चार बाइट वाली पूर्णांक वैल्यू, method_handles सेक्शन में इंडेक्स के तौर पर इंटरप्रेट की जाती है और यह एक मेथड हैंडल वैल्यू को दिखाती है
VALUE_STRING 0x17 साइज़ - 1 (0…3) ubyte[size] बिना हस्ताक्षर वाली (शून्य-बढ़ी हुई) चार-बाइट पूर्णांक वैल्यू, जिसे string_ids सेक्शन में इंडेक्स के तौर पर समझा जाता है और जो स्ट्रिंग वैल्यू को दिखाता है
VALUE_TYPE 0x18 साइज़ - 1 (0…3) ubyte[size] बिना हस्ताक्षर वाली (शून्य-बढ़ी हुई) चार बाइट वाली पूर्णांक वैल्यू, type_ids सेक्शन में इंडेक्स के तौर पर इंटरप्रेट की जाती है और रिफ़्लेक्टिव टाइप/क्लास वैल्यू को दिखाती है
VALUE_FIELD 0x19 साइज़ - 1 (0…3) ubyte[size] बिना हस्ताक्षर वाली (शून्य-बढ़ी हुई) चार-बाइट पूर्णांक वैल्यू, जिसे field_ids सेक्शन में इंडेक्स के तौर पर समझा जाता है और जो रिफ़्लेक्टिव फ़ील्ड वैल्यू को दिखाता है
VALUE_METHOD 0x1a साइज़ - 1 (0…3) ubyte[size] बिना हस्ताक्षर वाली (शून्य-बढ़ी हुई) चार बाइट वाली पूर्णांक वैल्यू, method_ids सेक्शन में इंडेक्स के तौर पर इंटरप्रेट की जाती है और रिफ़्लेक्टिव मेथड वैल्यू को दिखाती है
VALUE_ENUM 0x1b साइज़ - 1 (0…3) ubyte[size] बिना हस्ताक्षर वाली (शून्य-बढ़ी हुई) चार-बाइट पूर्णांक वैल्यू, field_ids सेक्शन में इंडेक्स के तौर पर इंटरप्रेट की जाती है. साथ ही, यह गिनती किए गए टाइप के कॉन्स्टेंट की वैल्यू को दिखाती है
VALUE_ARRAY 0x1c (कोई नहीं; 0 होना चाहिए) encoded_array वैल्यू का एक ऐरे, जो नीचे दिए गए "encoded_array फ़ॉर्मैट" में बताया गया है. value का साइज़, एन्कोडिंग में शामिल होता है.
VALUE_ANNOTATION 0x1d (कोई नहीं; 0 होना चाहिए) encoded_annotation उप-एनोटेशन, नीचे दिए गए "encoded_annotation फ़ॉर्मैट" में होना चाहिए. value का साइज़, एन्कोडिंग में शामिल होता है.
VALUE_NULL 0x1e (कोई नहीं; 0 होना चाहिए) (कोई नहीं) null रेफ़रंस वैल्यू
VALUE_BOOLEAN 0x1f बूलियन (0…1) (कोई नहीं) एक बिट वाली वैल्यू; false के लिए 0 और true के लिए 1. बिट को value_arg में दिखाया गया है.

encoded_array फ़ॉर्मैट

नाम फ़ॉर्मैट ब्यौरा
size uleb128 ऐरे में मौजूद एलिमेंट की संख्या
values encoded_value[size] size encoded_value बाइट सीक्वेंस की एक सीरीज़ होती है. यह सीरीज़, इस सेक्शन में बताए गए फ़ॉर्मैट में होती है. साथ ही, इसे क्रम से जोड़ा जाता है.

encoded_annotation फ़ॉर्मैट

नाम फ़ॉर्मैट ब्यौरा
type_idx uleb128 एनोटेशन का टाइप. यह क्लास (ऐरे या प्रिमिटिव नहीं) टाइप होना चाहिए.
size uleb128 इस एनोटेशन में नाम-वैल्यू मैपिंग की संख्या
तत्व annotation_element[size] एनोटेशन के एलिमेंट, जिन्हें सीधे तौर पर इनलाइन (ऑफ़सेट के तौर पर नहीं) दिखाया जाता है. तत्वों को string_id इंडेक्स के हिसाब से बढ़ते क्रम में क्रमबद्ध किया जाना चाहिए.

annotation_element फ़ॉर्मैट

नाम फ़ॉर्मैट ब्यौरा
name_idx uleb128 एलिमेंट का नाम, जिसे string_ids सेक्शन में इंडेक्स के तौर पर दिखाया जाता है. स्ट्रिंग, ऊपर बताए गए MemberName के सिंटैक्स के मुताबिक होनी चाहिए.
मान encoded_value तत्व की वैल्यू

स्ट्रिंग सिंटैक्स

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

SimpleName

SimpleName, अन्य चीज़ों के नामों के सिंटैक्स का आधार होता है. इस .dex फ़ॉर्मैट में, काफ़ी हद तक बदलाव करने की अनुमति होती है. यह सुविधा, सोर्स के तौर पर इस्तेमाल की जाने वाली ज़्यादातर भाषाओं के मुकाबले बेहतर है. संक्षेप में, किसी सामान्य नाम में लो-ASCII के वर्णमाला वाले वर्ण या अंक, कुछ खास लो-ASCII सिंबल, और ज़्यादातर नॉन-ASCII कोड पॉइंट शामिल होते हैं. हालांकि, इनमें कंट्रोल, स्पेस या खास वर्ण शामिल नहीं होते. वर्शन 040 से, इस फ़ॉर्मैट में स्पेस वाले वर्ण (यूनिकोड Zs कैटगरी) भी इस्तेमाल किए जा सकते हैं. ध्यान दें कि सरोगेट कोड पॉइंट (U+d800U+dfff की रेंज में) को नाम के मान्य वर्ण नहीं माना जाता. हालांकि, यूनिकोड के पूरक वर्ण मान्य होते हैं. इन्हें SimpleNameChar के नियम के आखिरी विकल्प के तौर पर दिखाया जाता है. इन्हें MUTF-8 एन्कोडिंग में सरोगेट कोड पॉइंट के जोड़े के तौर पर फ़ाइल में दिखाया जाना चाहिए.

SimpleName
SimpleNameChar (SimpleNameChar)*
SimpleNameChar
'A''Z'
| 'a''z'
| '0''9'
| ' ' डेक्स के वर्शन 040 के बाद से
| '$'
| '-'
| '_'
| U+00a0 डेक्स के वर्शन 040 के बाद से
| U+00a1U+1fff
| U+2000U+200a डेक्स के वर्शन 040 के बाद से
| U+2010U+2027
| U+202f डेक्स के वर्शन 040 के बाद से
| U+2030U+d7ff
| U+e000U+ffef
| U+10000U+10ffff

MemberName

इसका इस्तेमाल field_id_item और method_id_item करते हैं

MemberName, क्लास के किसी सदस्य का नाम होता है. सदस्य, फ़ील्ड, तरीके, और इनर क्लास होते हैं.

MemberName
SimpleName
| '<' SimpleName '>'

FullClassName

FullClassName, पूरी तरह क्वालिफ़ाइड क्लास का नाम होता है. इसमें पैकेज स्पेसिफ़ायर (ज़रूरी नहीं) और उसके बाद ज़रूरी नाम शामिल होता है.

FullClassName
OptionalPackagePrefix SimpleName
OptionalPackagePrefix
(SimpleName '/')*

TypeDescriptor

इस कुकी का इस्तेमाल type_id_item करता है

TypeDescriptor, किसी भी टाइप का प्रतिनिधित्व करता है. इसमें प्रिमिटिव, क्लास, ऐरे, और void शामिल हैं. अलग-अलग वर्शन का मतलब जानने के लिए, यहां देखें.

TypeDescriptor
'V'
| FieldTypeDescriptor
FieldTypeDescriptor
NonArrayFieldTypeDescriptor
| ('[' * 1…255) NonArrayFieldTypeDescriptor
NonArrayFieldTypeDescriptor
'Z'
| 'B'
| 'S'
| 'C'
| 'I'
| 'J'
| 'F'
| 'D'
| 'L' FullClassName ';'

ShortyDescriptor

proto_id_item ने इस्तेमाल किया

ShortyDescriptor, किसी तरीके के प्रोटोटाइप का छोटा वर्शन होता है. इसमें रिटर्न और पैरामीटर टाइप शामिल होते हैं. हालांकि, अलग-अलग रेफ़रंस (क्लास या ऐरे) टाइप के बीच कोई अंतर नहीं होता है. इसके बजाय, सभी रेफ़रंस टाइप को एक ही 'L' वर्ण से दिखाया जाता है.

ShortyDescriptor
ShortyReturnType (ShortyFieldType)*
ShortyReturnType
'V'
| ShortyFieldType
ShortyFieldType
'Z'
| 'B'
| 'S'
| 'C'
| 'I'
| 'J'
| 'F'
| 'D'
| 'L'

TypeDescriptor सिमैंटिक्स

यहां TypeDescriptor के हर वैरिएंट का मतलब बताया गया है.

वाक्य-विन्यास मतलब
V void; सिर्फ़ सामान लौटाने के टाइप के लिए मान्य है
Z boolean
B byte
S short
C char
I int
J long
F float
D double
Lfully/qualified/Name; क्लास fully.qualified.Name
[descriptor descriptor का ऐरे, जिसका इस्तेमाल ऐरे-ऑफ़-ऐरे के लिए बार-बार किया जा सकता है. हालांकि, 255 से ज़्यादा डाइमेंशन का इस्तेमाल करना अमान्य है.

आइटम और उनसे जुड़े स्ट्रक्चर

इस सेक्शन में, टॉप-लेवल के हर आइटम की परिभाषाएं शामिल होती हैं. ये आइटम, .dex फ़ाइल में दिख सकते हैं.

header_item

यह हेडर सेक्शन में दिखता है

अलाइनमेंट: 4 बाइट

नाम फ़ॉर्मैट ब्यौरा
जादू ubyte[8] = DEX_FILE_MAGIC मैजिक वैल्यू. ज़्यादा जानकारी के लिए, ऊपर "DEX_FILE_MAGIC" में दी गई चर्चा देखें.
चेकसम uint फ़ाइल के बाकी हिस्से का adler32 चेकसम (magic और इस फ़ील्ड को छोड़कर); इसका इस्तेमाल फ़ाइल के खराब होने का पता लगाने के लिए किया जाता है
हस्ताक्षर ubyte[20] फ़ाइल के बाकी हिस्से का SHA-1 सिग्नेचर (हैश) (magic, checksum, और इस फ़ील्ड को छोड़कर); इसका इस्तेमाल फ़ाइलों की पहचान करने के लिए किया जाता है
file_size uint

पूरी फ़ाइल का साइज़ (हेडर शामिल है), बाइट में (v40 या इससे पहले का वर्शन)

इस हेडर की शुरुआत से लेकर अगले हेडर या पूरी फ़ाइल (कंटेनर) के आखिर तक की दूरी, बाइट में. (v41 या इसके बाद का वर्शन)

header_size uint

हेडर का साइज़ (यह पूरा सेक्शन), बाइट में. इससे फ़ॉर्मैट को अमान्य किए बिना, कम से कम कुछ हद तक पीछे/आगे की ओर ले जाने की सुविधा मिलती है.

इसका साइज़ 0x70 (112) बाइट होना चाहिए (v40 या इससे पहले का वर्शन)

इसका साइज़ 0x78 (120) बाइट होना चाहिए (v41 या उसके बाद के वर्शन)

endian_tag uint = ENDIAN_CONSTANT एंडियननेस टैग. ज़्यादा जानकारी के लिए, ऊपर "ENDIAN_CONSTANT और REVERSE_ENDIAN_CONSTANT" में दी गई चर्चा देखें.
link_size uint लिंक सेक्शन का साइज़ या अगर यह फ़ाइल स्टैटिक तौर पर लिंक नहीं की गई है, तो 0
link_off uint फ़ाइल की शुरुआत से लेकर लिंक सेक्शन तक का ऑफ़सेट या 0 अगर link_size == 0. अगर ऑफ़सेट शून्य नहीं है, तो यह link_data सेक्शन में मौजूद किसी ऑफ़सेट पर होना चाहिए. इस दस्तावेज़ में, पॉइंट किए गए डेटा के फ़ॉर्मैट के बारे में नहीं बताया गया है. इस हेडर फ़ील्ड (और पिछले हेडर फ़ील्ड) को रनटाइम के दौरान लागू करने के लिए, हुक के तौर पर छोड़ दिया गया है.
map_off uint फ़ाइल की शुरुआत से लेकर मैप किए गए आइटम तक का ऑफ़सेट. ऑफ़सेट की वैल्यू शून्य नहीं होनी चाहिए. साथ ही, यह data सेक्शन में मौजूद ऑफ़सेट से मेल खानी चाहिए. इसके अलावा, डेटा "map_list" में दिए गए फ़ॉर्मैट में होना चाहिए.
string_ids_size uint स्ट्रिंग आइडेंटिफ़ायर की सूची में स्ट्रिंग की संख्या
string_ids_off uint फ़ाइल की शुरुआत से लेकर स्ट्रिंग आइडेंटिफ़ायर की सूची तक का ऑफ़सेट या 0 if string_ids_size == 0 (admittedly a strange edge case). अगर ऑफ़सेट शून्य नहीं है, तो यह string_ids सेक्शन की शुरुआत में होना चाहिए.
type_ids_size uint टाइप आइडेंटिफ़ायर की सूची में मौजूद एलिमेंट की संख्या. यह ज़्यादा से ज़्यादा 65, 535 हो सकती है
type_ids_off uint फ़ाइल की शुरुआत से लेकर टाइप आइडेंटिफ़ायर की सूची तक का ऑफ़सेट या 0 if type_ids_size == 0 (यह एक अजीब तरह का एज केस है). अगर ऑफ़सेट शून्य नहीं है, तो यह type_ids सेक्शन की शुरुआत में होना चाहिए.
proto_ids_size uint प्रोटोटाइप आइडेंटिफ़ायर की सूची में मौजूद एलिमेंट की संख्या. यह ज़्यादा से ज़्यादा 65, 535 हो सकती है
proto_ids_off uint फ़ाइल की शुरुआत से लेकर प्रोटोटाइप आइडेंटिफ़ायर की सूची तक का ऑफ़सेट या 0 अगर proto_ids_size == 0 (यह एक अजीब तरह का एज केस है). अगर ऑफ़सेट शून्य नहीं है, तो यह proto_ids सेक्शन की शुरुआत में होना चाहिए.
field_ids_size uint फ़ील्ड आइडेंटिफ़ायर की सूची में मौजूद एलिमेंट की संख्या
field_ids_off uint फ़ाइल की शुरुआत से लेकर फ़ील्ड आइडेंटिफ़ायर की सूची तक का ऑफ़सेट या 0 अगर field_ids_size == 0. अगर ऑफ़सेट शून्य नहीं है, तो यह field_ids सेक्शन की शुरुआत में होना चाहिए.
method_ids_size uint मेथड आइडेंटिफ़ायर की सूची में मौजूद एलिमेंट की संख्या
method_ids_off uint फ़ाइल की शुरुआत से लेकर, तरीके के आइडेंटिफ़ायर की सूची तक का ऑफ़सेट या 0 if method_ids_size == 0. अगर ऑफ़सेट शून्य नहीं है, तो यह method_ids सेक्शन की शुरुआत में होना चाहिए.
class_defs_size uint क्लास की परिभाषाओं की सूची में मौजूद एलिमेंट की संख्या
class_defs_off uint फ़ाइल की शुरुआत से लेकर क्लास की परिभाषाओं की सूची तक का ऑफ़सेट या 0 अगर class_defs_size == 0 (यह एक अजीब तरह का एज केस है). अगर ऑफ़सेट शून्य नहीं है, तो यह class_defs सेक्शन की शुरुआत में होना चाहिए.
data_size uint

बाइट में data सेक्शन का साइज़. यह sizeof(uint) का सम गुणज होना चाहिए. (v40 या इससे पहले का वर्शन)

इस्तेमाल नहीं किया गया (v41 या इसके बाद का वर्शन)

data_off uint

फ़ाइल की शुरुआत से लेकर data सेक्शन की शुरुआत तक का ऑफ़सेट (v40 या इससे पहले का वर्शन)

इस्तेमाल नहीं किया गया (v41 या इसके बाद का वर्शन)

container_size uint

यह फ़ील्ड मौजूद नहीं है. इसे file_size के बराबर माना जा सकता है. (v40 या इससे पहले का वर्शन)

पूरी फ़ाइल का साइज़ (इसमें अन्य डेक्स हेडर और उनका डेटा भी शामिल है). (v41 या इसके बाद का वर्शन)

header_offset uint

यह फ़ील्ड मौजूद नहीं है. इसे 0 के बराबर माना जा सकता है. (v40 या इससे पहले का वर्शन)

फ़ाइल की शुरुआत से लेकर इस हेडर की शुरुआत तक का ऑफ़सेट. (v41 या इसके बाद का वर्शन)

map_list

डेटा सेक्शन में दिखता है

इसे header_item से रेफ़र किया गया है

अलाइनमेंट: 4 बाइट

यह किसी फ़ाइल के पूरे कॉन्टेंट की क्रम से लगाई गई सूची है. इसमें header_item के मुकाबले कुछ जानकारी दोहराई गई है. हालांकि, इसे पूरे फ़ाइल पर दोहराने के लिए, इस्तेमाल में आसान फ़ॉर्म के तौर पर बनाया गया है. किसी मैप में एक टाइप ज़्यादा से ज़्यादा एक बार दिखना चाहिए. हालांकि, टाइप के दिखने के क्रम पर कोई पाबंदी नहीं है. इसके अलावा, फ़ॉर्मैट के बाकी हिस्से से जुड़ी पाबंदियां भी लागू होती हैं. उदाहरण के लिए, header सेक्शन सबसे पहले दिखना चाहिए. इसके बाद, string_ids सेक्शन वगैरह दिखना चाहिए. इसके अलावा, मैप की एंट्री को शुरुआती ऑफ़सेट के हिसाब से क्रम में लगाया जाना चाहिए और वे ओवरलैप नहीं होनी चाहिए.

नाम फ़ॉर्मैट ब्यौरा
size uint लिस्ट का साइज़, एंट्री में
सूची map_item[size] सूची में मौजूद एलिमेंट

map_item फ़ॉर्मैट

नाम फ़ॉर्मैट ब्यौरा
टाइप ushort आइटम का टाइप; नीचे दी गई टेबल देखें
unused ushort (इस्तेमाल नहीं किया गया)
size uint बताए गए ऑफ़सेट पर मिलने वाले आइटम की संख्या
ऑफ़सेट uint फ़ाइल की शुरुआत से लेकर, समस्या वाले आइटम तक का ऑफ़सेट

कोड टाइप करना

आइटम का प्रकार कॉन्स्टेंट वैल्यू बाइट में आइटम का साइज़
header_item TYPE_HEADER_ITEM 0x0000 0x70
string_id_item TYPE_STRING_ID_ITEM 0x0001 0x04
type_id_item TYPE_TYPE_ID_ITEM 0x0002 0x04
proto_id_item TYPE_PROTO_ID_ITEM 0x0003 0x0c
field_id_item TYPE_FIELD_ID_ITEM 0x0004 0x08
method_id_item TYPE_METHOD_ID_ITEM 0x0005 0x08
class_def_item TYPE_CLASS_DEF_ITEM 0x0006 0x20
call_site_id_item TYPE_CALL_SITE_ID_ITEM 0x0007 0x04
method_handle_item TYPE_METHOD_HANDLE_ITEM 0x0008 0x08
map_list TYPE_MAP_LIST 0x1000 4 + (item.size * 12)
type_list TYPE_TYPE_LIST 0x1001 4 + (item.size * 2)
annotation_set_ref_list TYPE_ANNOTATION_SET_REF_LIST 0x1002 4 + (item.size * 4)
annotation_set_item TYPE_ANNOTATION_SET_ITEM 0x1003 4 + (item.size * 4)
class_data_item TYPE_CLASS_DATA_ITEM 0x2000 implicit; must parse
code_item TYPE_CODE_ITEM 0x2001 implicit; must parse
string_data_item TYPE_STRING_DATA_ITEM 0x2002 implicit; must parse
debug_info_item TYPE_DEBUG_INFO_ITEM 0x2003 implicit; must parse
annotation_item TYPE_ANNOTATION_ITEM 0x2004 implicit; must parse
encoded_array_item TYPE_ENCODED_ARRAY_ITEM 0x2005 implicit; must parse
annotations_directory_item TYPE_ANNOTATIONS_DIRECTORY_ITEM 0x2006 implicit; must parse
hiddenapi_class_data_item TYPE_HIDDENAPI_CLASS_DATA_ITEM 0xF000 implicit; must parse

string_id_item

यह string_ids सेक्शन में दिखता है

अलाइनमेंट: 4 बाइट

नाम फ़ॉर्मैट ब्यौरा
string_data_off uint इस आइटम के लिए, फ़ाइल की शुरुआत से स्ट्रिंग डेटा तक का ऑफ़सेट. ऑफ़सेट, data सेक्शन में मौजूद किसी जगह का होना चाहिए. साथ ही, डेटा यहां दिए गए "string_data_item" फ़ॉर्मैट में होना चाहिए. ऑफ़सेट के लिए अलाइनमेंट की कोई ज़रूरत नहीं है.

string_data_item

डेटा सेक्शन में दिखता है

अलाइनमेंट: कोई नहीं (बाइट के हिसाब से अलाइन किया गया)

नाम फ़ॉर्मैट ब्यौरा
utf16_size uleb128 इस स्ट्रिंग का साइज़, UTF-16 कोड यूनिट में होता है. इसे कई सिस्टम में "स्ट्रिंग की लंबाई" कहा जाता है. इसका मतलब है कि यह स्ट्रिंग की डिकोड की गई लंबाई है. (एनकोड की गई लंबाई, 0 बाइट की पोज़िशन से तय होती है.)
डेटा ubyte[] MUTF-8 कोड यूनिट (इसे ऑक्टेट या बाइट भी कहा जाता है) की एक सीरीज़ इसके बाद, 0 वैल्यू वाला एक बाइट. डेटा फ़ॉर्मैट के बारे में ज़्यादा जानने और चर्चा करने के लिए, ऊपर दिया गया "MUTF-8 (बदला गया UTF-8) एन्कोडिंग" सेक्शन देखें.

ध्यान दें: ऐसी स्ट्रिंग का इस्तेमाल किया जा सकता है जिसमें UTF-16 सरोगेट कोड यूनिट (यानी, U+d800U+dfff) का एन्कोड किया गया फ़ॉर्म शामिल हो. ये यूनिट, UTF-16 में यूनिकोड के सामान्य एन्कोडिंग के हिसाब से अलग-अलग या क्रम से बाहर हो सकती हैं. अगर स्ट्रिंग का इस्तेमाल किसी बड़े लेवल पर किया जा रहा है, तो उसके पास यह अधिकार होता है कि वह इस तरह की अमान्य एन्कोडिंग को अस्वीकार कर दे.

type_id_item

यह type_ids सेक्शन में दिखता है

अलाइनमेंट: 4 बाइट

नाम फ़ॉर्मैट ब्यौरा
descriptor_idx uint इस तरह की डिस्क्रिप्टर स्ट्रिंग के लिए, string_ids सूची में इंडेक्स. स्ट्रिंग, ऊपर बताए गए TypeDescriptor के सिंटैक्स के मुताबिक होनी चाहिए.

proto_id_item

proto_ids सेक्शन में दिखता है

अलाइनमेंट: 4 बाइट

नाम फ़ॉर्मैट ब्यौरा
shorty_idx uint इस प्रोटोटाइप के शॉर्ट-फ़ॉर्म डिस्क्रिप्टर स्ट्रिंग के लिए, string_ids सूची में इंडेक्स करें. स्ट्रिंग, ऊपर बताए गए ShortyDescriptor के सिंटैक्स के मुताबिक होनी चाहिए. साथ ही, यह इस आइटम के रिटर्न टाइप और पैरामीटर से मेल खानी चाहिए.
return_type_idx uint इस प्रोटोटाइप के रिटर्न टाइप के लिए, type_ids सूची में इंडेक्स
parameters_off uint इस प्रोटोटाइप के लिए, फ़ाइल की शुरुआत से लेकर पैरामीटर टाइप की सूची तक का ऑफ़सेट या अगर इस प्रोटोटाइप में कोई पैरामीटर नहीं है, तो 0. अगर यह ऑफ़सेट शून्य नहीं है, तो इसे data सेक्शन में होना चाहिए. साथ ही, इसमें मौजूद डेटा, नीचे दिए गए "type_list" के फ़ॉर्मैट में होना चाहिए. इसके अलावा, सूची में void टाइप का कोई रेफ़रंस नहीं होना चाहिए.

field_id_item

यह फ़ील्ड_आईडी सेक्शन में दिखता है

अलाइनमेंट: 4 बाइट

नाम फ़ॉर्मैट ब्यौरा
class_idx ushort इस फ़ील्ड को तय करने वाले व्यक्ति के लिए, type_ids सूची में इंडेक्स. यह क्लास टाइप होना चाहिए, न कि ऐरे या प्रिमिटिव टाइप.
type_idx ushort इस फ़ील्ड के टाइप के लिए type_ids सूची में इंडेक्स
name_idx uint इस फ़ील्ड के नाम के लिए, string_ids सूची में इंडेक्स करें. स्ट्रिंग, ऊपर बताए गए MemberName के सिंटैक्स के मुताबिक होनी चाहिए.

method_id_item

method_ids सेक्शन में दिखता है

अलाइनमेंट: 4 बाइट

नाम फ़ॉर्मैट ब्यौरा
class_idx ushort इस तरीके को तय करने वाले के लिए, type_ids सूची में इंडेक्स. यह क्लास या ऐरे टाइप होना चाहिए, न कि प्रिमिटिव टाइप.
proto_idx ushort इस तरीके के प्रोटोटाइप के लिए, proto_ids सूची में इंडेक्स करें
name_idx uint इस तरीके के नाम के लिए, string_ids सूची में इंडेक्स करें. स्ट्रिंग, ऊपर बताए गए MemberName के सिंटैक्स के मुताबिक होनी चाहिए.

class_def_item

यह class_defs सेक्शन में दिखता है

अलाइनमेंट: 4 बाइट

नाम फ़ॉर्मैट ब्यौरा
class_idx uint इस क्लास के लिए type_ids सूची में इंडेक्स. यह क्लास टाइप होना चाहिए, न कि ऐरे या प्रिमिटिव टाइप.
access_flags uint क्लास के लिए ऐक्सेस फ़्लैग (public, final वगैरह). ज़्यादा जानकारी के लिए, "access_flags परिभाषाएं" देखें.
superclass_idx uint सुपरक्लास के लिए type_ids सूची में इंडेक्स या अगर इस क्लास में कोई सुपरक्लास नहीं है, तो NO_INDEX की स्थिर वैल्यू (यानी, यह Object जैसी रूट क्लास है). अगर यह मौजूद है, तो यह क्लास टाइप होना चाहिए. साथ ही, यह ऐरे या प्रिमिटिव टाइप नहीं होना चाहिए.
interfaces_off uint इंटरफ़ेस की सूची में फ़ाइल की शुरुआत से ऑफ़सेट या 0 अगर कोई नहीं है. यह ऑफ़सेट, data सेक्शन में होना चाहिए. साथ ही, इसमें मौजूद डेटा, "type_list" में बताए गए फ़ॉर्मैट में होना चाहिए. सूची के हर एलिमेंट का टाइप क्लास होना चाहिए. यह ऐरे या प्रिमिटिव टाइप नहीं होना चाहिए. साथ ही, इसमें कोई डुप्लीकेट नहीं होना चाहिए.
source_file_idx uint string_ids सूची में इंडेक्स किया गया है. यह इंडेक्स, उस फ़ाइल के नाम के लिए है जिसमें इस क्लास का ओरिजनल सोर्स (कम से कम ज़्यादातर) मौजूद है. इसके अलावा, इस जानकारी के न होने पर NO_INDEX वैल्यू का इस्तेमाल किया जाता है. किसी भी तरीके का debug_info_item, इस सोर्स फ़ाइल को बदल सकता है. हालांकि, उम्मीद है कि ज़्यादातर क्लास सिर्फ़ एक सोर्स फ़ाइल से आएंगी.
annotations_off uint इस क्लास के लिए, फ़ाइल की शुरुआत से लेकर एनोटेशन स्ट्रक्चर तक का ऑफ़सेट या अगर इस क्लास में कोई एनोटेशन नहीं है, तो 0. अगर यह ऑफ़सेट शून्य नहीं है, तो इसे data सेक्शन में होना चाहिए. साथ ही, इसमें मौजूद डेटा, नीचे दिए गए "annotations_directory_item" के फ़ॉर्मैट में होना चाहिए. साथ ही, सभी आइटम में इस क्लास को डिफ़ाइनर के तौर पर शामिल किया जाना चाहिए.
class_data_off uint इस आइटम के लिए, फ़ाइल की शुरुआत से लेकर उससे जुड़ी क्लास के डेटा तक का ऑफ़सेट या अगर इस क्लास के लिए कोई क्लास डेटा नहीं है, तो 0. (ऐसा हो सकता है कि यह क्लास, मार्कर इंटरफ़ेस हो.) अगर ऑफ़सेट शून्य नहीं है, तो इसे data सेक्शन में होना चाहिए. साथ ही, इसमें मौजूद डेटा, नीचे दिए गए "class_data_item" में बताए गए फ़ॉर्मैट में होना चाहिए. इसके अलावा, सभी आइटम में इस क्लास को डिफ़ाइनर के तौर पर इस्तेमाल किया जाना चाहिए.
static_values_off uint फ़ाइल की शुरुआत से लेकर static फ़ील्ड की शुरुआती वैल्यू की सूची तक का ऑफ़सेट या अगर कोई वैल्यू नहीं है, तो 0. साथ ही, सभी static फ़ील्ड को 0 या null से शुरू किया जाना है. यह ऑफ़सेट data सेक्शन में होना चाहिए. साथ ही, वहां मौजूद डेटा, यहां दिए गए "encoded_array_item" फ़ॉर्मैट में होना चाहिए. ऐरे का साइज़, इस क्लास में बताए गए static फ़ील्ड की संख्या से ज़्यादा नहीं होना चाहिए. साथ ही, एलिमेंट, static फ़ील्ड से उसी क्रम में मेल खाने चाहिए जिस क्रम में उन्हें field_list में बताया गया है. हर ऐरे एलिमेंट का टाइप, उससे जुड़े फ़ील्ड के तय किए गए टाइप से मेल खाना चाहिए. अगर ऐरे में static फ़ील्ड से कम एलिमेंट हैं, तो बचे हुए फ़ील्ड को टाइप के हिसाब से 0 या null से शुरू किया जाता है.

call_site_id_item

call_site_ids सेक्शन में दिखता है

अलाइनमेंट: 4 बाइट

नाम फ़ॉर्मैट ब्यौरा
call_site_off uint साइट की परिभाषा को कॉल करने के लिए, फ़ाइल की शुरुआत से ऑफ़सेट. ऑफ़सेट, डेटा सेक्शन में होना चाहिए. साथ ही, वहां मौजूद डेटा, नीचे दिए गए "call_site_item" के फ़ॉर्मैट में होना चाहिए.

call_site_item

डेटा सेक्शन में दिखता है

अलाइनमेंट: कोई नहीं (बाइट अलाइन किया गया)

call_site_item, encoded_array_item होता है. इसके एलिमेंट, बूटस्ट्रैप लिंकर के तरीके को दिए गए आर्ग्युमेंट से मेल खाते हैं. पहले तीन तर्क ये हैं:

  1. बूटस्ट्रैप लिंकर के तरीके (VALUE_METHOD_HANDLE) को दिखाने वाला एक तरीका हैंडल.
  2. यह एक ऐसे तरीके का नाम है जिसे बूटस्ट्रैप लिंकर को हल करना चाहिए (VALUE_STRING).
  3. हल किए जाने वाले तरीके के नाम के टाइप (VALUE_METHOD_TYPE) से मेल खाने वाला तरीका.

कोई भी अतिरिक्त आर्ग्युमेंट, बूटस्ट्रैप लिंकर के तरीके को पास की गई स्थिर वैल्यू होती हैं. इन आर्ग्युमेंट को क्रम से और बिना किसी टाइप कन्वर्ज़न के पास किया जाता है.

बूटस्ट्रैप लिंकर मेथड को दिखाने वाले मेथड हैंडल का रिटर्न टाइप java.lang.invoke.CallSite होना चाहिए. पहले तीन पैरामीटर टाइप ये हैं:

  1. java.lang.invoke.Lookup
  2. java.lang.String
  3. java.lang.invoke.MethodType

किसी भी अतिरिक्त आर्ग्युमेंट के पैरामीटर टाइप, उनकी कॉन्स्टेंट वैल्यू से तय किए जाते हैं.

method_handle_item

method_handles सेक्शन में दिखता है

अलाइनमेंट: 4 बाइट

नाम फ़ॉर्मैट ब्यौरा
method_handle_type ushort तरीके के हैंडल का टाइप; नीचे दी गई टेबल देखें
unused ushort (इस्तेमाल नहीं किया गया)
field_or_method_id ushort फ़ील्ड या तरीका आईडी. यह इस बात पर निर्भर करता है कि तरीका हैंडल टाइप, ऐक्सेसर है या तरीका इन्वोकर
unused ushort (इस्तेमाल नहीं किया गया)

तरीके के हैंडल टाइप कोड

कॉन्स्टेंट वैल्यू ब्यौरा
METHOD_HANDLE_TYPE_STATIC_PUT 0x00 मेथड हैंडल, स्टैटिक फ़ील्ड सेटर (ऐक्सेसर) है
METHOD_HANDLE_TYPE_STATIC_GET 0x01 मेथड हैंडल, स्टैटिक फ़ील्ड गेटर (ऐक्सेसर) है
METHOD_HANDLE_TYPE_INSTANCE_PUT 0x02 मेथड हैंडल, इंस्टेंस फ़ील्ड सेटर (ऐक्सेसर) है
METHOD_HANDLE_TYPE_INSTANCE_GET 0x03 मेथड हैंडल, इंस्टेंस फ़ील्ड गेटर (ऐक्सेसर) है
METHOD_HANDLE_TYPE_INVOKE_STATIC 0x04 मेथड हैंडल, स्टैटिक तरीके से इनवोक करने वाला होता है
METHOD_HANDLE_TYPE_INVOKE_INSTANCE 0x05 मेथड हैंडल, इंस्टेंस मेथड इन्वोकर है
METHOD_HANDLE_TYPE_INVOKE_CONSTRUCTOR 0x06 मेथड हैंडल, कंस्ट्रक्टर मेथड इन्वोकर है
METHOD_HANDLE_TYPE_INVOKE_DIRECT 0x07 Method handle, सीधे तौर पर मेथड को कॉल करने वाला होता है
METHOD_HANDLE_TYPE_INVOKE_INTERFACE 0x08 मेथड हैंडल, इंटरफ़ेस मेथड इन्वोकर है

class_data_item

class_def_item से रेफ़र किया गया

डेटा सेक्शन में दिखता है

अलाइनमेंट: कोई नहीं (बाइट के हिसाब से अलाइन किया गया)

नाम फ़ॉर्मैट ब्यौरा
static_fields_size uleb128 इस आइटम में तय किए गए स्टैटिक फ़ील्ड की संख्या
instance_fields_size uleb128 इस आइटम में तय किए गए इंस्टेंस फ़ील्ड की संख्या
direct_methods_size uleb128 इस आइटम में तय किए गए डायरेक्ट मेथड की संख्या
virtual_methods_size uleb128 इस आइटम में तय किए गए वर्चुअल तरीकों की संख्या
static_fields encoded_field[static_fields_size] तय किए गए स्टैटिक फ़ील्ड, जिन्हें एन्कोड किए गए एलिमेंट के क्रम के तौर पर दिखाया जाता है. फ़ील्ड को field_idx के हिसाब से बढ़ते क्रम में लगाया जाना चाहिए.
instance_fields encoded_field[instance_fields_size] तय किए गए इंस्टेंस फ़ील्ड, जिन्हें एन्कोड किए गए एलिमेंट के क्रम के तौर पर दिखाया जाता है. फ़ील्ड को field_idx के हिसाब से बढ़ते क्रम में लगाया जाना चाहिए.
direct_methods encoded_method[direct_methods_size] डिफ़ाइन किए गए डायरेक्ट (static, private या कंस्ट्रक्टर में से कोई भी) तरीके, जिन्हें कोड में बदले गए एलिमेंट के क्रम के तौर पर दिखाया जाता है. तरीकों को method_idx के हिसाब से बढ़ते क्रम में लगाया जाना चाहिए.
virtual_methods encoded_method[virtual_methods_size] तय की गई वर्चुअल (static, private या कंस्ट्रक्टर में से कोई नहीं) विधियां, जिन्हें एन्कोड किए गए एलिमेंट के क्रम के तौर पर दिखाया जाता है. इस सूची में, इनहेरिट किए गए तरीके शामिल नहीं होने चाहिए. हालांकि, अगर इस आइटम को दिखाने वाली क्लास ने उन्हें बदल दिया है, तो उन्हें शामिल किया जा सकता है. तरीकों को method_idx के हिसाब से बढ़ते क्रम में लगाया जाना चाहिए. किसी वर्चुअल तरीके का method_idx, किसी डायरेक्ट तरीके के method_idx के बराबर नहीं होना चाहिए.

ध्यान दें: सभी एलिमेंट के field_id और method_id इंस्टेंस, एक ही क्लास को रेफ़रंस करते हों.

encoded_field फ़ॉर्मैट

नाम फ़ॉर्मैट ब्यौरा
field_idx_diff uleb128 इस फ़ील्ड की पहचान के लिए, field_ids सूची में इंडेक्स (इसमें नाम और डिस्क्रिप्टर शामिल है). इसे सूची में मौजूद पिछले एलिमेंट के इंडेक्स से अंतर के तौर पर दिखाया जाता है. किसी सूची में मौजूद पहले एलिमेंट का इंडेक्स सीधे तौर पर दिखाया जाता है.
access_flags uleb128 फ़ील्ड के लिए ऐक्सेस फ़्लैग (public, final वगैरह). ज़्यादा जानकारी के लिए, "access_flags परिभाषाएं" देखें.

encoded_method फ़ॉर्मैट

नाम फ़ॉर्मैट ब्यौरा
method_idx_diff uleb128 इस तरीके की पहचान के लिए, method_ids सूची में इंडेक्स (इसमें नाम और डिस्क्रिप्टर शामिल है). इसे सूची में मौजूद पिछले एलिमेंट के इंडेक्स से अंतर के तौर पर दिखाया जाता है. किसी सूची में मौजूद पहले एलिमेंट का इंडेक्स सीधे तौर पर दिखाया जाता है.
access_flags uleb128 तरीके के लिए ऐक्सेस फ़्लैग (public, final वगैरह). ज़्यादा जानकारी के लिए, "access_flags परिभाषाएं" देखें.
code_off uleb128 इस तरीके के लिए, फ़ाइल की शुरुआत से कोड स्ट्रक्चर तक का ऑफ़सेट या अगर यह तरीका abstract या native है, तो 0. ऑफ़सेट, data सेक्शन में मौजूद किसी जगह के लिए होना चाहिए. डेटा का फ़ॉर्मैट, यहां दिए गए "code_item" के हिसाब से होता है.

type_list

class_def_item और proto_id_item से रेफ़र किया गया

डेटा सेक्शन में दिखता है

अलाइनमेंट: 4 बाइट

नाम फ़ॉर्मैट ब्यौरा
size uint लिस्ट का साइज़, एंट्री में
सूची type_item[size] सूची में मौजूद एलिमेंट

type_item फ़ॉर्मैट

नाम फ़ॉर्मैट ब्यौरा
type_idx ushort type_ids सूची में इंडेक्स करें

code_item

encoded_method से रेफ़र किया गया

डेटा सेक्शन में दिखता है

अलाइनमेंट: 4 बाइट

नाम फ़ॉर्मैट ब्यौरा
registers_size ushort इस कोड से रजिस्टर किए गए लोगों की संख्या
ins_size ushort इस कोड के लिए, तरीके में आने वाले आर्ग्युमेंट के शब्दों की संख्या
outs_size ushort मेथड इनवोकेशन के लिए, इस कोड को आउटगोइंग आर्ग्युमेंट स्पेस के लिए ज़रूरी शब्दों की संख्या
tries_size ushort इस इंस्टेंस के लिए try_item की संख्या. अगर यह शून्य नहीं है, तो इस इंस्टेंस में insns के ठीक बाद, ये tries कलेक्शन के तौर पर दिखते हैं.
debug_info_off uint इस कोड के लिए, फ़ाइल की शुरुआत से डीबग करने की जानकारी (लाइन नंबर + स्थानीय वैरिएबल की जानकारी) के क्रम तक का ऑफ़सेट या 0, अगर कोई जानकारी नहीं है. अगर ऑफ़सेट शून्य नहीं है, तो वह data सेक्शन में मौजूद किसी जगह के लिए होना चाहिए. डेटा के फ़ॉर्मैट के बारे में यहां "debug_info_item" बताया गया है.
insns_size uint निर्देशों की सूची का साइज़, 16-बिट कोड यूनिट में
insns ushort[insns_size] बाइटकोड का असल कलेक्शन. insnsऐरे में कोड का फ़ॉर्मैट, साथ में दिए गए दस्तावेज़ Dalvik bytecode में बताया गया है. ध्यान दें कि इसे ushort के ऐरे के तौर पर तय किया गया है. हालांकि, कुछ इंटरनल स्ट्रक्चर में चार बाइट अलाइनमेंट का इस्तेमाल किया जाता है. इसके अलावा, अगर यह एंडियन-स्वैप की गई फ़ाइल में है, तो स्वैपिंग सिर्फ़ अलग-अलग ushort इंस्टेंस पर की जाती है. साथ ही, यह बड़े इंटरनल स्ट्रक्चर पर नहीं की जाती.
पैडिंग ushort (ज़रूरी नहीं) = 0 tries को चार बाइट के साथ अलाइन करने के लिए, दो बाइट की पैडिंग. यह एलिमेंट सिर्फ़ तब मौजूद होता है, जब tries_size की वैल्यू शून्य से ज़्यादा हो और insns_size की वैल्यू विषम हो.
प्रयास try_item[tries_size] (ज़रूरी नहीं) यह एक ऐसा कलेक्शन होता है जो यह बताता है कि कोड में अपवाद कहां पकड़े जाते हैं और उन्हें कैसे हैंडल किया जाता है. ऐरे के एलिमेंट, रेंज में ओवरलैप नहीं होने चाहिए. साथ ही, वे कम से ज़्यादा पते के क्रम में होने चाहिए. यह एलिमेंट सिर्फ़ तब मौजूद होता है, जब tries_size की वैल्यू शून्य नहीं होती.
हैंडलर encoded_catch_handler_list (ज़रूरी नहीं) बाइट, जो कैच टाइप और उनसे जुड़े हैंडलर पतों की सूचियों की सूची को दिखाती हैं. हर try_item में इस स्ट्रक्चर के लिए बाइट-वाइज़ ऑफ़सेट होता है. यह एलिमेंट सिर्फ़ तब मौजूद होता है, जब tries_size की वैल्यू शून्य से ज़्यादा हो.

try_item फ़ॉर्मैट

नाम फ़ॉर्मैट ब्यौरा
start_addr uint इस एंट्री में शामिल कोड ब्लॉक का शुरुआती पता. यह पता, पहले कवर किए गए निर्देश की शुरुआत में 16-बिट कोड यूनिट की संख्या है.
insn_count ushort इस एंट्री में शामिल 16-बिट कोड यूनिट की संख्या. पिछली बार जिस कोड यूनिट को कवर किया गया था वह start_addr + insn_count - 1 है.
handler_off ushort इस एंट्री के लिए, encoded_catch_hander_list की शुरुआत से लेकर encoded_catch_handler तक का ऑफ़सेट, बाइट में होता है. यह encoded_catch_handler के शुरू होने का ऑफ़सेट होना चाहिए.

encoded_catch_handler_list फ़ॉर्मैट

नाम फ़ॉर्मैट ब्यौरा
size uleb128 इस सूची का साइज़, एंट्री में
सूची encoded_catch_handler[handlers_size] हैंडलर की सूचियों की असल सूची, जिसे सीधे तौर पर दिखाया गया है (ऑफ़सेट के तौर पर नहीं), और क्रम से जोड़ा गया है

encoded_catch_handler फ़ॉर्मैट

नाम फ़ॉर्मैट ब्यौरा
size sleb128 इस सूची में मौजूद कैच टाइप की संख्या. अगर यह पॉज़िटिव नहीं है, तो यह कैच टाइप की संख्या का नेगेटिव होता है. साथ ही, कैच के बाद कैच-ऑल हैंडलर होता है. उदाहरण के लिए: 0 का size मतलब है कि इसमें कैच-ऑल तो है, लेकिन साफ़ तौर पर टाइप किए गए कैच नहीं हैं. size ऑफ़ 2 का मतलब है कि दो साफ़ तौर पर टाइप किए गए कैच हैं और कोई कैच-ऑल नहीं है. -1 के size का मतलब है कि एक टाइप किया गया कैच और एक कैच-ऑल मौजूद है.
हैंडलर encoded_type_addr_pair[abs(size)] abs(size) एन्कोड किए गए आइटम की स्ट्रीम. इसमें हर तरह के आइटम के लिए एक आइटम होता है. इन्हें उसी क्रम में रखा जाता है जिस क्रम में इनकी जांच की जानी चाहिए.
catch_all_addr uleb128 (ज़रूरी नहीं) कैच-ऑल हैंडलर का बाइटकोड पता. यह एलिमेंट सिर्फ़ तब मौजूद होता है, जब size की वैल्यू पॉज़िटिव न हो.

encoded_type_addr_pair फ़ॉर्मैट

नाम फ़ॉर्मैट ब्यौरा
type_idx uleb128 अपवाद के टाइप के लिए, type_ids सूची में इंडेक्स करें
addr uleb128 जुड़े हुए एक्सेप्शन हैंडलर का बाइटकोड पता

debug_info_item

code_item से रेफ़र किया गया

डेटा सेक्शन में दिखता है

अलाइनमेंट: कोई नहीं (बाइट के हिसाब से अलाइन किया गया)

हर debug_info_item, DWARF3 से मिलती-जुलती बाइट-कोडेड स्टेट मशीन को तय करता है. जब इसकी व्याख्या की जाती है, तो यह debug_info_item के लिए पोज़िशन टेबल और (संभावित तौर पर) लोकल वैरिएबल की जानकारी देता है.code_item यह सीक्वेंस, अलग-अलग लंबाई वाले हेडर से शुरू होता है. इसकी लंबाई, तरीके के पैरामीटर की संख्या पर निर्भर करती है. इसके बाद, स्टेट मशीन के बाइटकोड होते हैं. यह DBG_END_SEQUENCE बाइट के साथ खत्म होता है.

स्टेट मशीन में पांच रजिस्टर होते हैं. address रजिस्टर, 16-बिट कोड यूनिट में, उससे जुड़े insns_item में निर्देश ऑफ़सेट को दिखाता है. debug_info के हर क्रम की शुरुआत में, 0 रजिस्टर 0 से शुरू होता है और इसमें सिर्फ़ बढ़ोतरी होनी चाहिए.address line रजिस्टर से पता चलता है कि सोर्स लाइन नंबर को, स्टेट मशीन से निकलने वाली अगली पोज़िशन टेबल एंट्री से जोड़ा जाना चाहिए. इसे सीक्वेंस हेडर में शुरू किया जाता है. यह वैल्यू, पॉज़िटिव या नेगेटिव दिशाओं में बदल सकती है. हालांकि, यह कभी भी 1 से कम नहीं होनी चाहिए. source_file रजिस्टर, सोर्स फ़ाइल को दिखाता है. लाइन नंबर की एंट्री इसी फ़ाइल से जुड़ी होती हैं. इसे class_def_item में मौजूद source_file_idx की वैल्यू के तौर पर सेट किया जाता है. अन्य दो वैरिएबल, prologue_end और epilogue_begin, बूलियन फ़्लैग हैं. इन्हें false पर सेट किया जाता है. इनसे पता चलता है कि अगली पोज़िशन को मेथड प्रोलॉग या एपिलॉग माना जाना चाहिए या नहीं. स्टेट मशीन को DBG_RESTART_LOCAL कोड के लिए, हर रजिस्टर में मौजूद आखिरी लोकल वैरिएबल के नाम और टाइप को भी ट्रैक करना होगा.

हेडर इस तरह का होता है:

नाम फ़ॉर्मैट ब्यौरा
line_start uleb128 स्टेट मशीन के line रजिस्टर की शुरुआती वैल्यू. इसमें असल पोज़िशन की एंट्री नहीं दिखाई गई है.
parameters_size uleb128 पैरामीटर के नामों की संख्या, जिन्हें कोड में बदला गया है. हर तरीके के पैरामीटर के लिए एक एनोटेशन होना चाहिए. हालांकि, अगर कोई इंस्टेंस तरीका है, तो उसके this को छोड़कर एनोटेशन होना चाहिए.
parameter_names uleb128p1[parameters_size] मेथड पैरामीटर के नाम का स्ट्रिंग इंडेक्स. NO_INDEX की एन्कोड की गई वैल्यू से पता चलता है कि इससे जुड़े पैरामीटर के लिए कोई नाम उपलब्ध नहीं है. टाइप डिस्क्रिप्टर और हस्ताक्षर, तरीके के डिस्क्रिप्टर और हस्ताक्षर से जुड़े होते हैं.

बाइट कोड की वैल्यू यहां दी गई हैं:

नाम वैल्यू फ़ॉर्मैट करें तर्क ब्यौरा
DBG_END_SEQUENCE 0x00 (कोई नहीं) यह कुकी, code_item के लिए डीबग की जानकारी के क्रम को खत्म करती है
DBG_ADVANCE_PC 0x01 uleb128 addr_diff addr_diff: पता रजिस्टर में जोड़ने के लिए रकम यह पोज़िशन की एंट्री जारी किए बिना, पता रजिस्टर करता है
DBG_ADVANCE_LINE 0x02 sleb128 line_diff line_diff: लाइन रजिस्टर में बदलाव करने के लिए रकम यह लाइन रजिस्टर को आगे बढ़ाता है, लेकिन इसमें कोई पोज़िशन एंट्री नहीं होती
DBG_START_LOCAL 0x03 uleb128 register_num
uleb128p1 name_idx
uleb128p1 type_idx
register_num: रजिस्टर, जिसमें local
name_idx: नाम का स्ट्रिंग इंडेक्स
type_idx: टाइप का टाइप इंडेक्स
मौजूदा पते पर एक लोकल वैरिएबल बनाता है. name_idx या type_idx में से किसी एक को NO_INDEX के तौर पर सेट किया जा सकता है. इससे यह पता चलता है कि वैल्यू के बारे में जानकारी नहीं है.
DBG_START_LOCAL_EXTENDED 0x04 uleb128 register_num
uleb128p1 name_idx
uleb128p1 type_idx
uleb128p1 sig_idx
register_num: रजिस्टर, जिसमें local
name_idx: नाम का स्ट्रिंग इंडेक्स
type_idx: टाइप का टाइप इंडेक्स
sig_idx: टाइप सिग्नेचर का स्ट्रिंग इंडेक्स
यह मौजूदा पते पर टाइप सिग्नेचर के साथ एक लोकल वैरिएबल बनाता है. name_idx, type_idx या sig_idx में से किसी भी वैल्यू को NO_INDEX के तौर पर सेट किया जा सकता है. इससे यह पता चलता है कि वैल्यू के बारे में जानकारी नहीं है. (हालांकि, अगर sig_idx -1 है, तो DBG_START_LOCAL ओपकॉड का इस्तेमाल करके, उसी डेटा को ज़्यादा असरदार तरीके से दिखाया जा सकता है.)

ध्यान दें: हस्ताक्षर मैनेज करने से जुड़ी चेतावनियों के बारे में जानने के लिए, नीचे "dalvik.annotation.Signature" में दी गई जानकारी पढ़ें.

DBG_END_LOCAL 0x05 uleb128 register_num register_num: रजिस्टर करें, जिसमें स्थानीय टाइमज़ोन शामिल हो यह फ़ंक्शन, मौजूदा पते पर मौजूद किसी लोकल वैरिएबल को स्कोप से बाहर के तौर पर मार्क करता है
DBG_RESTART_LOCAL 0x06 uleb128 register_num register_num: रीस्टार्ट करने के लिए रजिस्टर करें यह निर्देश, मौजूदा पते पर एक लोकल वैरिएबल को फिर से शुरू करता है. नाम और टाइप, उस रजिस्टर में मौजूद आखिरी लोकल के नाम और टाइप के जैसा ही होता है.
DBG_SET_PROLOGUE_END 0x07 (कोई नहीं) यह prologue_end स्टेट मशीन रजिस्टर सेट करता है. इससे पता चलता है कि जोड़ी गई अगली पोज़िशन एंट्री को, किसी तरीके के प्रोलॉग (तरीके के ब्रेकपॉइंट के लिए सही जगह) का आखिर माना जाना चाहिए. prologue_end रजिस्टर को किसी खास (>= 0x0a) ऑपकोड से मिटाया जाता है.
DBG_SET_EPILOGUE_BEGIN 0x08 (कोई नहीं) यह epilogue_begin स्टेट मशीन रजिस्टर सेट करता है. इससे पता चलता है कि जोड़ी गई अगली पोज़िशन एंट्री को, किसी तरीके के एपिलॉग की शुरुआत माना जाना चाहिए. यह तरीका खत्म होने से पहले, एक्ज़ीक्यूशन को रोकने के लिए सही जगह है. epilogue_begin रजिस्टर को किसी खास (>= 0x0a) ऑपकोड से मिटाया जाता है.
DBG_SET_FILE 0x09 uleb128p1 name_idx name_idx: सोर्स फ़ाइल के नाम का स्ट्रिंग इंडेक्स; NO_INDEX if unknown से पता चलता है कि इसके बाद की सभी लाइन नंबर एंट्री, इस सोर्स फ़ाइल के नाम का रेफ़रंस देती हैं. ये एंट्री, code_item में दिए गए डिफ़ॉल्ट नाम का रेफ़रंस नहीं देती हैं
खास ऑपकोड 0x0a…0xff (कोई नहीं) यह line और address रजिस्टर को आगे बढ़ाता है, एक पोज़िशन एंट्री दिखाता है, और prologue_end और epilogue_begin को मिटाता है. जानकारी के लिए नीचे देखें.

खास ऑपकोड

0x0a और 0xff (दोनों शामिल हैं) के बीच की वैल्यू वाले ऑपकोड, line और address दोनों रजिस्टर को थोड़ी दूरी तक ले जाते हैं. इसके बाद, नई पोज़िशन टेबल एंट्री जारी करते हैं. बढ़ोतरी का फ़ॉर्मूला यहां दिया गया है:

DBG_FIRST_SPECIAL = 0x0a  // the smallest special opcode
DBG_LINE_BASE   = -4      // the smallest line number increment
DBG_LINE_RANGE  = 15      // the number of line increments represented

adjusted_opcode = opcode - DBG_FIRST_SPECIAL

line += DBG_LINE_BASE + (adjusted_opcode % DBG_LINE_RANGE)
address += (adjusted_opcode / DBG_LINE_RANGE)

annotations_directory_item

class_def_item से रेफ़र किया गया

डेटा सेक्शन में दिखता है

अलाइनमेंट: 4 बाइट

नाम फ़ॉर्मैट ब्यौरा
class_annotations_off uint क्लास में सीधे तौर पर किए गए एनोटेशन के लिए, फ़ाइल की शुरुआत से ऑफ़सेट या 0, अगर क्लास में सीधे तौर पर कोई एनोटेशन नहीं है. अगर ऑफ़सेट शून्य नहीं है, तो यह data सेक्शन में मौजूद किसी जगह के लिए होना चाहिए. डेटा का फ़ॉर्मैट, यहां दिए गए "annotation_set_item" से तय होता है.
fields_size uint इस आइटम से एनोटेट किए गए फ़ील्ड की संख्या
annotated_methods_size uint इस आइटम से एनोटेट किए गए तरीकों की संख्या
annotated_parameters_size uint इस आइटम से एनोटेट की गई, तरीके के पैरामीटर की सूचियों की संख्या
field_annotations field_annotation[fields_size] (ज़रूरी नहीं) जुड़े हुए फ़ील्ड एनोटेशन की सूची. सूची के एलिमेंट को field_idx के हिसाब से बढ़ते क्रम में लगाया जाना चाहिए.
method_annotations method_annotation[methods_size] (ज़रूरी नहीं) तरीके से जुड़े एनोटेशन की सूची. सूची के एलिमेंट को method_idx के हिसाब से बढ़ते क्रम में लगाया जाना चाहिए.
parameter_annotations parameter_annotation[parameters_size] (ज़रूरी नहीं) तरीके के पैरामीटर से जुड़े एनोटेशन की सूची. सूची के एलिमेंट को method_idx के हिसाब से बढ़ते क्रम में लगाया जाना चाहिए.

ध्यान दें: सभी एलिमेंट के field_id और method_id इंस्टेंस, एक ही क्लास को रेफ़रंस करते हों.

field_annotation फ़ॉर्मैट

नाम फ़ॉर्मैट ब्यौरा
field_idx uint एनोटेट किए जा रहे फ़ील्ड की पहचान के लिए, field_ids सूची में इंडेक्स
annotations_off uint फ़ाइल की शुरुआत से लेकर फ़ील्ड के एनोटेशन की सूची तक का ऑफ़सेट. ऑफ़सेट, data सेक्शन में मौजूद किसी जगह के लिए होना चाहिए. डेटा का फ़ॉर्मैट, यहां दिए गए "annotation_set_item" के हिसाब से होता है.

method_annotation का फ़ॉर्मैट

नाम फ़ॉर्मैट ब्यौरा
method_idx uint एनोटेट किए जा रहे तरीके की पहचान के लिए, method_ids सूची में इंडेक्स
annotations_off uint फ़ाइल की शुरुआत से लेकर, तरीके के लिए एनोटेशन की सूची तक का ऑफ़सेट. ऑफ़सेट, data सेक्शन में मौजूद किसी जगह के लिए होना चाहिए. डेटा का फ़ॉर्मैट, यहां दिए गए "annotation_set_item" के हिसाब से होता है.

parameter_annotation फ़ॉर्मैट

नाम फ़ॉर्मैट ब्यौरा
method_idx uint जिस तरीके के पैरामीटर एनोटेट किए जा रहे हैं उसकी पहचान के लिए, method_ids लिस्ट में इंडेक्स करें
annotations_off uint फ़ाइल की शुरुआत से लेकर, तरीके के पैरामीटर के लिए एनोटेशन की सूची तक का ऑफ़सेट. ऑफ़सेट, data सेक्शन में मौजूद किसी जगह के लिए होना चाहिए. डेटा का फ़ॉर्मैट, यहां दिए गए "annotation_set_ref_list" के हिसाब से होता है.

annotation_set_ref_list

parameter_annotations_item से रेफ़र किया गया

डेटा सेक्शन में दिखता है

अलाइनमेंट: 4 बाइट

नाम फ़ॉर्मैट ब्यौरा
size uint लिस्ट का साइज़, एंट्री में
सूची annotation_set_ref_item[size] सूची में मौजूद एलिमेंट

annotation_set_ref_item फ़ॉर्मैट

नाम फ़ॉर्मैट ब्यौरा
annotations_off uint फ़ाइल की शुरुआत से लेकर रेफ़रंस किए गए एनोटेशन सेट तक का ऑफ़सेट या 0 अगर इस एलिमेंट के लिए कोई एनोटेशन नहीं है. अगर ऑफ़सेट शून्य नहीं है, तो वह data सेक्शन में मौजूद किसी जगह के लिए होना चाहिए. डेटा का फ़ॉर्मैट, यहां दिए गए "annotation_set_item" के हिसाब से होता है.

annotation_set_item

annotations_directory_item, field_annotations_item, method_annotations_item, और annotation_set_ref_item से रेफ़र किया गया

डेटा सेक्शन में दिखता है

अलाइनमेंट: 4 बाइट

नाम फ़ॉर्मैट ब्यौरा
size uint सेट का साइज़, एंट्री में
एंट्री annotation_off_item[size] सेट के एलिमेंट. एलिमेंट को type_idx के हिसाब से बढ़ते क्रम में लगाया जाना चाहिए.

annotation_off_item फ़ॉर्मैट

नाम फ़ॉर्मैट ब्यौरा
annotation_off uint फ़ाइल की शुरुआत से लेकर एनोटेशन तक का ऑफ़सेट. ऑफ़सेट, data सेक्शन में मौजूद किसी जगह का होना चाहिए. साथ ही, उस जगह पर मौजूद डेटा का फ़ॉर्मैट, नीचे दिए गए "annotation_item" से तय होता है.

annotation_item

annotation_set_item से रेफ़र किया गया

डेटा सेक्शन में दिखता है

अलाइनमेंट: कोई नहीं (बाइट के हिसाब से अलाइन किया गया)

नाम फ़ॉर्मैट ब्यौरा
कैसा दिखाई दे ubyte इस एनोटेशन को दिखाने का मकसद (नीचे देखें)
टिप्‍पणी encoded_annotation एनकोड किए गए एनोटेशन का कॉन्टेंट. यह ऊपर दिए गए "encoded_annotation फ़ॉर्मैट" में "encoded_value एनकोडिंग" के हिसाब से होता है.

विज़िबिलिटी की वैल्यू

annotation_item में visibility फ़ील्ड के लिए ये विकल्प उपलब्ध हैं:

नाम वैल्यू ब्यौरा
VISIBILITY_BUILD 0x00 यह सिर्फ़ बिल्ड टाइम पर दिखता है. जैसे, दूसरे कोड के कंपाइल होने के दौरान
VISIBILITY_RUNTIME 0x01 रनटाइम के दौरान दिखने के लिए
VISIBILITY_SYSTEM 0x02 यह रनटाइम के दौरान दिखता है, लेकिन सिर्फ़ सिस्टम को (और सामान्य उपयोगकर्ता कोड को नहीं)

encoded_array_item

class_def_item से रेफ़र किया गया

डेटा सेक्शन में दिखता है

अलाइनमेंट: कोई नहीं (बाइट के हिसाब से अलाइन किया गया)

नाम फ़ॉर्मैट ब्यौरा
मान encoded_array बाइट, कोड में बदली गई ऐरे वैल्यू को दिखाती हैं. यह वैल्यू, ऊपर "encoded_value एन्कोडिंग" में दिए गए "encoded_array फ़ॉर्मैट" के हिसाब से होती है.

hiddenapi_class_data_item

इस सेक्शन में, हर क्लास के लिए इस्तेमाल किए गए प्रतिबंधित इंटरफ़ेस का डेटा होता है.

ध्यान दें: छुपे हुए एपीआई की सुविधा, Android 10.0 में शुरू की गई थी. यह सुविधा, बूट क्लास पाथ में मौजूद क्लास की DEX फ़ाइलों पर ही लागू होती है. यहां दिए गए फ़्लैग की सूची को Android के आने वाले वर्शन में बढ़ाया जा सकता है. ज़्यादा जानकारी के लिए, नॉन-एसडीके इंटरफ़ेस पर पाबंदियां देखें.

नाम फ़ॉर्मैट ब्यौरा
size uint सेक्शन का कुल साइज़
ऑफ़सेट uint[] class_idx के हिसाब से इंडेक्स किए गए ऑफ़सेट का कलेक्शन. इंडेक्स class_idx पर मौजूद ज़ीरो ऐरे एंट्री का मतलब है कि या तो इस class_idx के लिए कोई डेटा नहीं है या सभी छिपे हुए एपीआई फ़्लैग ज़ीरो हैं. इसके अलावा, ऐरे की एंट्री शून्य नहीं होती है. इसमें सेक्शन की शुरुआत से लेकर इस class_idx के लिए छिपे हुए एपीआई फ़्लैग के ऐरे तक का ऑफ़सेट होता है.
फ़्लैग uleb128[] हर क्लास के लिए, छिपे हुए एपीआई फ़्लैग की जोड़ी गई ऐरे. यहां दी गई टेबल में, फ़्लैग की संभावित वैल्यू के बारे में बताया गया है. फ़्लैग को उसी क्रम में कोड किया जाता है जिस क्रम में फ़ील्ड और तरीकों को क्लास डेटा में कोड किया जाता है.

पाबंदी के फ़्लैग के टाइप:

नाम वैल्यू ब्यौरा
वाइटलिस्ट 0 ऐसे इंटरफ़ेस जिनका इस्तेमाल बिना किसी शुल्क के किया जा सकता है. साथ ही, जिन्हें Android फ़्रेमवर्क के आधिकारिक तौर पर दस्तावेज़ में शामिल किया गया है. पैकेज इंडेक्स में भी इन्हें शामिल किया गया है.
संदिग्ध आइटम की सूची 1 ऐसे नॉन-एसडीके इंटरफ़ेस जिनका इस्तेमाल, ऐप्लिकेशन के टारगेट एपीआई लेवल के बावजूद किया जा सकता है.
प्रतिबंधित करें 2 ऐसे नॉन-एसडीके इंटरफ़ेस जिनका इस्तेमाल, ऐप्लिकेशन के टारगेट एपीआई लेवल के बावजूद नहीं किया जा सकता. इनमें से किसी एक इंटरफ़ेस को ऐक्सेस करने पर, रनटाइम में गड़बड़ी होती है.
greylist‑max‑o 3 ऐसे नॉन-एसडीके इंटरफ़ेस जिनका इस्तेमाल Android 8.x और इससे पहले के वर्शन पर किया जा सकता है. हालांकि, ऐसा तब तक किया जा सकता है, जब तक उन पर पाबंदी न लगी हो.
greylist‑max‑p 4 ऐसे गैर-SDK इंटरफ़ेस जिनका इस्तेमाल Android 9.x के लिए किया जा सकता है. हालांकि, ऐसा तब तक किया जा सकता है, जब तक उन पर पाबंदी न लगाई गई हो.
greylist‑max‑q 5 ऐसे नॉन-एसडीके इंटरफ़ेस जिनका इस्तेमाल Android 10.x के लिए किया जा सकता है. हालांकि, ऐसा तब तक किया जा सकता है, जब तक उन पर पाबंदी न लगाई गई हो.
greylist‑max‑r 6 ऐसे नॉन-एसडीके इंटरफ़ेस जिनका इस्तेमाल Android 11.x के लिए किया जा सकता है. हालांकि, ऐसा तब तक किया जा सकता है, जब तक उन पर पाबंदी न लगाई गई हो.

सिस्टम एनोटेशन

सिस्टम एनोटेशन का इस्तेमाल, क्लास (और तरीकों और फ़ील्ड) के बारे में अलग-अलग तरह की जानकारी दिखाने के लिए किया जाता है. इस जानकारी को आम तौर पर, क्लाइंट (सिस्टम से बाहर) कोड के ज़रिए सिर्फ़ परोक्ष रूप से ऐक्सेस किया जाता है.

सिस्टम एनोटेशन को .dex फ़ाइलों में, .dex के तौर पर सेट की गई विज़िबिलिटी वाले एनोटेशन के तौर पर दिखाया जाता है.VISIBILITY_SYSTEM

dalvik.annotation.AnnotationDefault

एनोटेशन इंटरफ़ेस में मौजूद तरीकों पर दिखता है

AnnotationDefault एनोटेशन, हर उस एनोटेशन इंटरफ़ेस से जुड़ा होता है जो डिफ़ॉल्ट बाइंडिंग के बारे में बताता है.

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

dalvik.annotation.EnclosingClass

क्लास में दिखता है

हर क्लास से एक EnclosingClass एनोटेशन जुड़ा होता है.यह एनोटेशन, किसी दूसरी क्लास के सदस्य के तौर पर तय किया जाता है या यह गुमनाम होता है, लेकिन इसे किसी मेथड बॉडी में तय नहीं किया जाता. उदाहरण के लिए, सिंथेटिक इनर क्लास. जिस क्लास में यह एनोटेशन मौजूद है उसमें InnerClass एनोटेशन भी होना चाहिए. इसके अलावा, किसी क्लास में EnclosingClass और EnclosingMethod, दोनों एनोटेशन नहीं होने चाहिए.

नाम फ़ॉर्मैट ब्यौरा
मान कक्षा वह क्लास जो इस क्लास के स्कोप से सबसे ज़्यादा मेल खाती है

dalvik.annotation.EnclosingMethod

क्लास में दिखता है

EnclosingMethod एनोटेशन, हर उस क्लास से जुड़ा होता है जिसे किसी मेथड के मुख्य हिस्से में तय किया जाता है. जिस क्लास में यह एनोटेशन मौजूद है उसमें InnerClass एनोटेशन भी होना चाहिए. इसके अलावा, किसी क्लास में EnclosingClass और EnclosingMethod, दोनों एनोटेशन नहीं होने चाहिए.

नाम फ़ॉर्मैट ब्यौरा
मान Method वह तरीका जो इस क्लास के लेक्सिकल स्कोप से सबसे ज़्यादा मेल खाता है

dalvik.annotation.InnerClass

क्लास में दिखता है

InnerClass एनोटेशन, हर उस क्लास से जुड़ा होता है जिसे किसी दूसरी क्लास की परिभाषा के लेक्सिकल स्कोप में तय किया गया है. जिस क्लास में यह एनोटेशन मौजूद है उसमें या तो EnclosingClass एनोटेशन या EnclosingMethod एनोटेशन भी होना चाहिए.

नाम फ़ॉर्मैट ब्यौरा
नाम स्ट्रिंग इस क्लास का मूल रूप से तय किया गया सामान्य नाम (इसमें कोई पैकेज प्रीफ़िक्स शामिल नहीं है). अगर इस क्लास में शामिल छात्र-छात्राओं की पहचान छिपी हुई है, तो उनका नाम null होगा.
accessFlags आईएनटी क्लास के लिए, ऐक्सेस के लिए ओरिजनल तौर पर तय किए गए फ़्लैग (ये फ़्लैग, सोर्स लैंग्वेज और टारगेट वर्चुअल मशीन के एक्ज़ीक्यूशन मॉडल के बीच अंतर होने की वजह से, लागू होने वाले फ़्लैग से अलग हो सकते हैं)

dalvik.annotation.MemberClasses

क्लास में दिखता है

MemberClasses एनोटेशन, हर उस क्लास से जुड़ा होता है जो सदस्य क्लास के बारे में जानकारी देती है. (मेंबर क्लास, सीधे तौर पर इनर क्लास होती है और इसका नाम होता है.)

नाम फ़ॉर्मैट ब्यौरा
मान Class[] सदस्यता के लेवल का कलेक्शन

dalvik.annotation.MethodParameters

इन तरीकों से दिखता है

ध्यान दें: यह एनोटेशन, Android 7.1 के बाद जोड़ा गया था. Android के पुराने वर्शन पर इसकी मौजूदगी को अनदेखा कर दिया जाएगा.

MethodParameters एनोटेशन का इस्तेमाल करना ज़रूरी नहीं है. इसका इस्तेमाल, पैरामीटर के मेटाडेटा की जानकारी देने के लिए किया जा सकता है. जैसे, पैरामीटर के नाम और मॉडिफ़ायर.

अगर रनटाइम के दौरान पैरामीटर मेटाडेटा की ज़रूरत नहीं है, तो किसी तरीके या कंस्ट्रक्टर से एनोटेशन को सुरक्षित तरीके से हटाया जा सकता है. java.lang.reflect.Parameter.isNamePresent() का इस्तेमाल यह देखने के लिए किया जा सकता है कि किसी पैरामीटर के लिए मेटाडेटा मौजूद है या नहीं. साथ ही, अगर जानकारी मौजूद नहीं है, तो java.lang.reflect.Parameter.getName() जैसे उससे जुड़े रिफ़्लेक्शन के तरीके, रनटाइम के दौरान डिफ़ॉल्ट व्यवहार पर वापस आ जाएंगे.

पैरामीटर मेटाडेटा शामिल करते समय, कंपाइलर को जनरेट की गई क्लास, जैसे कि enum के लिए जानकारी शामिल करनी होगी. ऐसा इसलिए, क्योंकि पैरामीटर मेटाडेटा में यह जानकारी शामिल होती है कि कोई पैरामीटर सिंथेटिक है या ज़रूरी है.

MethodParameters एनोटेशन में, सिर्फ़ अलग-अलग तरीके के पैरामीटर के बारे में बताया जाता है. इसलिए, कंपाइलर उन कंस्ट्रक्टर और तरीकों के लिए एनोटेशन को पूरी तरह से हटा सकते हैं जिनमें कोई पैरामीटर नहीं है. ऐसा कोड के साइज़ और रनटाइम की क्षमता को बेहतर बनाने के लिए किया जाता है.

नीचे दिए गए ऐरे का साइज़, इस तरीके से जुड़े method_id_item dex स्ट्रक्चर के साइज़ के बराबर होना चाहिए. ऐसा न होने पर, रनटाइम के दौरान java.lang.reflect.MalformedParametersException दिखेगा.

इसका मतलब है कि method_id_item.proto_idx -> proto_id_item.parameters_off -> type_list.size की वैल्यू, names().length और accessFlags().length की वैल्यू के बराबर होनी चाहिए.

ऐसा इसलिए है, क्योंकि MethodParameters में सभी फ़ॉर्मल मेथड पैरामीटर के बारे में बताया जाता है. भले ही, उन्हें सोर्स कोड में साफ़ तौर पर या परोक्ष रूप से घोषित न किया गया हो. इसलिए, ऐरे का साइज़, सिग्नेचर या अन्य मेटाडेटा की जानकारी से अलग हो सकता है. यह जानकारी, सिर्फ़ सोर्स कोड में साफ़ तौर पर घोषित किए गए पैरामीटर पर आधारित होती है. MethodParameters में, टाइप एनोटेशन रिसीवर पैरामीटर के बारे में कोई जानकारी भी शामिल नहीं होगी. ये पैरामीटर, असल तरीके के सिग्नेचर में मौजूद नहीं होते.

नाम फ़ॉर्मैट ब्यौरा
नाम String[] एसोसिएटेड तरीके के लिए फ़ॉर्मल पैरामीटर के नाम. ऐरे शून्य नहीं होना चाहिए. हालांकि, अगर कोई फ़ॉर्मल पैरामीटर नहीं है, तो यह खाली होना चाहिए. अगर उस इंडेक्स वाले फ़ॉर्मल पैरामीटर का कोई नाम नहीं है, तो ऐरे में मौजूद वैल्यू शून्य होनी चाहिए.
अगर पैरामीटर के नाम वाली स्ट्रिंग खाली हैं या उनमें '.', ';', '[' या '/' शामिल है, तो रनटाइम के दौरान java.lang.reflect.MalformedParametersException दिखेगा.
accessFlags int[] यह पैरामीटर, उससे जुड़ी विधि के फ़ॉर्मल पैरामीटर के ऐक्सेस फ़्लैग दिखाता है. ऐरे शून्य नहीं होना चाहिए. हालांकि, अगर कोई फ़ॉर्मल पैरामीटर नहीं है, तो इसे खाली होना चाहिए.
यह वैल्यू, बिट मास्क होती है. इसमें ये वैल्यू होती हैं:
  • 0x0010 : फ़ाइनल, पैरामीटर को फ़ाइनल के तौर पर एलान किया गया था
  • 0x1000 : सिंथेटिक, इस पैरामीटर को कंपाइलर ने पेश किया था
  • 0x8000 : ज़रूरी है. यह पैरामीटर सिंथेटिक है, लेकिन भाषा की खास जानकारी से भी इसका पता चलता है
अगर इस सेट के बाहर कोई बिट सेट की जाती है, तो रनटाइम के दौरान java.lang.reflect.MalformedParametersException दिखेगा.

dalvik.annotation.Signature

क्लास, फ़ील्ड, और तरीकों पर दिखता है

Signature एनोटेशन, हर क्लास, फ़ील्ड या तरीके से जुड़ा होता है. इसे Signature से ज़्यादा जटिल टाइप के हिसाब से तय किया जाता है.type_id_item .dex फ़ॉर्मैट, हस्ताक्षर के फ़ॉर्मैट के बारे में नहीं बताता है. इसका मकसद सिर्फ़ यह है कि किसी सोर्स भाषा के लिए ज़रूरी सभी हस्ताक्षर दिखाए जा सकें, ताकि उस भाषा के सिमैंटिक को सही तरीके से लागू किया जा सके. इसलिए, वर्चुअल मशीन के ज़रिए लागू किए गए सिस्टम में आम तौर पर सिग्नेचर को पार्स (या पुष्टि) नहीं किया जाता. सिग्नेचर को सिर्फ़ डिबगर जैसे बेहतर लेवल के एपीआई और टूल को सौंपा जाता है. इसलिए, किसी भी सिग्नेचर का इस्तेमाल इस तरह से किया जाना चाहिए कि सिर्फ़ मान्य सिग्नेचर मिलने के बारे में कोई अनुमान न लगाया जा सके. साथ ही, सिंटैक्टिक रूप से अमान्य सिग्नेचर मिलने की संभावना से खुद को साफ़ तौर पर सुरक्षित रखा जा सके.

सिग्नेचर स्ट्रिंग में डुप्लीकेट कॉन्टेंट ज़्यादा होता है. इसलिए, Signature एनोटेशन को स्ट्रिंग के ऐरे के तौर पर तय किया जाता है. इसमें डुप्लीकेट एलिमेंट, एक ही डेटा को दिखाते हैं. साथ ही, सिग्नेचर को ऐरे में मौजूद सभी स्ट्रिंग का कॉनकैटेनेशन माना जाता है. किसी हस्ताक्षर को अलग-अलग स्ट्रिंग में बांटने के बारे में कोई नियम नहीं है. यह पूरी तरह से .dex फ़ाइलें जनरेट करने वाले टूल पर निर्भर करता है.

नाम फ़ॉर्मैट ब्यौरा
मान String[] इस क्लास या सदस्य का हस्ताक्षर, स्ट्रिंग की ऐसी सरणी के तौर पर जिसे एक साथ जोड़ा जाना है

dalvik.annotation.Throws

इन तरीकों से दिखता है

Throws एनोटेशन, हर उस तरीके से जुड़ा होता है जो एक या उससे ज़्यादा तरह की गड़बड़ियां दिखाता है.

नाम फ़ॉर्मैट ब्यौरा
मान Class[] थ्रो किए गए अपवाद टाइप की ऐरे