यह दस्तावेज़ .dex
फ़ाइलों के लेआउट और सामग्री का वर्णन करता है, जिनका उपयोग वर्ग परिभाषाओं और उनके संबंधित सहायक डेटा के एक सेट को रखने के लिए किया जाता है।
प्रकार के लिए गाइड
नाम | विवरण |
---|---|
बाइट | 8-बिट हस्ताक्षरित इंट |
ubyte | 8-बिट अहस्ताक्षरित इंट |
छोटा | 16-बिट हस्ताक्षरित इंट, लिटिल-एंडियन |
उशॉर्ट | 16-बिट अहस्ताक्षरित इंट, लिटिल-एंडियन |
int यहाँ | 32-बिट हस्ताक्षरित इंट, लिटिल-एंडियन |
uint | 32-बिट अहस्ताक्षरित इंट, लिटिल-एंडियन |
लंबा | 64-बिट हस्ताक्षरित इंट, लिटिल-एंडियन |
उलोंग | 64-बिट अहस्ताक्षरित इंट, लिटिल-एंडियन |
sleb128 | हस्ताक्षरित LEB128, चर-लंबाई (नीचे देखें) |
uleb128 | अहस्ताक्षरित LEB128, चर-लंबाई (नीचे देखें) |
uleb128p1 | अहस्ताक्षरित LEB128 प्लस 1 , चर-लंबाई (नीचे देखें) |
एलईबी128
LEB128 (" L ittle- E ndian B ase 128 ") मनमाने ढंग से हस्ताक्षरित या अहस्ताक्षरित पूर्णांक मात्राओं के लिए एक चर-लंबाई एन्कोडिंग है। प्रारूप DWARF3 विनिर्देश से उधार लिया गया था। .dex
फ़ाइल में, LEB128 का उपयोग केवल 32-बिट मात्रा को एन्कोड करने के लिए किया जाता है।
प्रत्येक LEB128 एन्कोडेड मान में एक से पांच बाइट्स होते हैं, जो एक साथ एकल 32-बिट मान का प्रतिनिधित्व करते हैं। अनुक्रम में अंतिम बाइट को छोड़कर प्रत्येक बाइट का अपना सबसे महत्वपूर्ण बिट सेट होता है, जिसका सबसे महत्वपूर्ण बिट स्पष्ट होता है। प्रत्येक बाइट के शेष सात बिट्स पेलोड हैं, पहले बाइट में मात्रा के सबसे कम महत्वपूर्ण सात बिट्स, दूसरे बाइट में अगले सात बिट्स और इसी तरह। हस्ताक्षरित LEB128 ( sleb128
) के मामले में, अनुक्रम में अंतिम बाइट का सबसे महत्वपूर्ण पेलोड बिट अंतिम मूल्य उत्पन्न करने के लिए साइन-विस्तारित है। अहस्ताक्षरित मामले ( uleb128
) में, स्पष्ट रूप से प्रस्तुत नहीं किए गए किसी भी बिट को 0
के रूप में समझा जाता है।
दो-बाइट LEB128 मान का बिटवाइज़ आरेख | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
पहली बाइट | दूसरी बाइट | ||||||||||||||
1 | बिट 6 | बिट 5 | बिट 4 | बिट 3 | बिट 2 | बिट 1 | बिट 0 | 0 | बिट 13 | बिट 12 | बिट 11 | बिट 10 | बिट 9 | बिट 8 | बिट 7 |
वैरिएंट uleb128p1
का उपयोग एक हस्ताक्षरित मान को दर्शाने के लिए किया जाता है, जहां प्रतिनिधित्व एक uleb128
के रूप में एन्कोड किए गए मान के साथ-साथ होता है। यह -1
की एन्कोडिंग बनाता है (वैकल्पिक रूप से अहस्ताक्षरित मान 0xffffffff
के रूप में सोचा जाता है) - लेकिन कोई अन्य नकारात्मक संख्या नहीं - एक एकल बाइट, और वास्तव में उन मामलों में उपयोगी है जहां प्रतिनिधित्व संख्या या तो गैर-नकारात्मक होनी चाहिए या -1
(या) 0xffffffff
), और जहां किसी अन्य नकारात्मक मान की अनुमति नहीं है (या जहां बड़े अहस्ताक्षरित मानों की आवश्यकता होने की संभावना नहीं है)।
यहां प्रारूपों के कुछ उदाहरण दिए गए हैं:
एन्कोडेड अनुक्रम | sleb128 के रूप में | uleb128 के रूप में | uleb128p1 के रूप में |
---|---|---|---|
00 | 0 | 0 | -1 |
01 | 1 | 1 | 0 |
7एफ | -1 | 127 | 126 |
80 7एफ | -128 | 16256 | 16255 |
फ़ाइल लेआउट
नाम | प्रारूप | विवरण |
---|---|---|
हैडर | हेडर_आइटम | हेडर |
string_id | स्ट्रिंग_आईडी_आइटम[] | स्ट्रिंग पहचानकर्ताओं की सूची। ये इस फ़ाइल द्वारा उपयोग की जाने वाली सभी स्ट्रिंग्स के लिए पहचानकर्ता हैं, या तो आंतरिक नामकरण के लिए (उदाहरण के लिए, टाइप डिस्क्रिप्टर) या कोड द्वारा संदर्भित निरंतर ऑब्जेक्ट के रूप में। इस सूची को UTF-16 कोड बिंदु मानों (स्थानीय-संवेदनशील तरीके से नहीं) का उपयोग करके स्ट्रिंग सामग्री द्वारा क्रमबद्ध किया जाना चाहिए, और इसमें कोई डुप्लिकेट प्रविष्टियाँ नहीं होनी चाहिए। |
type_id | type_id_item[] | प्रकार पहचानकर्ताओं की सूची। ये इस फ़ाइल द्वारा निर्दिष्ट सभी प्रकारों (वर्गों, सरणियों, या आदिम प्रकार) के लिए पहचानकर्ता हैं, चाहे फ़ाइल में परिभाषित किया गया हो या नहीं। इस सूची को string_id इंडेक्स द्वारा क्रमबद्ध किया जाना चाहिए, और इसमें कोई डुप्लिकेट प्रविष्टियाँ नहीं होनी चाहिए। |
proto_ids | प्रोटो_आईडी_आइटम[] | विधि प्रोटोटाइप पहचानकर्ताओं की सूची। ये इस फ़ाइल द्वारा संदर्भित सभी प्रोटोटाइप के लिए पहचानकर्ता हैं। इस सूची को रिटर्न-प्रकार ( type_id इंडेक्स द्वारा) प्रमुख क्रम में क्रमबद्ध किया जाना चाहिए, और फिर तर्क सूची (लेक्सिकोग्राफ़िक ऑर्डरिंग, type_id इंडेक्स द्वारा आदेशित व्यक्तिगत तर्क) द्वारा क्रमबद्ध किया जाना चाहिए। सूची में कोई डुप्लिकेट प्रविष्टियाँ नहीं होनी चाहिए। |
field_id | फ़ील्ड_आईडी_आइटम[] | फ़ील्ड पहचानकर्ताओं की सूची. ये इस फ़ाइल द्वारा संदर्भित सभी फ़ील्ड के लिए पहचानकर्ता हैं, चाहे फ़ाइल में परिभाषित हो या नहीं। इस सूची को क्रमबद्ध किया जाना चाहिए, जहां परिभाषित प्रकार ( type_id सूचकांक द्वारा) प्रमुख क्रम है, फ़ील्ड नाम ( string_id सूचकांक द्वारा) मध्यवर्ती क्रम है, और प्रकार ( type_id सूचकांक द्वारा) लघु क्रम है। सूची में कोई डुप्लिकेट प्रविष्टियाँ नहीं होनी चाहिए। |
विधि_आईडी | विधि_आईडी_आइटम[] | विधि पहचानकर्ताओं की सूची। ये इस फ़ाइल द्वारा संदर्भित सभी विधियों के लिए पहचानकर्ता हैं, चाहे फ़ाइल में परिभाषित किया गया हो या नहीं। इस सूची को क्रमबद्ध किया जाना चाहिए, जहां परिभाषित प्रकार ( type_id सूचकांक द्वारा) प्रमुख क्रम है, विधि का नाम ( string_id सूचकांक द्वारा) मध्यवर्ती क्रम है, और विधि प्रोटोटाइप ( proto_id सूचकांक द्वारा) लघु क्रम है। सूची में कोई डुप्लिकेट प्रविष्टियाँ नहीं होनी चाहिए। |
class_defs | क्लास_डेफ़_आइटम[] | वर्ग परिभाषा सूची. कक्षाओं को इस तरह से क्रमबद्ध किया जाना चाहिए कि किसी दिए गए वर्ग के सुपरक्लास और कार्यान्वित इंटरफेस संदर्भ वर्ग की तुलना में सूची में पहले दिखाई दें। इसके अलावा, एक ही नाम वाले वर्ग की परिभाषा का सूची में एक से अधिक बार प्रकट होना अमान्य है। |
कॉल_साइट_आईडी | कॉल_साइट_आईडी_आइटम[] | साइट पहचानकर्ताओं की सूची को कॉल करें। ये इस फ़ाइल द्वारा संदर्भित सभी कॉल साइटों के लिए पहचानकर्ता हैं, चाहे फ़ाइल में परिभाषित किया गया हो या नहीं। इस सूची को call_site_off के आरोही क्रम में क्रमबद्ध किया जाना चाहिए। |
विधि_हैंडल्स | विधि_हैंडल_आइटम[] | विधि हैंडल सूची. इस फ़ाइल द्वारा संदर्भित सभी विधि हैंडल की एक सूची, चाहे फ़ाइल में परिभाषित हो या नहीं। यह सूची क्रमबद्ध नहीं है और इसमें डुप्लिकेट हो सकते हैं जो तार्किक रूप से विभिन्न विधि हैंडल उदाहरणों के अनुरूप होंगे। |
डेटा | यूबाइट[] | डेटा क्षेत्र, जिसमें ऊपर सूचीबद्ध तालिकाओं के लिए सभी समर्थन डेटा शामिल हैं। अलग-अलग आइटमों की अलग-अलग संरेखण आवश्यकताएं होती हैं, और उचित संरेखण प्राप्त करने के लिए यदि आवश्यक हो तो प्रत्येक आइटम से पहले पैडिंग बाइट्स डाले जाते हैं। |
लिंक_डेटा | यूबाइट[] | स्थिर रूप से लिंक की गई फ़ाइलों में उपयोग किया जाने वाला डेटा। इस अनुभाग में डेटा का प्रारूप इस दस्तावेज़ द्वारा अनिर्दिष्ट छोड़ दिया गया है। यह अनुभाग अनलिंक की गई फ़ाइलों में खाली है, और रनटाइम कार्यान्वयन इसे आवश्यकतानुसार उपयोग कर सकते हैं। |
बिटफ़ील्ड, स्ट्रिंग और स्थिर परिभाषाएँ
DEX_FILE_MAGIC
हेडर_आइटम में एम्बेडेड
स्थिर सरणी/स्ट्रिंग DEX_FILE_MAGIC
बाइट्स की सूची है जो किसी .dex
फ़ाइल की शुरुआत में दिखाई देनी चाहिए ताकि इसे इस रूप में पहचाना जा सके। भ्रष्टाचार के कुछ रूपों का पता लगाने में मदद करने के लिए मान में जानबूझकर एक नई पंक्ति ( "\n"
या 0x0a
) और एक शून्य बाइट ( "\0"
या 0x00
) शामिल है। मान एक प्रारूप संस्करण संख्या को तीन दशमलव अंकों के रूप में भी एन्कोड करता है, जो प्रारूप विकसित होने के साथ-साथ समय के साथ एकरस रूप से बढ़ने की उम्मीद है।
ubyte[8] DEX_FILE_MAGIC = { 0x64 0x65 0x78 0x0a 0x30 0x33 0x39 0x00 } = "dex\n039\0"
नोट: एंड्रॉइड 9.0 रिलीज़ में प्रारूप के संस्करण 039
के लिए समर्थन जोड़ा गया था, जिसमें दो नए बाइटकोड, const-method-handle
और const-method-type
पेश किए गए थे। (इनमें से प्रत्येक को बाइटकोड सेट तालिका के सारांश में वर्णित किया गया है।) एंड्रॉइड 10 में, संस्करण 039
छिपी हुई एपीआई जानकारी को शामिल करने के लिए DEX फ़ाइल प्रारूप का विस्तार करता है जो केवल बूट क्लास पथ पर DEX फ़ाइलों पर लागू होता है।
नोट: प्रारूप के संस्करण 038
के लिए समर्थन एंड्रॉइड 8.0 रिलीज़ में जोड़ा गया था। संस्करण 038
में नए बाइटकोड ( invoke-polymorphic
और invoke-custom
) और विधि हैंडल के लिए डेटा जोड़ा गया।
नोट: प्रारूप के संस्करण 037
के लिए समर्थन एंड्रॉइड 7.0 रिलीज़ में जोड़ा गया था। संस्करण 037
से पहले एंड्रॉइड के अधिकांश संस्करणों ने प्रारूप के संस्करण 035
का उपयोग किया है। संस्करण 035
और 037
के बीच एकमात्र अंतर डिफ़ॉल्ट तरीकों को जोड़ने और invoke
के समायोजन का है।
ध्यान दें: व्यापक रूप से उपलब्ध सार्वजनिक सॉफ़्टवेयर रिलीज़ में प्रारूप के कम से कम कुछ पुराने संस्करणों का उपयोग किया गया है। उदाहरण के लिए, संस्करण 009
का उपयोग एंड्रॉइड प्लेटफ़ॉर्म के एम 3 रिलीज़ (नवंबर-दिसंबर 2007) के लिए किया गया था, और संस्करण 013
का उपयोग एंड्रॉइड प्लेटफ़ॉर्म के एम 5 रिलीज़ (फरवरी-मार्च 2008) के लिए किया गया था। कई मायनों में, प्रारूप के ये पुराने संस्करण इस दस्तावेज़ में वर्णित संस्करण से काफी भिन्न हैं।
ENDIAN_CONSTANT और REVERSE_ENDIAN_CONSTANT
हेडर_आइटम में एम्बेडेड
स्थिरांक 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
access_flags परिभाषाएँ
class_def_item, encoded_field, encoded_method, और InnerClass में एम्बेडेड
इन झंडों के बिटफील्ड का उपयोग कक्षाओं और वर्ग के सदस्यों की पहुंच और समग्र गुणों को इंगित करने के लिए किया जाता है।
नाम | कीमत | कक्षाओं के लिए (और InnerClass एनोटेशन) | फ़ील्ड्स के लिए | तरीकों के लिए |
---|---|---|---|---|
ACC_सार्वजनिक | 0x1 | public : हर जगह दिखाई देता है | public : हर जगह दिखाई देता है | public : हर जगह दिखाई देता है |
एसीसी_निजी | 0x2 | private : केवल परिभाषित वर्ग के लिए दृश्यमान | private : केवल परिभाषित वर्ग के लिए दृश्यमान | private : केवल परिभाषित वर्ग के लिए दृश्यमान |
एसीसी_संरक्षित | 0x4 | protected : पैकेज और उपवर्गों के लिए दृश्यमान | protected : पैकेज और उपवर्गों के लिए दृश्यमान | protected : पैकेज और उपवर्गों के लिए दृश्यमान |
ACC_STATIC | 0x8 | static : का निर्माण this बाहरी संदर्भ के साथ नहीं किया गया है | static : वर्ग को परिभाषित करने के लिए वैश्विक | static : this तर्क नहीं लेता है |
ACC_FINAL | 0x10 | final : उपवर्गीय नहीं | final : निर्माण के बाद अपरिवर्तनीय | final : अतिरंजित नहीं |
एसीसी_सिंक्रोनाइज़्ड | 0x20 | synchronized : इस विधि में कॉल के आसपास संबंधित लॉक स्वचालित रूप से प्राप्त हो जाता है। नोट: यह केवल तभी सेट करने के लिए मान्य है जब | ||
ACC_VOLATILE | 0x40 | volatile : थ्रेड सुरक्षा में सहायता के लिए विशेष पहुंच नियम | ||
एसीसी_ब्रिज | 0x40 | ब्रिज विधि, टाइप-सुरक्षित ब्रिज के रूप में कंपाइलर द्वारा स्वचालित रूप से जोड़ा गया | ||
ACC_TRANSIENT | 0x80 | transient : डिफ़ॉल्ट क्रमांकन द्वारा सहेजा नहीं जाना चाहिए | ||
ACC_VARARGS | 0x80 | अंतिम तर्क को संकलक द्वारा "बाकी" तर्क के रूप में माना जाना चाहिए | ||
ACC_नेटिव | 0x100 | native : मूल कोड में लागू किया गया | ||
एसीसी_इंटरफ़ेस | 0x200 | interface : बहु-कार्यान्वयन योग्य अमूर्त वर्ग | ||
ACC_ABSTRACT | 0x400 | abstract : प्रत्यक्ष रूप से तात्कालिक नहीं | abstract : इस वर्ग द्वारा लागू नहीं किया गया | |
ACC_STRICT | 0x800 | strictfp : फ़्लोटिंग-पॉइंट अंकगणित के लिए सख्त नियम | ||
एसीसी_सिंथेटिक | 0x1000 | सीधे स्रोत कोड में परिभाषित नहीं है | सीधे स्रोत कोड में परिभाषित नहीं है | सीधे स्रोत कोड में परिभाषित नहीं है |
ACC_ANNOTATION | 0x2000 | एक एनोटेशन वर्ग के रूप में घोषित किया गया | ||
ACC_ENUM | 0x4000 | एक प्रगणित प्रकार के रूप में घोषित किया गया | एक प्रगणित मूल्य के रूप में घोषित किया गया | |
(अप्रयुक्त) | 0x8000 | |||
ACC_CONSTRUCTOR | 0x10000 | कंस्ट्रक्टर विधि (क्लास या इंस्टेंस इनिशियलाइज़र) | ||
एसीसी_घोषित_ सिंक्रनाइज़ | 0x20000 | synchronized घोषित किया गया।ध्यान दें: इसका निष्पादन पर कोई प्रभाव नहीं पड़ता है (इस ध्वज के प्रतिबिंब के अलावा)। |
InnerClass
एनोटेशन के लिए अनुमति है, और कभी भी class_def_item
में चालू नहीं होना चाहिए।
MUTF-8 (संशोधित UTF-8) एन्कोडिंग
आसान विरासत समर्थन के लिए रियायत के रूप में, .dex
प्रारूप अपने स्ट्रिंग डेटा को वास्तविक मानक संशोधित UTF-8 फॉर्म में एन्कोड करता है, जिसे इसके बाद MUTF-8 कहा जाता है। यह फॉर्म मानक UTF-8 के समान है, सिवाय इसके:
- केवल एक-, दो- और तीन-बाइट एन्कोडिंग का उपयोग किया जाता है।
-
U+10000
…U+10ffff
श्रेणी में कोड बिंदु एक सरोगेट जोड़ी के रूप में एन्कोड किए गए हैं, जिनमें से प्रत्येक को तीन-बाइट एन्कोडेड मान के रूप में दर्शाया गया है। - कोड बिंदु
U+0000
दो-बाइट रूप में एन्कोड किया गया है। - एक सादा शून्य बाइट (मान
0
) एक स्ट्रिंग के अंत को इंगित करता है, जैसा कि मानक सी भाषा व्याख्या है।
उपरोक्त पहले दो आइटमों को इस प्रकार संक्षेप में प्रस्तुत किया जा सकता है: MUTF-8, यूनिकोड वर्णों के लिए अधिक प्रत्यक्ष एन्कोडिंग प्रारूप होने के बजाय, UTF-16 के लिए एक एन्कोडिंग प्रारूप है।
उपरोक्त अंतिम दो आइटम कोड बिंदु U+0000
को एक स्ट्रिंग में शामिल करना और फिर भी इसे C-स्टाइल नल-टर्मिनेटेड स्ट्रिंग के रूप में हेरफेर करना संभव बनाते हैं।
हालाँकि, U+0000
की विशेष एन्कोडिंग का मतलब है कि, सामान्य UTF-8 के विपरीत, MUTF-8 स्ट्रिंग्स की एक जोड़ी पर मानक C फ़ंक्शन strcmp()
को कॉल करने का परिणाम हमेशा असमान स्ट्रिंग्स की तुलना के उचित हस्ताक्षरित परिणाम को इंगित नहीं करता है। . जब ऑर्डर करना (केवल समानता नहीं) एक चिंता का विषय है, तो MUTF-8 स्ट्रिंग्स की तुलना करने का सबसे सीधा तरीका उन्हें वर्ण दर वर्ण डीकोड करना और डीकोड किए गए मानों की तुलना करना है। (हालांकि, अधिक चतुर कार्यान्वयन भी संभव हैं।)
कैरेक्टर एन्कोडिंग के बारे में अधिक जानकारी के लिए कृपया यूनिकोड मानक देखें। MUTF-8 वास्तव में UTF-8 की तुलना में (अपेक्षाकृत कम प्रसिद्ध) एन्कोडिंग CESU-8 के अधिक निकट है।
एन्कोडेड_वैल्यू एन्कोडिंग
एनोटेशन_एलिमेंट और एन्कोडेड_एरे_आइटम में एम्बेड किया गया
एक encoded_value
(लगभग) मनमाने ढंग से पदानुक्रमित संरचित डेटा का एक एन्कोडेड टुकड़ा है। एन्कोडिंग को संक्षिप्त और पार्स करने में आसान दोनों माना जाता है।
नाम | प्रारूप | विवरण |
---|---|---|
(value_arg << 5) | मान प्रकार | ubyte | उच्च-क्रम तीन बिट्स में एक वैकल्पिक स्पष्टीकरण तर्क के साथ तुरंत बाद के value के प्रकार को इंगित करने वाली बाइट। विभिन्न value परिभाषाओं के लिए नीचे देखें। ज्यादातर मामलों में, value_arg तत्काल-बाद के value की लंबाई को बाइट्स में एन्कोड करता है, जैसे (size - 1) , उदाहरण के लिए, 0 का मतलब है कि मान के लिए एक बाइट की आवश्यकता है, और 7 का मतलब है कि इसके लिए आठ बाइट्स की आवश्यकता है; हालाँकि, कुछ अपवाद भी हैं जैसा कि नीचे बताया गया है। |
कीमत | यूबाइट[] | मूल्य का प्रतिनिधित्व करने वाले बाइट्स, लंबाई में परिवर्तनशील और अलग-अलग value_type बाइट्स के लिए अलग-अलग व्याख्या की जाती है, हालांकि हमेशा छोटे-एंडियन होते हैं। विवरण के लिए नीचे विभिन्न मूल्य परिभाषाएँ देखें। |
मूल्य प्रारूप
नाम टाइप करें | value_type | value_arg प्रारूप | value प्रारूप | विवरण |
---|---|---|---|---|
VALUE_BYTE | 0x00 | (कोई नहीं; 0 होना चाहिए) | यूबाइट[1] | हस्ताक्षरित एक-बाइट पूर्णांक मान |
VALUE_SHORT | 0x02 | आकार - 1 (0…1) | यूबाइट[आकार] | हस्ताक्षरित दो-बाइट पूर्णांक मान, चिह्न-विस्तारित |
VALUE_CHAR | 0x03 | आकार - 1 (0…1) | यूबाइट[आकार] | अहस्ताक्षरित दो-बाइट पूर्णांक मान, शून्य-विस्तारित |
VALUE_INT | 0x04 | आकार - 1 (0…3) | यूबाइट[आकार] | हस्ताक्षरित चार-बाइट पूर्णांक मान, चिह्न-विस्तारित |
VALUE_LONG | 0x06 | आकार - 1 (0…7) | यूबाइट[आकार] | हस्ताक्षरित आठ-बाइट पूर्णांक मान, चिह्न-विस्तारित |
VALUE_FLOAT | 0x10 | आकार - 1 (0…3) | यूबाइट[आकार] | चार-बाइट बिट पैटर्न, दाईं ओर शून्य-विस्तारित, और IEEE754 32-बिट फ़्लोटिंग पॉइंट मान के रूप में व्याख्या की गई |
VALUE_DOUBLE | 0x11 | आकार - 1 (0…7) | यूबाइट[आकार] | आठ-बाइट बिट पैटर्न, दाईं ओर शून्य-विस्तारित, और IEEE754 64-बिट फ़्लोटिंग पॉइंट मान के रूप में व्याख्या की गई |
VALUE_METHOD_TYPE | 0x15 | आकार - 1 (0…3) | यूबाइट[आकार] | अहस्ताक्षरित (शून्य-विस्तारित) चार-बाइट पूर्णांक मान, proto_ids अनुभाग में एक सूचकांक के रूप में व्याख्या किया गया और एक विधि प्रकार मान का प्रतिनिधित्व करता है |
VALUE_METHOD_HANDLE | 0x16 | आकार - 1 (0…3) | यूबाइट[आकार] | अहस्ताक्षरित (शून्य-विस्तारित) चार-बाइट पूर्णांक मान, method_handles अनुभाग में एक सूचकांक के रूप में व्याख्या किया गया और एक मेथड हैंडल मान का प्रतिनिधित्व करता है |
VALUE_STRING | 0x17 | आकार - 1 (0…3) | यूबाइट[आकार] | अहस्ताक्षरित (शून्य-विस्तारित) चार-बाइट पूर्णांक मान, string_ids अनुभाग में एक सूचकांक के रूप में व्याख्या किया गया और एक स्ट्रिंग मान का प्रतिनिधित्व करता है |
मान प्रकार | 0x18 | आकार - 1 (0…3) | यूबाइट[आकार] | अहस्ताक्षरित (शून्य-विस्तारित) चार-बाइट पूर्णांक मान, type_ids अनुभाग में एक सूचकांक के रूप में व्याख्या किया गया और एक प्रतिबिंबित प्रकार/वर्ग मान का प्रतिनिधित्व करता है |
VALUE_FIELD | 0x19 | आकार - 1 (0…3) | यूबाइट[आकार] | अहस्ताक्षरित (शून्य-विस्तारित) चार-बाइट पूर्णांक मान, field_ids अनुभाग में एक सूचकांक के रूप में व्याख्या किया गया और एक प्रतिबिंबित फ़ील्ड मान का प्रतिनिधित्व करता है |
VALUE_METHOD | 0x1a | आकार - 1 (0…3) | यूबाइट[आकार] | अहस्ताक्षरित (शून्य-विस्तारित) चार-बाइट पूर्णांक मान, method_ids अनुभाग में एक सूचकांक के रूप में व्याख्या किया गया और एक प्रतिबिंबित विधि मान का प्रतिनिधित्व करता है |
VALUE_ENUM | 0x1बी | आकार - 1 (0…3) | यूबाइट[आकार] | अहस्ताक्षरित (शून्य-विस्तारित) चार-बाइट पूर्णांक मान, field_ids अनुभाग में एक सूचकांक के रूप में व्याख्या किया गया है और एक गणना प्रकार स्थिरांक के मूल्य का प्रतिनिधित्व करता है |
VALUE_ARRAY | 0x1सी | (कोई नहीं; 0 होना चाहिए) | एन्कोडेड_एरे | नीचे दिए गए " encoded_array प्रारूप" द्वारा निर्दिष्ट प्रारूप में मानों की एक सरणी। value का आकार एन्कोडिंग में निहित है। |
VALUE_ANNOTATION | 0x1d | (कोई नहीं; 0 होना चाहिए) | एन्कोडेड_एनोटेशन | एक उप-एनोटेशन, नीचे दिए गए " encoded_annotation फॉर्मेट" द्वारा निर्दिष्ट प्रारूप में। value का आकार एन्कोडिंग में निहित है। |
VALUE_NULL | 0x1e | (कोई नहीं; 0 होना चाहिए) | (कोई नहीं) | null संदर्भ मान |
VALUE_BOOLEN | 0x1f | बूलियन (0…1) | (कोई नहीं) | एक-बिट मान; false के लिए 0 और true के लिए 1 । बिट को value_arg में दर्शाया गया है। |
एन्कोडेड_अरे प्रारूप
नाम | प्रारूप | विवरण |
---|---|---|
आकार | uleb128 | सरणी में तत्वों की संख्या |
मान | एन्कोडेड_वैल्यू[आकार] | इस अनुभाग द्वारा निर्दिष्ट प्रारूप में size encoded_value बाइट अनुक्रमों की एक श्रृंखला, क्रमिक रूप से संयोजित। |
एन्कोडेड_एनोटेशन प्रारूप
नाम | प्रारूप | विवरण |
---|---|---|
type_idx | uleb128 | एनोटेशन का प्रकार. यह एक वर्ग (सरणी या आदिम नहीं) प्रकार होना चाहिए। |
आकार | uleb128 | इस एनोटेशन में नाम-मूल्य मैपिंग की संख्या |
तत्वों | एनोटेशन_तत्व[आकार] | एनोटेशन के तत्व, सीधे इन-लाइन दर्शाए गए (ऑफ़सेट के रूप में नहीं)। तत्वों को string_id अनुक्रमणिका द्वारा बढ़ते क्रम में क्रमबद्ध किया जाना चाहिए। |
एनोटेशन_तत्व प्रारूप
नाम | प्रारूप | विवरण |
---|---|---|
name_idx | uleb128 | तत्व का नाम, string_ids अनुभाग में एक सूचकांक के रूप में दर्शाया गया है। स्ट्रिंग को ऊपर परिभाषित memberName के सिंटैक्स के अनुरूप होना चाहिए। |
कीमत | एन्कोडेड_वैल्यू | तत्व मान |
स्ट्रिंग सिंटैक्स
.dex
फ़ाइल में कई प्रकार के आइटम होते हैं जो अंततः एक स्ट्रिंग को संदर्भित करते हैं। निम्नलिखित बीएनएफ-शैली परिभाषाएँ इन स्ट्रिंग्स के लिए स्वीकार्य सिंटैक्स को दर्शाती हैं।
सरल नाम
एक SimpleName अन्य चीज़ों के नामों के वाक्य-विन्यास का आधार है। .dex
प्रारूप यहां उचित मात्रा में अक्षांश की अनुमति देता है (अधिकांश सामान्य स्रोत भाषाओं से कहीं अधिक)। संक्षेप में, एक साधारण नाम में कोई निम्न-ASCII वर्णमाला वर्ण या अंक, कुछ विशिष्ट निम्न-ASCII प्रतीक और अधिकांश गैर-ASCII कोड बिंदु होते हैं जो नियंत्रण, स्थान या विशेष वर्ण नहीं होते हैं। संस्करण 040
से शुरू होकर प्रारूप अतिरिक्त रूप से अंतरिक्ष वर्णों (यूनिकोड Zs
श्रेणी) की अनुमति देता है। ध्यान दें कि सरोगेट कोड बिंदु ( U+d800
… U+dfff
श्रेणी में) को वैध नाम वर्ण नहीं माना जाता है, लेकिन यूनिकोड पूरक वर्ण मान्य हैं (जो SimpleNameChar के लिए नियम के अंतिम विकल्प द्वारा दर्शाए जाते हैं), और वे MUTF-8 एन्कोडिंग में सरोगेट कोड बिंदुओं के जोड़े के रूप में फ़ाइल में दर्शाया जाना चाहिए।
सरल नाम → | ||
SimpleNameChar ( SimpleNameChar )* | ||
SimpleNameChar → | ||
'A' ... 'Z' | ||
| | 'a' ... 'z' | |
| | '0' ... '9' | |
| | ' ' | DEX संस्करण 040 के बाद से |
| | '$' | |
| | '-' | |
| | '_' | |
| | U+00a0 | DEX संस्करण 040 के बाद से |
| | U+00a1 … U+1fff | |
| | U+2000 … U+200a | DEX संस्करण 040 के बाद से |
| | U+2010 … U+2027 | |
| | U+202f | DEX संस्करण 040 के बाद से |
| | U+2030 … U+d7ff | |
| | U+e000 ... U+ffef | |
| | U+10000 … U+10ffff |
सदस्य का नाम
फ़ील्ड_आईडी_आइटम और मेथड_आईडी_आइटम द्वारा उपयोग किया जाता है
सदस्यनाम एक वर्ग के सदस्य का नाम है, सदस्य फ़ील्ड, विधियाँ और आंतरिक वर्ग हैं।
सदस्य का नाम → | |
सरल नाम | |
| | '<' सरल नाम '>' |
पूर्णवर्गनाम
FullClassName एक पूरी तरह से योग्य वर्ग नाम है, जिसमें एक आवश्यक नाम के बाद एक वैकल्पिक पैकेज विनिर्देशक शामिल होता है।
पूर्णवर्गनाम → | |
वैकल्पिक पैकेज उपसर्ग सरल नाम | |
वैकल्पिक पैकेज उपसर्ग → | |
( सरलनाम '/' )* |
टाइपडिस्क्रिप्टर
type_id_item द्वारा उपयोग किया जाता है
टाइपडिस्क्रिप्टर किसी भी प्रकार का प्रतिनिधित्व करता है, जिसमें आदिम, वर्ग, सरणियाँ और void
शामिल हैं। विभिन्न संस्करणों के अर्थ के लिए नीचे देखें।
टाइपडिस्क्रिप्टर → | |
'V' | |
| | फ़ील्डटाइपडिस्क्रिप्टर |
फ़ील्डटाइपडिस्क्रिप्टर → | |
नॉनएरेफ़ील्डटाइपडिस्क्रिप्टर | |
| | ( '[' * 1…255) नॉनएरेफ़ील्डटाइपडिस्क्रिप्टर |
नॉनएरेफ़ील्डटाइपडिस्क्रिप्टर → | |
'Z' | |
| | 'B' |
| | 'S' |
| | 'C' |
| | 'I' |
| | 'J' |
| | 'F' |
| | 'D' |
| | 'L' फुलक्लासनेम ';' |
शॉर्टीडिस्क्रिप्टर
proto_id_item द्वारा उपयोग किया जाता है
शॉर्टीडिस्क्रिप्टर एक विधि प्रोटोटाइप का संक्षिप्त रूप प्रतिनिधित्व है, जिसमें रिटर्न और पैरामीटर प्रकार शामिल हैं, सिवाय इसके कि विभिन्न संदर्भ (वर्ग या सरणी) प्रकारों के बीच कोई अंतर नहीं है। इसके बजाय, सभी संदर्भ प्रकारों को एक एकल 'L'
वर्ण द्वारा दर्शाया जाता है।
शॉर्टीडिस्क्रिप्टर → | |
शॉर्टीरिटर्नटाइप ( ShortyFieldType )* | |
शॉर्टीरिटर्नटाइप → | |
'V' | |
| | शॉर्टीफ़ील्ड प्रकार |
शॉर्टीफ़ील्डटाइप → | |
'Z' | |
| | 'B' |
| | 'S' |
| | 'C' |
| | 'I' |
| | 'J' |
| | 'F' |
| | 'D' |
| | 'L' |
टाइपडिस्क्रिप्टर शब्दार्थ
टाइपडिस्क्रिप्टर के प्रत्येक वेरिएंट का यही अर्थ है।
वाक्य - विन्यास | अर्थ |
---|---|
वी | void ; केवल रिटर्न प्रकारों के लिए मान्य है |
जेड | boolean |
बी | byte |
एस | short |
सी | char |
मैं | int |
जे | long |
एफ | float |
डी | double |
एल पूर्णतः/योग्य/नाम ; | कक्षा fully.qualified.Name |
[ वर्णनकर्ता | descriptor की सरणी, सरणियों के सरणियों के लिए पुनरावर्ती रूप से प्रयोग करने योग्य, हालांकि इसमें 255 से अधिक आयाम होना अमान्य है। |
वस्तुएँ और संबंधित संरचनाएँ
इस अनुभाग में प्रत्येक शीर्ष-स्तरीय आइटम की परिभाषाएँ शामिल हैं जो .dex
फ़ाइल में दिखाई दे सकती हैं।
हेडर_आइटम
शीर्ष लेख अनुभाग में दिखाई देता है
संरेखण: 4 बाइट्स
नाम | प्रारूप | विवरण |
---|---|---|
जादू | यूबाइट[8] = DEX_FILE_MAGIC | जादुई मूल्य. अधिक विवरण के लिए ऊपर " DEX_FILE_MAGIC " के अंतर्गत चर्चा देखें। |
अंततः, | uint | बाकी फ़ाइल का adler32 चेकसम ( magic और इस फ़ील्ड को छोड़कर बाकी सब); फ़ाइल भ्रष्टाचार का पता लगाने के लिए उपयोग किया जाता है |
हस्ताक्षर | यूबाइट[20] | शेष फ़ाइल का SHA-1 हस्ताक्षर (हैश) ( magic , checksum और इस फ़ील्ड को छोड़कर बाकी सब); फ़ाइलों को विशिष्ट रूप से पहचानने के लिए उपयोग किया जाता है |
फ़ाइल का साइज़ | uint | संपूर्ण फ़ाइल का आकार (हेडर सहित), बाइट्स में |
हेडर_आकार | यूइंट = 0x70 | हेडर का आकार (यह संपूर्ण अनुभाग), बाइट्स में। यह प्रारूप को अमान्य किए बिना कम से कम एक सीमित मात्रा में पीछे/आगे की संगतता की अनुमति देता है। |
एंडियन_टैग | यूइंट = ENDIAN_CONSTANT | एंडियननेस टैग. अधिक विवरण के लिए ऊपर " ENDIAN_CONSTANT और REVERSE_ENDIAN_CONSTANT " के अंतर्गत चर्चा देखें। |
लिंक_आकार | uint | लिंक अनुभाग का आकार, या 0 यदि यह फ़ाइल स्थिर रूप से लिंक नहीं है |
लिंक_ऑफ | uint | फ़ाइल की शुरुआत से लिंक अनुभाग तक ऑफसेट, या 0 यदि link_size == 0 है। ऑफसेट, यदि गैर-शून्य है, तो link_data अनुभाग में ऑफसेट होना चाहिए। इंगित किए गए डेटा का प्रारूप इस दस्तावेज़ द्वारा अनिर्दिष्ट छोड़ दिया गया है; इस हेडर फ़ील्ड (और पिछले) को रनटाइम कार्यान्वयन द्वारा उपयोग के लिए हुक के रूप में छोड़ दिया गया है। |
नक्शा_बंद | uint | फ़ाइल की शुरुआत से लेकर मानचित्र आइटम तक ऑफसेट। ऑफसेट, जो गैर-शून्य होना चाहिए, data अनुभाग में ऑफसेट होना चाहिए, और डेटा नीचे " map_list " द्वारा निर्दिष्ट प्रारूप में होना चाहिए। |
string_ids_size | uint | स्ट्रिंग पहचानकर्ता सूची में स्ट्रिंग की गिनती |
string_ids_off | uint | फ़ाइल की शुरुआत से स्ट्रिंग पहचानकर्ता सूची में ऑफसेट, या 0 यदि string_ids_size == 0 (बेशक एक अजीब किनारे का मामला)। ऑफसेट, यदि गैर-शून्य है, तो string_ids अनुभाग की शुरुआत में होना चाहिए। |
type_ids_size | uint | प्रकार पहचानकर्ता सूची में तत्वों की गिनती, अधिकतम 65535 |
type_ids_off | uint | फ़ाइल की शुरुआत से प्रकार पहचानकर्ता सूची में ऑफसेट, या 0 यदि type_ids_size == 0 (माना जाता है कि यह एक अजीब बढ़त वाला मामला है)। ऑफसेट, यदि गैर-शून्य है, तो type_ids अनुभाग की शुरुआत में होना चाहिए। |
proto_ids_size | uint | प्रोटोटाइप पहचानकर्ता सूची में तत्वों की गिनती, अधिकतम 65535 |
proto_ids_off | uint | फ़ाइल की शुरुआत से प्रोटोटाइप पहचानकर्ता सूची में ऑफसेट, या 0 यदि proto_ids_size == 0 (बेशक एक अजीब किनारे का मामला)। ऑफसेट, यदि गैर-शून्य है, तो proto_ids अनुभाग की शुरुआत में होना चाहिए। |
फ़ील्ड_आईडी_आकार | uint | फ़ील्ड पहचानकर्ता सूची में तत्वों की गिनती |
फ़ील्ड_आईडी_बंद | uint | फ़ाइल की शुरुआत से फ़ील्ड पहचानकर्ता सूची में ऑफसेट, या 0 यदि field_ids_size == 0 । ऑफसेट, यदि गैर-शून्य है, तो field_ids अनुभाग की शुरुआत में होना चाहिए। |
विधि_आईडी_आकार | uint | विधि पहचानकर्ता सूची में तत्वों की गिनती |
विधि_आईडी_बंद | uint | फ़ाइल की शुरुआत से विधि पहचानकर्ताओं की सूची में ऑफसेट, या 0 यदि method_ids_size == 0 है। ऑफसेट, यदि गैर-शून्य है, तो method_ids अनुभाग की शुरुआत में होना चाहिए। |
class_defs_size | uint | वर्ग परिभाषा सूची में तत्वों की गिनती |
क्लास_डेफ़्स_ऑफ़ | uint | फ़ाइल की शुरुआत से क्लास परिभाषा सूची में ऑफसेट, या 0 अगर class_defs_size == 0 (माना जाता है कि यह एक अजीब बढ़त वाला मामला है)। ऑफसेट, यदि गैर-शून्य है, तो class_defs अनुभाग की शुरुआत में होना चाहिए। |
डेटा_आकार | uint | बाइट्स में data अनुभाग का आकार. sizeof(uint) का एक सम गुणज होना चाहिए। |
डेटा_बंद | uint | फ़ाइल की शुरुआत से data अनुभाग की शुरुआत तक ऑफसेट। |
मानचित्र_सूची
डेटा अनुभाग में दिखाई देता है
हेडर_आइटम से संदर्भित
संरेखण: 4 बाइट्स
यह क्रमानुसार किसी फ़ाइल की संपूर्ण सामग्री की एक सूची है। इसमें header_item
के संबंध में कुछ अतिरेक शामिल है, लेकिन इसका उद्देश्य संपूर्ण फ़ाइल को पुनरावृत्त करने के लिए उपयोग करने के लिए एक आसान रूप है। किसी दिए गए प्रकार को मानचित्र में अधिकतम एक बार प्रदर्शित होना चाहिए, लेकिन शेष प्रारूप द्वारा निहित प्रतिबंधों के अलावा, किस क्रम के प्रकार दिखाई दे सकते हैं, इस पर कोई प्रतिबंध नहीं है (उदाहरण के लिए, एक header
अनुभाग पहले दिखाई देना चाहिए, उसके बाद एक string_ids
होना चाहिए) अनुभाग, आदि)। इसके अतिरिक्त, मानचित्र प्रविष्टियाँ प्रारंभिक ऑफसेट द्वारा क्रमित होनी चाहिए और ओवरलैप नहीं होनी चाहिए।
नाम | प्रारूप | विवरण |
---|---|---|
आकार | uint | सूची का आकार, प्रविष्टियों में |
सूची | मानचित्र_आइटम[आकार] | सूची के तत्व |
मानचित्र_आइटम प्रारूप
नाम | प्रारूप | विवरण |
---|---|---|
प्रकार | उशॉर्ट | वस्तुओं का प्रकार; नीचे दी गई तालिका देखें |
अप्रयुक्त | उशॉर्ट | (अप्रयुक्त) |
आकार | uint | संकेतित ऑफसेट पर पाई जाने वाली वस्तुओं की संख्या की गिनती |
ओफ़्सेट | uint | फ़ाइल की शुरुआत से विचाराधीन आइटम तक ऑफसेट |
कोड टाइप करें
वस्तु का प्रकार | स्थिर | कीमत | आइटम का आकार बाइट्स में |
---|---|---|---|
हेडर_आइटम | TYPE_HEADER_ITEM | 0x0000 | 0x70 |
स्ट्रिंग_आईडी_आइटम | TYPE_STRING_ID_ITEM | 0x0001 | 0x04 |
type_id_item | TYPE_TYPE_ID_ITEM | 0x0002 | 0x04 |
proto_id_item | TYPE_PROTO_ID_ITEM | 0x0003 | 0x0c |
फ़ील्ड_आईडी_आइटम | प्रकार_फ़ील्ड_आईडी_आइटम | 0x0004 | 0x08 |
विधि_आईडी_आइटम | TYPE_METHOD_ID_ITEM | 0x0005 | 0x08 |
class_def_item | टाइप_क्लास_डीईएफ_आइटम | 0x0006 | 0x20 |
कॉल_साइट_आईडी_आइटम | TYPE_CALL_SITE_ID_ITEM | 0x0007 | 0x04 |
विधि_हैंडल_आइटम | TYPE_METHOD_HANDLE_ITEM | 0x0008 | 0x08 |
मानचित्र_सूची | TYPE_MAP_LIST | 0x1000 | 4 + (आइटम आकार*12) |
टाइप_सूची | प्रकार_प्रकार_सूची | 0x1001 | 4 + (आइटम आकार * 2) |
एनोटेशन_सेट_रेफ_लिस्ट | TYPE_ANNOTATION_SET_REF_LIST | 0x1002 | 4 + (आइटम आकार * 4) |
एनोटेशन_सेट_आइटम | TYPE_ANNOTATION_SET_ITEM | 0x1003 | 4 + (आइटम आकार * 4) |
क्लास_डेटा_आइटम | प्रकार_वर्ग_डेटा_आइटम | 0x2000 | अंतर्निहित; पार्स करना होगा |
कोड_आइटम | प्रकार_कोड_आइटम | 0x2001 | अंतर्निहित; पार्स करना होगा |
स्ट्रिंग_डेटा_आइटम | TYPE_STRING_DATA_ITEM | 0x2002 | अंतर्निहित; पार्स करना होगा |
डिबग_इन्फो_आइटम | TYPE_DEBUG_INFO_ITEM | 0x2003 | अंतर्निहित; पार्स करना होगा |
एनोटेशन_आइटम | TYPE_ANNOTATION_ITEM | 0x2004 | अंतर्निहित; पार्स करना होगा |
एन्कोडेड_एरे_आइटम | TYPE_ENCODED_ARRAY_ITEM | 0x2005 | अंतर्निहित; पार्स करना होगा |
एनोटेशन_निर्देशिका_आइटम | TYPE_ANNOTATIONS_DIRECTORY_ITEM | 0x2006 | अंतर्निहित; पार्स करना होगा |
hidapi_class_data_item | TYPE_HIDDENAPI_CLASS_DATA_ITEM | 0xF000 | अंतर्निहित; पार्स करना होगा |
स्ट्रिंग_आईडी_आइटम
string_ids अनुभाग में दिखाई देता है
संरेखण: 4 बाइट्स
नाम | प्रारूप | विवरण |
---|---|---|
स्ट्रिंग_डेटा_ऑफ़ | uint | इस आइटम के लिए फ़ाइल की शुरुआत से स्ट्रिंग डेटा तक ऑफसेट करें। ऑफसेट data अनुभाग में एक स्थान पर होना चाहिए, और डेटा नीचे " string_data_item " द्वारा निर्दिष्ट प्रारूप में होना चाहिए। ऑफसेट के लिए कोई संरेखण आवश्यकता नहीं है। |
स्ट्रिंग_डेटा_आइटम
डेटा अनुभाग में दिखाई देता है
संरेखण: कोई नहीं (बाइट-संरेखित)
नाम | प्रारूप | विवरण |
---|---|---|
utf16_size | uleb128 | इस स्ट्रिंग का आकार, UTF-16 कोड इकाइयों में (जो कई प्रणालियों में "स्ट्रिंग लंबाई" है)। यानी यह स्ट्रिंग की डिकोडेड लंबाई है। (एनकोडेड लंबाई 0 बाइट की स्थिति से निहित है।) |
डेटा | यूबाइट[] | MUTF-8 कोड इकाइयों (उर्फ ऑक्टेट, उर्फ बाइट्स) की एक श्रृंखला जिसके बाद मान 0 का एक बाइट आता है। डेटा प्रारूप के बारे में विवरण और चर्चा के लिए ऊपर "MUTF-8 (संशोधित UTF-8) एन्कोडिंग" देखें। ध्यान दें: एक स्ट्रिंग होना स्वीकार्य है जिसमें सामान्य एन्कोडिंग के संबंध में यूटीएफ -16 सरोगेट कोड इकाइयों (यानी, |
type_id_item
type_ids अनुभाग में दिखाई देता है
संरेखण: 4 बाइट्स
नाम | प्रारूप | विवरण |
---|---|---|
डिस्क्रिप्टर_idx | uint | इस प्रकार की डिस्क्रिप्टर स्ट्रिंग के लिए string_ids सूची में अनुक्रमणिका बनाएं। स्ट्रिंग को ऊपर परिभाषित टाइपडिस्क्रिप्टर के सिंटैक्स के अनुरूप होना चाहिए। |
proto_id_item
proto_ids अनुभाग में दिखाई देता है
संरेखण: 4 बाइट्स
नाम | प्रारूप | विवरण |
---|---|---|
छोटू_idx | uint | इस प्रोटोटाइप के शॉर्ट-फॉर्म डिस्क्रिप्टर स्ट्रिंग के लिए string_ids सूची में अनुक्रमणिका बनाएं। स्ट्रिंग को ऊपर परिभाषित शॉर्टीडिस्क्रिप्टर के सिंटैक्स के अनुरूप होना चाहिए, और इस आइटम के रिटर्न प्रकार और पैरामीटर के अनुरूप होना चाहिए। |
return_type_idx | uint | इस प्रोटोटाइप के रिटर्न प्रकार के लिए type_ids सूची में अनुक्रमित करें |
पैरामीटर_बंद | uint | इस प्रोटोटाइप के लिए पैरामीटर प्रकारों की सूची में फ़ाइल की शुरुआत से ऑफसेट, या 0 यदि इस प्रोटोटाइप में कोई पैरामीटर नहीं है। यह ऑफ़सेट, यदि गैर-शून्य है, तो data अनुभाग में होना चाहिए, और वहां मौजूद डेटा नीचे "type_list" द्वारा निर्दिष्ट प्रारूप में होना चाहिए। इसके अतिरिक्त, सूची में void प्रकार का कोई संदर्भ नहीं होना चाहिए। |
फ़ील्ड_आईडी_आइटम
फ़ील्ड_आईडी अनुभाग में दिखाई देता है
संरेखण: 4 बाइट्स
नाम | प्रारूप | विवरण |
---|---|---|
class_idx | उशॉर्ट | इस फ़ील्ड के निश्चितकर्ता के लिए type_ids सूची में अनुक्रमणिका डालें। यह एक वर्ग प्रकार होना चाहिए, न कि कोई सरणी या आदिम प्रकार। |
type_idx | उशॉर्ट | इस फ़ील्ड के प्रकार के लिए type_ids सूची में अनुक्रमणिका डालें |
name_idx | uint | इस फ़ील्ड के नाम के लिए string_ids सूची में अनुक्रमणिका डालें। स्ट्रिंग को ऊपर परिभाषित memberName के सिंटैक्स के अनुरूप होना चाहिए। |
विधि_आईडी_आइटम
मेथड_आईडी अनुभाग में दिखाई देता है
संरेखण: 4 बाइट्स
नाम | प्रारूप | विवरण |
---|---|---|
class_idx | उशॉर्ट | इस विधि के परिभाषितकर्ता के लिए type_ids सूची में अनुक्रमणिका डालें। यह एक वर्ग या सरणी प्रकार होना चाहिए, न कि एक आदिम प्रकार। |
proto_idx | उशॉर्ट | इस विधि के प्रोटोटाइप के लिए 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 परिभाषाएँ" देखें। |
सुपरक्लास_idx | uint | सुपरक्लास के लिए type_ids सूची में इंडेक्स करें, या स्थिर मान NO_INDEX यदि इस क्लास में कोई सुपरक्लास नहीं है (यानी, यह Object जैसा रूट क्लास है)। यदि मौजूद है, तो यह एक वर्ग प्रकार होना चाहिए, न कि कोई सरणी या आदिम प्रकार। |
इंटरफ़ेस_बंद | uint | फ़ाइल की शुरुआत से इंटरफ़ेस की सूची तक ऑफसेट, या यदि कोई नहीं है तो 0 । यह ऑफ़सेट data अनुभाग में होना चाहिए, और वहां मौजूद डेटा नीचे " type_list " द्वारा निर्दिष्ट प्रारूप में होना चाहिए। सूची का प्रत्येक तत्व एक वर्ग प्रकार (सरणी या आदिम प्रकार नहीं) होना चाहिए, और कोई डुप्लिकेट नहीं होना चाहिए। |
source_file_idx | uint | इस वर्ग (कम से कम अधिकांश) के लिए मूल स्रोत वाली फ़ाइल के नाम के लिए string_ids सूची में अनुक्रमणिका, या इस जानकारी की कमी का प्रतिनिधित्व करने के लिए विशेष मान NO_INDEX । किसी भी विधि का debug_info_item इस स्रोत फ़ाइल को ओवरराइड कर सकता है, लेकिन उम्मीद यह है कि अधिकांश कक्षाएं केवल एक स्रोत फ़ाइल से आएंगी। |
एनोटेशन_बंद | uint | इस वर्ग के लिए फ़ाइल की शुरुआत से एनोटेशन संरचना तक ऑफसेट, या यदि इस वर्ग पर कोई एनोटेशन नहीं है तो 0 । यह ऑफसेट, यदि गैर-शून्य है, तो data अनुभाग में होना चाहिए, और वहां मौजूद डेटा नीचे " annotations_directory_item " द्वारा निर्दिष्ट प्रारूप में होना चाहिए, जिसमें सभी आइटम इस वर्ग को परिभाषित करने वाले के रूप में संदर्भित करते हैं। |
क्लास_डेटा_ऑफ़ | 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_ids अनुभाग में दिखाई देता है
संरेखण: 4 बाइट्स
नाम | प्रारूप | विवरण |
---|---|---|
कॉल_साइट_बंद | uint | साइट परिभाषा को कॉल करने के लिए फ़ाइल की शुरुआत से ऑफसेट करें। ऑफ़सेट डेटा अनुभाग में होना चाहिए, और वहां मौजूद डेटा नीचे "call_site_item" द्वारा निर्दिष्ट प्रारूप में होना चाहिए। |
कॉल_साइट_आइटम
डेटा अनुभाग में दिखाई देता है
संरेखण: कोई नहीं (बाइट संरेखित)
call_site_item एक एन्कोडेड_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
किसी भी अतिरिक्त तर्क के पैरामीटर प्रकार उनके स्थिर मानों से निर्धारित होते हैं।
विधि_हैंडल_आइटम
मेथड_हैंडल अनुभाग में दिखाई देता है
संरेखण: 4 बाइट्स
नाम | प्रारूप | विवरण |
---|---|---|
विधि_हैंडल_प्रकार | उशॉर्ट | विधि हैंडल का प्रकार; नीचे दी गई तालिका देखें |
अप्रयुक्त | उशॉर्ट | (अप्रयुक्त) |
फ़ील्ड_या_विधि_आईडी | उशॉर्ट | फ़ील्ड या विधि आईडी इस पर निर्भर करती है कि विधि हैंडल प्रकार एक एक्सेसर है या विधि इनवॉकर है |
अप्रयुक्त | उशॉर्ट | (अप्रयुक्त) |
विधि हैंडल प्रकार कोड
स्थिर | कीमत | विवरण |
---|---|---|
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_type_invoke_interface | 0x08 | विधि हैंडल एक इंटरफ़ेस विधि इनवॉकर है |
class_data_item
class_def_item से संदर्भित
डेटा अनुभाग में दिखाई देता है
संरेखण: कोई नहीं (बाइट-संरेखित)
नाम | प्रारूप | विवरण |
---|---|---|
static_fields_size | uleb128 | इस आइटम में परिभाषित स्थैतिक क्षेत्रों की संख्या |
ISSING_FIELDS_SIZE | uleb128 | इस आइटम में परिभाषित उदाहरण फ़ील्ड की संख्या |
direct_methods_size | uleb128 | इस आइटम में परिभाषित प्रत्यक्ष तरीकों की संख्या |
VIRTICE_METHODS_SIZE | uleb128 | इस आइटम में परिभाषित आभासी विधियों की संख्या |
static_fields | encoded_field [static_fields_size] | परिभाषित स्थैतिक क्षेत्र, एन्कोडेड तत्वों के अनुक्रम के रूप में प्रतिनिधित्व करते हैं। बढ़ते क्रम में field_idx द्वारा फ़ील्ड को सॉर्ट किया जाना चाहिए। |
Instry_fields | encoded_field [Inst_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 किसी भी प्रत्यक्ष विधि के समान नहीं होनी चाहिए। |
नोट: सभी तत्वों के field_id
s और method_id
s को एक ही परिभाषित वर्ग को संदर्भित करना चाहिए।
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 परिभाषाएँ" देखें। |
कोड_बंद | uleb128 | फ़ाइल की शुरुआत से इस विधि के लिए कोड संरचना के लिए ऑफसेट, या 0 यदि यह विधि या तो abstract या native है। ऑफसेट data अनुभाग में एक स्थान पर होना चाहिए। डेटा का प्रारूप नीचे " code_item " द्वारा निर्दिष्ट किया गया है। |
type_list
class_def_item और proto_id_item से संदर्भित
डेटा अनुभाग में दिखाई देता है
संरेखण: 4 बाइट्स
नाम | प्रारूप | विवरण |
---|---|---|
आकार | uint | सूची का आकार, प्रविष्टियों में |
सूची | type_item [आकार] | सूची के तत्व |
टाइप_टेम प्रारूप
नाम | प्रारूप | विवरण |
---|---|---|
type_idx | उशॉर्ट | INDEX type_ids सूची में |
code_item
encoded_method से संदर्भित
डेटा अनुभाग में दिखाई देता है
संरेखण: 4 बाइट्स
नाम | प्रारूप | विवरण |
---|---|---|
registers_size | उशॉर्ट | इस कोड द्वारा उपयोग किए गए रजिस्टरों की संख्या |
ins_size | उशॉर्ट | इस कोड के लिए आने वाले तर्क के शब्दों की संख्या है |
outs_size | उशॉर्ट | विधि आह्वान के लिए इस कोड द्वारा आवश्यक आउटगोइंग तर्क स्थान के शब्दों की संख्या |
tries_size | उशॉर्ट | इस उदाहरण के लिए try_item s की संख्या। यदि गैर-शून्य है, तो ये इस उदाहरण में insns के बाद ही tries हैं। |
debug_info_off | uint | इस कोड के लिए फ़ाइल की शुरुआत से डिबग जानकारी (लाइन नंबर + स्थानीय चर जानकारी) अनुक्रम के लिए ऑफसेट, या 0 यदि कोई जानकारी नहीं है। ऑफसेट, यदि गैर-शून्य, data अनुभाग में एक स्थान पर होना चाहिए। डेटा का प्रारूप नीचे " debug_info_item " द्वारा निर्दिष्ट किया गया है। |
insns_size | uint | 16-बिट कोड इकाइयों में निर्देश सूची का आकार, |
insns | ushort [insns_size] | Bytecode की वास्तविक सरणी। एक insns सरणी में कोड का प्रारूप साथी दस्तावेज़ Dalvik Bytecode द्वारा निर्दिष्ट किया गया है। ध्यान दें कि हालांकि इसे ushort की एक सरणी के रूप में परिभाषित किया गया है, कुछ आंतरिक संरचनाएं हैं जो चार-बाइट संरेखण पसंद करती हैं। इसके अलावा, यदि यह एक एंडियन-स्वैप्ड फ़ाइल में होता है, तो स्वैपिंग केवल व्यक्तिगत ushort s पर किया जाता है और बड़ी आंतरिक संरचनाओं पर नहीं। |
गद्दी | ushort (वैकल्पिक) = 0 | चार-बाइट को संरेखित करने के लिए tries के दो बाइट्स। यह तत्व केवल तभी मौजूद है जब tries_size गैर-शून्य है और insns_size विषम है। |
की कोशिश करता है | try_item [trys_size] (वैकल्पिक) | सरणी यह दर्शाता है कि कोड अपवादों में कहाँ पकड़ा जाता है और उन्हें कैसे संभालना है। सरणी के तत्वों को रेंज में और निम्न से उच्च पते तक गैर-अतिव्यापी होना चाहिए। यह तत्व केवल तभी मौजूद है जब tries_size गैर-शून्य है। |
संचालकों | encoded_catch_handler_list (वैकल्पिक) | बाइट्स कैच प्रकार और संबंधित हैंडलर पते की सूची की सूची का प्रतिनिधित्व करते हैं। प्रत्येक try_item में इस संरचना में एक बाइट-वार ऑफसेट होता है। यह तत्व केवल तभी मौजूद है जब tries_size गैर-शून्य है। |
try_item प्रारूप
नाम | प्रारूप | विवरण |
---|---|---|
प्रारंभ_पता | uint | इस प्रविष्टि द्वारा कवर किए गए कोड के ब्लॉक का पता प्रारंभ करें। पता पहले कवर किए गए निर्देश की शुरुआत के लिए 16-बिट कोड इकाइयों की एक गिनती है। |
insn_count | उशॉर्ट | इस प्रविष्टि द्वारा कवर 16-बिट कोड इकाइयों की संख्या। अंतिम कोड इकाई कवर (समावेशी) start_addr + insn_count - 1 है। |
हैंडलर_ऑफ | उशॉर्ट | इस प्रविष्टि के लिए encoded_catch_handler के लिए संबद्ध encoded_catch_hander_list की शुरुआत से बाइट्स में ऑफसेट। यह एक encoded_catch_handler की शुरुआत के लिए एक ऑफसेट होना चाहिए। |
encoded_catch_handler_list प्रारूप
नाम | प्रारूप | विवरण |
---|---|---|
आकार | uleb128 | इस सूची का आकार, प्रविष्टियों में |
सूची | encoded_catch_handler [हैंडलर_सिज़] | हैंडलर सूचियों की वास्तविक सूची, सीधे (ऑफसेट के रूप में नहीं) का प्रतिनिधित्व किया, और क्रमिक रूप से सम्मिलित |
encoded_catch_handler प्रारूप
नाम | प्रारूप | विवरण |
---|---|---|
आकार | sleb128 | इस सूची में कैच प्रकार की संख्या। यदि गैर-सकारात्मक है, तो यह कैच प्रकारों की संख्या का नकारात्मक है, और कैच को कैच-ऑल हैंडलर द्वारा पीछा किया जाता है। उदाहरण के लिए: 0 के size का मतलब है कि एक कैच-ऑल है, लेकिन स्पष्ट रूप से टाइप किए गए कैच नहीं हैं। 2 के size का मतलब है कि दो स्पष्ट रूप से टाइप किए गए कैच हैं और कोई कैच-ऑल नहीं है। और -1 के size का मतलब है कि एक कैच -ऑल के साथ एक टाइप किया गया कैच है। |
संचालकों | encoded_type_addr_pair [ABS (आकार)] | abs(size) की धारा एन्कोडेड आइटम, प्रत्येक पकड़े गए प्रकार के लिए, इस क्रम में कि प्रकारों का परीक्षण किया जाना चाहिए। |
catch_all_addr | ULEB128 (वैकल्पिक) | कैच-ऑल हैंडलर का बाइटकोड पता। यह तत्व केवल तभी मौजूद है जब size गैर-सकारात्मक है। |
encoded_type_addr_pair प्रारूप
नाम | प्रारूप | विवरण |
---|---|---|
type_idx | uleb128 | अपवाद के प्रकार को पकड़ने के लिए type_ids सूची में सूचकांक |
प | uleb128 | संबंधित अपवाद हैंडलर का बायटेकोड पता |
debug_info_item
code_item से संदर्भित
डेटा अनुभाग में दिखाई देता है
संरेखण: कोई नहीं (बाइट-संरेखित)
प्रत्येक debug_info_item
एक बौना 3-प्रेरित बाइट-कोडित राज्य मशीन को परिभाषित करता है, जो कि व्याख्या की जाती है, स्थिति तालिका और (संभावित रूप से) एक code_item
के लिए स्थानीय चर जानकारी का उत्सर्जन करती है। अनुक्रम एक चर-लंबाई हेडर के साथ शुरू होता है (जिसकी लंबाई विधि मापदंडों की संख्या पर निर्भर करती है), राज्य मशीन बाइटकोड्स द्वारा पीछा किया जाता है, और एक DBG_END_SEQUENCE
बाइट के साथ समाप्त होता है।
राज्य मशीन में पांच रजिस्टर होते हैं। address
रजिस्टर 16-बिट कोड इकाइयों में संबंधित insns_item
में निर्देश ऑफसेट का प्रतिनिधित्व करता है। address
रजिस्टर प्रत्येक debug_info
अनुक्रम की शुरुआत में 0
से शुरू होता है और केवल एकरस रूप से वृद्धि होनी चाहिए। line
रजिस्टर यह दर्शाता है कि राज्य मशीन द्वारा उत्सर्जित अगले पदों की तालिका प्रविष्टि के साथ क्या स्रोत लाइन नंबर जुड़ा होना चाहिए। यह अनुक्रम हेडर में आरंभ किया जाता है, और सकारात्मक या नकारात्मक दिशाओं में बदल सकता है लेकिन कभी भी 1
से कम नहीं होना चाहिए। source_file
रजिस्टर उस स्रोत फ़ाइल का प्रतिनिधित्व करता है जिसे लाइन नंबर प्रविष्टियाँ संदर्भित करती हैं। यह class_def_item
में source_file_idx
के मान के लिए आरंभीकृत है। अन्य दो चर, prologue_end
और epilogue_begin
, बूलियन झंडे ( false
के लिए आरंभिक) हैं जो इंगित करते हैं कि क्या उत्सर्जित अगली स्थिति को एक विधि प्रस्तावना या उपसंहार माना जाना चाहिए। स्टेट मशीन को DBG_RESTART_LOCAL
कोड के लिए प्रत्येक रजिस्टर में अंतिम स्थानीय चर लाइव के नाम और प्रकार को भी ट्रैक करना होगा।
हेडर इस प्रकार है:
नाम | प्रारूप | विवरण |
---|---|---|
लाइन_स्टार्ट | uleb128 | राज्य मशीन की line रजिस्टर के लिए प्रारंभिक मूल्य। एक वास्तविक स्थिति प्रविष्टि का प्रतिनिधित्व नहीं करता है। |
parameters_size | uleb128 | पैरामीटर नामों की संख्या जो एन्कोडेड हैं। एक इंस्टेंस विधि this छोड़कर, एक प्रति विधि पैरामीटर होना चाहिए, यदि कोई हो। |
parameter_names | ULEB128P1 [पैरामीटर्स_सिज़] | विधि पैरामीटर नाम का स्ट्रिंग सूचकांक। NO_INDEX का एक एन्कोडेड मान इंगित करता है कि संबंधित पैरामीटर के लिए कोई नाम उपलब्ध नहीं है। टाइप डिस्क्रिप्टर और हस्ताक्षर विधि डिस्क्रिप्टर और हस्ताक्षर से निहित हैं। |
बाइट कोड मान इस प्रकार हैं:
नाम | कीमत | प्रारूप | बहस | विवरण |
---|---|---|---|---|
DBG_END_PEATIONENCE | 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 : रजिस्टर जिसमें स्थानीय होगा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 : रजिस्टर जिसमें स्थानीय होगाname_idx : नाम का स्ट्रिंग इंडेक्सtype_idx : प्रकार का सूचकांक टाइप करेंsig_idx : टाइप सिग्नेचर का स्ट्रिंग इंडेक्स | वर्तमान पते पर एक प्रकार के हस्ताक्षर के साथ एक स्थानीय का परिचय देता है। name_idx , type_idx , या sig_idx में से कोई भी यह इंगित करने के लिए NO_INDEX हो सकता है कि यह मान अज्ञात है। (यदि sig_idx -1 है, हालांकि, एक ही डेटा को Opcode 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 ) opcode द्वारा साफ किया जाता है। | |
Dbg_set_epilogue_begin | 0x08 | (कोई नहीं) | epilogue_begin स्टेट मशीन रजिस्टर को सेट करता है, यह दर्शाता है कि जोड़ा गया अगली स्थिति प्रविष्टि को एक विधि उपसंहार की शुरुआत माना जाना चाहिए (विधि से बाहर निकलने से पहले निष्पादन को निलंबित करने के लिए एक उपयुक्त स्थान)। epilogue_begin रजिस्टर किसी भी विशेष ( >= 0x0a ) opcode द्वारा साफ किया जाता है। | |
Dbg_set_file | 0x09 | ULEB128P1 NAME_IDX | name_idx : स्रोत फ़ाइल नाम का स्ट्रिंग सूचकांक; NO_INDEX यदि अज्ञात है | इंगित करता है कि सभी बाद की लाइन नंबर प्रविष्टियाँ code_item में निर्दिष्ट डिफ़ॉल्ट नाम के बजाय इस स्रोत फ़ाइल नाम का संदर्भ देती हैं |
विशेष ओपकोड्स | 0x0a ... 0xff | (कोई नहीं) | line और address रजिस्टरों को आगे बढ़ाता है, एक स्थिति प्रविष्टि का उत्सर्जन करता है, और prologue_end और epilogue_begin साफ करता है। विवरण के लिए नीचे देखें. |
विशेष ओपकोड्स
0x0a
और 0xff
(समावेशी) के बीच मानों के साथ opcodes दोनों 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 [meaths_size] (वैकल्पिक) | संबंधित विधि एनोटेशन की सूची। method_idx द्वारा सूची के तत्वों को बढ़ते क्रम में क्रमबद्ध किया जाना चाहिए। |
पैरामीटर_एनोटेशन | Parameter_annotation [parameters_size] (वैकल्पिक) | संबंधित विधि पैरामीटर एनोटेशन की सूची। method_idx द्वारा सूची के तत्वों को बढ़ते क्रम में क्रमबद्ध किया जाना चाहिए। |
नोट: सभी तत्वों के field_id
s और method_id
s को एक ही परिभाषित वर्ग को संदर्भित करना चाहिए।
फ़ील्ड_नोटेशन प्रारूप
नाम | प्रारूप | विवरण |
---|---|---|
field_idx | uint | फ़ील्ड की पहचान के लिए field_ids सूची में सूचकांक एनोटेट किया जा रहा है |
annotations_off | uint | फ़ाइल की शुरुआत से फ़ील्ड के लिए एनोटेशन की सूची तक ऑफसेट। ऑफसेट data अनुभाग में एक स्थान पर होना चाहिए। डेटा का प्रारूप नीचे " annotation_set_item " द्वारा निर्दिष्ट किया गया है। |
विधि_नोटेशन प्रारूप
नाम | प्रारूप | विवरण |
---|---|---|
method_idx | uint | विधि की पहचान के लिए method_ids सूची में सूचकांक एनोटेट किया जा रहा है |
annotations_off | uint | फ़ाइल की शुरुआत से विधि के लिए एनोटेशन की सूची तक ऑफसेट। ऑफसेट data अनुभाग में एक स्थान पर होना चाहिए। डेटा का प्रारूप नीचे " annotation_set_item " द्वारा निर्दिष्ट किया गया है। |
पैरामीटर_नोटेशन प्रारूप
नाम | प्रारूप | विवरण |
---|---|---|
method_idx | uint | विधि की पहचान के लिए method_ids सूची में सूचकांक जिनके मापदंडों को एनोटेट किया जा रहा है |
annotations_off | uint | विधि मापदंडों के लिए एनोटेशन की सूची में फ़ाइल की शुरुआत से ऑफसेट। ऑफसेट data अनुभाग में एक स्थान पर होना चाहिए। डेटा का प्रारूप नीचे " annotation_set_ref_list " द्वारा निर्दिष्ट किया गया है। |
annotation_set_ref_list
parameter_annotations_item से संदर्भित
डेटा अनुभाग में दिखाई देता है
संरेखण: 4 बाइट्स
नाम | प्रारूप | विवरण |
---|---|---|
आकार | uint | सूची का आकार, प्रविष्टियों में |
सूची | annotation_set_ref_item [आकार] | सूची के तत्व |
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 बाइट्स
नाम | प्रारूप | विवरण |
---|---|---|
आकार | uint | सेट का आकार, प्रविष्टियों में |
प्रविष्टियां | annotation_off_item [आकार] | सेट के तत्व. type_idx द्वारा तत्वों को बढ़ते क्रम में क्रमबद्ध किया जाना चाहिए। |
annotation_off_item प्रारूप
नाम | प्रारूप | विवरण |
---|---|---|
ennotation_off | uint | फ़ाइल की शुरुआत से एक एनोटेशन तक ऑफसेट। ऑफसेट data अनुभाग में एक स्थान पर होना चाहिए, और उस स्थान पर डेटा का प्रारूप नीचे " annotation_item " द्वारा निर्दिष्ट किया गया है। |
ennotation_item
annotation_set_item से संदर्भित
डेटा अनुभाग में दिखाई देता है
संरेखण: कोई नहीं (बाइट-संरेखित)
नाम | प्रारूप | विवरण |
---|---|---|
दृश्यता | ubyte | इस एनोटेशन की इच्छित दृश्यता (नीचे देखें) |
टिप्पणी | encoded_annotation | एन्कोडेड एनोटेशन सामग्री, ऊपर " encoded_annotation प्रारूप" द्वारा वर्णित प्रारूप में " encoded_value एन्कोडिंग" के तहत ऊपर। |
दृश्यता मान
ये annotation_item
में visibility
क्षेत्र के लिए विकल्प हैं:
नाम | कीमत | विवरण |
---|---|---|
दृश्यता_बिल्ड | 0x00 | केवल निर्माण समय पर दिखाई देने का इरादा है (जैसे, अन्य कोड के संकलन के दौरान) |
Visibility_Runtime | 0x01 | रनटाइम पर दिखाई देने का इरादा है |
दृश्यता_सिस्टम | 0x02 | रनटाइम पर दिखाई देने का इरादा है, लेकिन केवल अंतर्निहित प्रणाली के लिए (और नियमित उपयोगकर्ता कोड के लिए नहीं) |
encoded_array_item
class_def_item से संदर्भित
डेटा अनुभाग में दिखाई देता है
संरेखण: कोई नहीं (बाइट-संरेखित)
नाम | प्रारूप | विवरण |
---|---|---|
कीमत | encoded_array | उपरोक्त " encoded_value एन्कोडिंग" के तहत " encoded_array प्रारूप" द्वारा निर्दिष्ट प्रारूप में एन्कोडेड सरणी मूल्य का प्रतिनिधित्व करने वाले बाइट्स। |
Hiddenapi_class_data_item
इस खंड में प्रत्येक वर्ग द्वारा उपयोग किए जाने वाले प्रतिबंधित इंटरफेस पर डेटा शामिल है।
नोट: हिडन एपीआई सुविधा को एंड्रॉइड 10.0 में पेश किया गया था और यह केवल बूट क्लास पथ में कक्षाओं की DEX फ़ाइलों पर लागू होता है। नीचे वर्णित झंडे की सूची को एंड्रॉइड के भविष्य के रिलीज़ में बढ़ाया जा सकता है। अधिक जानकारी के लिए, गैर-एसडीके इंटरफेस पर प्रतिबंध देखें।
नाम | प्रारूप | विवरण |
---|---|---|
आकार | uint | अनुभाग का कुल आकार |
ऑफसेट | uint [] | class_idx द्वारा अनुक्रमित ऑफसेट की सरणी। INDEX class_idx पर एक शून्य सरणी प्रविष्टि का मतलब है कि या तो इस class_idx के लिए कोई डेटा नहीं है, या सभी छिपे हुए एपीआई झंडे शून्य हैं। अन्यथा सरणी प्रविष्टि गैर-शून्य है और इसमें अनुभाग की शुरुआत से इस class_idx के लिए छिपे हुए एपीआई झंडे की एक सरणी तक एक ऑफसेट होता है। |
झंडे | ULEB128 [] | प्रत्येक वर्ग के लिए छिपे हुए एपीआई झंडे के संक्षिप्त सरणियाँ। संभावित ध्वज मान नीचे दी गई तालिका में वर्णित हैं। झंडे को उसी क्रम में एन्कोड किया जाता है जैसे कि फ़ील्ड और विधियां कक्षा डेटा में एन्कोड किए जाते हैं। |
प्रतिबंध ध्वज प्रकार:
नाम | कीमत | विवरण |
---|---|---|
श्वेत सूची | 0 | इंटरफेस जो स्वतंत्र रूप से उपयोग किए जा सकते हैं और आधिकारिक तौर पर प्रलेखित एंड्रॉइड फ्रेमवर्क पैकेज इंडेक्स के हिस्से के रूप में समर्थित हैं। |
ग्रीलिस्ट | 1 | गैर-एसडीके इंटरफेस जो एप्लिकेशन के लक्ष्य एपीआई स्तर की परवाह किए बिना उपयोग किए जा सकते हैं। |
काला सूची में डालना | 2 | गैर-एसडीके इंटरफेस जो एप्लिकेशन के लक्ष्य एपीआई स्तर की परवाह किए बिना उपयोग नहीं किया जा सकता है। इनमें से किसी एक इंटरफेस तक पहुंचने से रनटाइम त्रुटि होती है। |
ग्रीलिस्ट ‘मैक्स‘ ओ | 3 | गैर-एसडीके इंटरफेस जो कि एंड्रॉइड 8.x और नीचे के लिए उपयोग किए जा सकते हैं जब तक कि वे प्रतिबंधित न हों। |
greylist ‘max‘ p | 4 | गैर-एसडीके इंटरफेस जो कि एंड्रॉइड 9.x के लिए उपयोग किए जा सकते हैं जब तक कि वे प्रतिबंधित न हों। |
greylist ‘max the q | 5 | गैर-एसडीके इंटरफेस जो कि एंड्रॉइड 10.x के लिए उपयोग किए जा सकते हैं जब तक कि वे प्रतिबंधित न हों। |
Greylist ‘Max - R | 6 | गैर-एसडीके इंटरफेस जो कि एंड्रॉइड 11.x के लिए उपयोग किए जा सकते हैं जब तक कि वे प्रतिबंधित न हों। |
तंत्र एनोटेशन
सिस्टम एनोटेशन का उपयोग कक्षाओं (और विधियों और क्षेत्रों) के बारे में चिंतनशील जानकारी के विभिन्न टुकड़ों का प्रतिनिधित्व करने के लिए किया जाता है। यह जानकारी आम तौर पर केवल क्लाइंट (गैर-सिस्टम) कोड द्वारा अप्रत्यक्ष रूप से एक्सेस की जाती है।
सिस्टम एनोटेशन को .dex
फ़ाइलों में दृश्यता के साथ VISIBILITY_SYSTEM
के साथ एनोटेशन के रूप में दर्शाया गया है।
dalvik.annotation.annotationDefault
एनोटेशन इंटरफेस में तरीकों पर दिखाई देता है
एक AnnotationDefault
एनोटेशन प्रत्येक एनोटेशन इंटरफ़ेस से जुड़ा हुआ है जो डिफ़ॉल्ट बाइंडिंग को इंगित करना चाहता है।
नाम | प्रारूप | विवरण |
---|---|---|
कीमत | टिप्पणी | इस एनोटेशन के लिए डिफ़ॉल्ट बाइंडिंग, इस प्रकार के एनोटेशन के रूप में प्रतिनिधित्व किया गया। एनोटेशन को एनोटेशन द्वारा परिभाषित सभी नामों को शामिल करने की आवश्यकता नहीं है; लापता नामों में बस चूक नहीं होती है। |
dalvik.annotation.enclosingclass
कक्षाओं पर दिखाई देता है
एक EnclosingClass
एनोटेशन प्रत्येक वर्ग से जुड़ा हुआ है, जिसे या तो किसी अन्य वर्ग के सदस्य के रूप में परिभाषित किया गया है, प्रति से, या गुमनाम है, लेकिन एक विधि निकाय (जैसे, एक सिंथेटिक आंतरिक वर्ग) के भीतर परिभाषित नहीं है। इस एनोटेशन वाले प्रत्येक वर्ग में एक InnerClass
एनोटेशन भी होना चाहिए। इसके अतिरिक्त, एक वर्ग में एक EnclosingClass
और एक EnclosingMethod
एनोटेशन दोनों नहीं होना चाहिए।
नाम | प्रारूप | विवरण |
---|---|---|
कीमत | कक्षा | वह वर्ग जो सबसे अधिक बारीकी से इस वर्ग को स्कोप करता है |
dalvik.annotation.enclosingmethod
कक्षाओं पर दिखाई देता है
एक EnclosingMethod
एनोटेशन प्रत्येक वर्ग से जुड़ा हुआ है जिसे एक विधि शरीर के अंदर परिभाषित किया गया है। इस एनोटेशन वाले प्रत्येक वर्ग में एक InnerClass
एनोटेशन भी होना चाहिए। इसके अतिरिक्त, एक वर्ग में एक EnclosingClass
और एक EnclosingMethod
एनोटेशन दोनों नहीं होना चाहिए।
नाम | प्रारूप | विवरण |
---|---|---|
कीमत | तरीका | वह विधि जो सबसे बारीकी से इस वर्ग को स्कोप करती है |
dalvik.annotation.innerclass
कक्षाओं पर दिखाई देता है
एक InnerClass
एनोटेशन प्रत्येक वर्ग से जुड़ा हुआ है जिसे दूसरे वर्ग की परिभाषा के शाब्दिक दायरे में परिभाषित किया गया है। इस एनोटेशन के पास कोई भी वर्ग भी या तो EnclosingClass
एनोटेशन या EnclosingMethod
एनोटेशन होना चाहिए।
नाम | प्रारूप | विवरण |
---|---|---|
नाम | डोरी | मूल रूप से इस वर्ग का सरल नाम घोषित किया गया (किसी भी पैकेज उपसर्ग सहित)। यदि यह वर्ग गुमनाम है, तो नाम null है। |
AccessFlags | int यहाँ | मूल रूप से कक्षा के एक्सेस फ्लैग घोषित किए गए (जो स्रोत भाषा और लक्ष्य वर्चुअल मशीन के निष्पादन मॉडल के बीच बेमेल के कारण प्रभावी झंडे से भिन्न हो सकते हैं) |
dalvik.annotation.memberclasses
कक्षाओं पर दिखाई देता है
एक MemberClasses
एनोटेशन प्रत्येक वर्ग से जुड़ा होता है जो सदस्य वर्गों की घोषणा करता है। (एक सदस्य वर्ग एक प्रत्यक्ष आंतरिक वर्ग है जिसका एक नाम है।)
नाम | प्रारूप | विवरण |
---|---|---|
कीमत | कक्षा[] | सदस्य वर्गों का सरणी |
dalvik.annotation.methodparameters
तरीकों पर दिखाई देता है
नोट: यह एनोटेशन एंड्रॉइड 7.1 के बाद जोड़ा गया था। पहले के एंड्रॉइड रिलीज पर इसकी उपस्थिति को नजरअंदाज कर दिया जाएगा।
एक MethodParameters
एनोटेशन वैकल्पिक है और इसका उपयोग पैरामीटर मेटाडेटा जैसे पैरामीटर नाम और संशोधक प्रदान करने के लिए किया जा सकता है।
एनोटेशन को एक विधि या कंस्ट्रक्टर से सुरक्षित रूप से छोड़ा जा सकता है जब पैरामीटर मेटाडेटा को रनटाइम पर आवश्यक नहीं होता है। java.lang.reflect.Parameter.isNamePresent()
उपयोग यह जांचने के लिए किया जा सकता है कि क्या मेटाडेटा एक पैरामीटर के लिए मौजूद है, और संबंधित प्रतिबिंब विधियां जैसे कि java.lang.reflect.Parameter.getName()
रनटाइम पर डिफ़ॉल्ट व्यवहार पर वापस आ जाएगी। यदि जानकारी मौजूद नहीं है।
जब पैरामीटर मेटाडेटा शामिल है, तो कंपाइलरों को उत्पन्न कक्षाओं जैसे कि एनम्स के लिए जानकारी शामिल होनी चाहिए, क्योंकि पैरामीटर मेटाडेटा में शामिल है कि एक पैरामीटर सिंथेटिक या अनिवार्य है या नहीं।
एक MethodParameters
एनोटेशन केवल व्यक्तिगत विधि मापदंडों का वर्णन करता है। इसलिए, संकलक कोड-आकार और रनटाइम दक्षता के लिए पूरी तरह से कंस्ट्रक्टरों और तरीकों के लिए एनोटेशन को छोड़ सकते हैं, जिनके पास कोई पैरामीटर नहीं है।
नीचे दिए गए सरणियों को विधि से जुड़े method_id_item
डेक्स संरचना के लिए एक ही आकार होना चाहिए, अन्यथा एक java.lang.reflect.MalformedParametersException
को रनटाइम पर फेंक दिया जाएगा।
वह names().length
accessFlags().length
method_id_item.proto_idx
- type_list.size
proto_id_item.parameters_off
-
क्योंकि MethodParameters
सभी औपचारिक विधि मापदंडों का वर्णन करता है, यहां तक कि उन लोगों को भी स्पष्ट रूप से या निहित रूप से स्रोत कोड में घोषित नहीं किया गया है, सरणियों का आकार हस्ताक्षर या अन्य मेटाडेटा जानकारी से भिन्न हो सकता है जो केवल स्रोत कोड में घोषित स्पष्ट मापदंडों पर आधारित है। MethodParameters
टाइप एनोटेशन रिसीवर मापदंडों के बारे में कोई जानकारी भी शामिल नहीं होगी जो वास्तविक विधि हस्ताक्षर में मौजूद नहीं हैं।
नाम | प्रारूप | विवरण |
---|---|---|
नाम | डोरी[] | संबंधित विधि के लिए औपचारिक मापदंडों के नाम। सरणी शून्य नहीं होनी चाहिए, लेकिन अगर कोई औपचारिक पैरामीटर नहीं हैं तो खाली होना चाहिए। यदि उस सूचकांक के साथ औपचारिक पैरामीटर का कोई नाम नहीं है, तो सरणी में एक मान शून्य होना चाहिए। यदि पैरामीटर नाम स्ट्रिंग्स खाली हैं या शामिल हैं java.lang.reflect.MalformedParametersException |
AccessFlags | int[] | संबंधित विधि के लिए औपचारिक मापदंडों के एक्सेस झंडे। सरणी शून्य नहीं होनी चाहिए, लेकिन अगर कोई औपचारिक पैरामीटर नहीं हैं तो खाली होना चाहिए। मान निम्न मानों के साथ थोड़ा मास्क है:
java.lang.reflect.MalformedParametersException को रनटाइम पर फेंक दिया जाएगा। |
dalvik.annotation.signature
कक्षाओं, क्षेत्रों और तरीकों पर दिखाई देता है
एक Signature
एनोटेशन प्रत्येक वर्ग, फ़ील्ड, या विधि से जुड़ा हुआ है, जिसे एक प्रकार से अधिक जटिल प्रकार के संदर्भ में परिभाषित किया गया है, जो एक type_id_item
द्वारा प्रतिनिधित्व योग्य है। .dex
प्रारूप हस्ताक्षर के लिए प्रारूप को परिभाषित नहीं करता है; यह केवल उस भाषा के शब्दार्थ के सफल कार्यान्वयन के लिए एक स्रोत भाषा को जो भी हस्ताक्षर की आवश्यकता है, उसका प्रतिनिधित्व करने में सक्षम होने के लिए है। जैसे, वर्चुअल मशीन कार्यान्वयन द्वारा आम तौर पर हस्ताक्षर (या सत्यापित) नहीं किए जाते हैं। हस्ताक्षर केवल उच्च-स्तरीय एपीआई और उपकरण (जैसे डिबगर्स) को सौंप दिए जाते हैं। एक हस्ताक्षर का कोई भी उपयोग, इसलिए, लिखा जाना चाहिए ताकि केवल वैध हस्ताक्षर प्राप्त करने के बारे में कोई धारणा न हो, स्पष्ट रूप से एक वाक्यात्मक रूप से अमान्य हस्ताक्षर में आने की संभावना के खिलाफ खुद को संरक्षित करना।
क्योंकि सिग्नेचर स्ट्रिंग्स में बहुत अधिक डुप्लिकेट की गई सामग्री होती है, एक Signature
एनोटेशन को स्ट्रिंग्स की एक सरणी के रूप में परिभाषित किया जाता है, जहां डुप्लिकेट किए गए तत्व स्वाभाविक रूप से एक ही अंतर्निहित डेटा को संदर्भित करते हैं, और हस्ताक्षर को सरणी में सभी स्ट्रिंग्स का संक्रांति माना जाता है। . अलग -अलग तारों में एक हस्ताक्षर को अलग करने के तरीके के बारे में कोई नियम नहीं हैं; यह पूरी तरह से उन उपकरणों पर निर्भर करता है जो .dex
फ़ाइलें उत्पन्न करते हैं।
नाम | प्रारूप | विवरण |
---|---|---|
कीमत | डोरी[] | इस वर्ग या सदस्य के हस्ताक्षर, स्ट्रिंग्स की एक सरणी के रूप में जो एक साथ समेटे हुए हैं |
dalvik.annotation.throws
तरीकों पर दिखाई देता है
एक Throws
एनोटेशन प्रत्येक विधि से जुड़ा होता है जिसे एक या अधिक अपवाद प्रकारों को फेंकने के लिए घोषित किया जाता है।
नाम | प्रारूप | विवरण |
---|---|---|
कीमत | कक्षा[] | अपवाद प्रकारों की सरणी फेंक दी गई |