इस दस्तावेज़ में, .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 के तौर पर |
---|---|---|---|
00 | 0 | 0 | -1 |
01 | 1 | 1 | 0 |
7f | -1 | 127 | 126 |
80 7f | -128 | 16256 | 16255 |
फ़ाइल का लेआउट
नाम | फ़ॉर्मैट | ब्यौरा |
---|---|---|
हेडर | 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_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+10000
…U+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+d800
… U+dfff
की रेंज में) को नाम के मान्य वर्ण नहीं माना जाता. हालांकि, यूनिकोड के पूरक वर्ण मान्य होते हैं. इन्हें SimpleNameChar के नियम के आखिरी विकल्प के तौर पर दिखाया जाता है. इन्हें MUTF-8 एन्कोडिंग में सरोगेट कोड पॉइंट के जोड़े के तौर पर फ़ाइल में दिखाया जाना चाहिए.
SimpleName → | ||
SimpleNameChar (SimpleNameChar)* | ||
SimpleNameChar → | ||
'A' … 'Z' |
||
| | 'a' … 'z' |
|
| | '0' … '9' |
|
| | ' ' |
डेक्स के वर्शन 040 के बाद से |
| | '$' |
|
| | '-' |
|
| | '_' |
|
| | U+00a0 |
डेक्स के वर्शन 040 के बाद से |
| | U+00a1 … U+1fff |
|
| | U+2000 … U+200a |
डेक्स के वर्शन 040 के बाद से |
| | U+2010 … U+2027 |
|
| | U+202f |
डेक्स के वर्शन 040 के बाद से |
| | U+2030 … U+d7ff |
|
| | U+e000 … U+ffef |
|
| | U+10000 … U+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 |
बाइट में इस्तेमाल नहीं किया गया (v41 या इसके बाद का वर्शन) |
data_off | uint |
फ़ाइल की शुरुआत से लेकर इस्तेमाल नहीं किया गया (v41 या इसके बाद का वर्शन) |
container_size | uint |
यह फ़ील्ड मौजूद नहीं है. इसे पूरी फ़ाइल का साइज़ (इसमें अन्य डेक्स हेडर और उनका डेटा भी शामिल है). (v41 या इसके बाद का वर्शन) |
header_offset | uint |
यह फ़ील्ड मौजूद नहीं है. इसे फ़ाइल की शुरुआत से लेकर इस हेडर की शुरुआत तक का ऑफ़सेट. (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 सरोगेट कोड यूनिट (यानी, |
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 होता है. इसके एलिमेंट, बूटस्ट्रैप लिंकर के तरीके को दिए गए आर्ग्युमेंट से मेल खाते हैं. पहले तीन तर्क ये हैं:
- बूटस्ट्रैप लिंकर के तरीके (VALUE_METHOD_HANDLE) को दिखाने वाला एक तरीका हैंडल.
- यह एक ऐसे तरीके का नाम है जिसे बूटस्ट्रैप लिंकर को हल करना चाहिए (VALUE_STRING).
- हल किए जाने वाले तरीके के नाम के टाइप (VALUE_METHOD_TYPE) से मेल खाने वाला तरीका.
कोई भी अतिरिक्त आर्ग्युमेंट, बूटस्ट्रैप लिंकर के तरीके को पास की गई स्थिर वैल्यू होती हैं. इन आर्ग्युमेंट को क्रम से और बिना किसी टाइप कन्वर्ज़न के पास किया जाता है.
बूटस्ट्रैप लिंकर मेथड को दिखाने वाले मेथड हैंडल का रिटर्न टाइप java.lang.invoke.CallSite
होना चाहिए. पहले तीन पैरामीटर टाइप ये हैं:
java.lang.invoke.Lookup
java.lang.String
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 : रजिस्टर, जिसमें localname_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 : रजिस्टर, जिसमें localname_idx : नाम का स्ट्रिंग इंडेक्सtype_idx : टाइप का टाइप इंडेक्सsig_idx : टाइप सिग्नेचर का स्ट्रिंग इंडेक्स
|
यह मौजूदा पते पर टाइप सिग्नेचर के साथ एक लोकल वैरिएबल बनाता है.
name_idx , type_idx या sig_idx में से किसी भी वैल्यू को NO_INDEX के तौर पर सेट किया जा सकता है. इससे यह पता चलता है कि वैल्यू के बारे में जानकारी नहीं है. (हालांकि, अगर sig_idx -1 है, तो DBG_START_LOCAL ओपकॉड का इस्तेमाल करके, उसी डेटा को ज़्यादा असरदार तरीके से दिखाया जा सकता है.)
ध्यान दें: हस्ताक्षर मैनेज करने से जुड़ी चेतावनियों के बारे में जानने के लिए, नीचे " |
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[] | यह पैरामीटर, उससे जुड़ी विधि के फ़ॉर्मल पैरामीटर के ऐक्सेस फ़्लैग दिखाता है. ऐरे शून्य नहीं होना चाहिए. हालांकि, अगर कोई फ़ॉर्मल पैरामीटर नहीं है, तो इसे खाली होना चाहिए. यह वैल्यू, बिट मास्क होती है. इसमें ये वैल्यू होती हैं:
java.lang.reflect.MalformedParametersException दिखेगा.
|
dalvik.annotation.Signature
क्लास, फ़ील्ड, और तरीकों पर दिखता है
Signature
एनोटेशन, हर क्लास, फ़ील्ड या तरीके से जुड़ा होता है. इसे Signature
से ज़्यादा जटिल टाइप के हिसाब से तय किया जाता है.type_id_item
.dex
फ़ॉर्मैट, हस्ताक्षर के फ़ॉर्मैट के बारे में नहीं बताता है. इसका मकसद सिर्फ़ यह है कि किसी सोर्स भाषा के लिए ज़रूरी सभी हस्ताक्षर दिखाए जा सकें, ताकि उस भाषा के सिमैंटिक को सही तरीके से लागू किया जा सके. इसलिए, वर्चुअल मशीन के ज़रिए लागू किए गए सिस्टम में आम तौर पर सिग्नेचर को पार्स (या पुष्टि) नहीं किया जाता. सिग्नेचर को सिर्फ़ डिबगर जैसे बेहतर लेवल के एपीआई और टूल को सौंपा जाता है. इसलिए, किसी भी सिग्नेचर का इस्तेमाल इस तरह से किया जाना चाहिए कि सिर्फ़ मान्य सिग्नेचर मिलने के बारे में कोई अनुमान न लगाया जा सके. साथ ही, सिंटैक्टिक रूप से अमान्य सिग्नेचर मिलने की संभावना से खुद को साफ़ तौर पर सुरक्षित रखा जा सके.
सिग्नेचर स्ट्रिंग में डुप्लीकेट कॉन्टेंट ज़्यादा होता है. इसलिए, Signature
एनोटेशन को स्ट्रिंग के ऐरे के तौर पर तय किया जाता है. इसमें डुप्लीकेट एलिमेंट, एक ही डेटा को दिखाते हैं. साथ ही, सिग्नेचर को ऐरे में मौजूद सभी स्ट्रिंग का कॉनकैटेनेशन माना जाता है. किसी हस्ताक्षर को अलग-अलग स्ट्रिंग में बांटने के बारे में कोई नियम नहीं है. यह पूरी तरह से .dex
फ़ाइलें जनरेट करने वाले टूल पर निर्भर करता है.
नाम | फ़ॉर्मैट | ब्यौरा |
---|---|---|
मान | String[] | इस क्लास या सदस्य का हस्ताक्षर, स्ट्रिंग की ऐसी सरणी के तौर पर जिसे एक साथ जोड़ा जाना है |
dalvik.annotation.Throws
इन तरीकों से दिखता है
Throws
एनोटेशन, हर उस तरीके से जुड़ा होता है जो एक या उससे ज़्यादा तरह की गड़बड़ियां दिखाता है.
नाम | फ़ॉर्मैट | ब्यौरा |
---|---|---|
मान | Class[] | थ्रो किए गए अपवाद टाइप की ऐरे |