ডালভিক এক্সিকিউটেবল ফরম্যাট

এই ডকুমেন্টটি .dex ফাইলের লেআউট এবং বিষয়বস্তু বর্ণনা করে, যেগুলি ক্লাস সংজ্ঞা এবং তাদের সংশ্লিষ্ট উপাত্তের একটি সেট রাখতে ব্যবহৃত হয়।

প্রকারের নির্দেশিকা

নাম বর্ণনা
বাইট 8-বিট স্বাক্ষরিত int
ubyte 8-বিট স্বাক্ষরবিহীন int
সংক্ষিপ্ত 16-বিট স্বাক্ষরিত int, সামান্য-এন্ডিয়ান
ছোট 16-বিট স্বাক্ষরবিহীন int, সামান্য-এন্ডিয়ান
int 32-বিট স্বাক্ষরিত int, সামান্য-এন্ডিয়ান
uint 32-বিট স্বাক্ষরবিহীন int, সামান্য-এন্ডিয়ান
দীর্ঘ 64-বিট স্বাক্ষরিত int, সামান্য-এন্ডিয়ান
ulong 64-বিট স্বাক্ষরবিহীন int, সামান্য-এন্ডিয়ান
sleb128 স্বাক্ষরিত LEB128, পরিবর্তনশীল-দৈর্ঘ্য (নীচে দেখুন)
uleb128 স্বাক্ষরবিহীন LEB128, পরিবর্তনশীল-দৈর্ঘ্য (নীচে দেখুন)
uleb128p1 স্বাক্ষরবিহীন LEB128 প্লাস 1 , পরিবর্তনশীল-দৈর্ঘ্য (নীচে দেখুন)

LEB128

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
7f -1 127 126
80 7f -128 16256 16255

ফাইল লেআউট

নাম বিন্যাস বর্ণনা
হেডার হেডার_আইটেম হেডার
স্ট্রিং_আইডি স্ট্রিং_আইডি_আইটেম[] স্ট্রিং শনাক্তকারী তালিকা. এগুলি এই ফাইলের দ্বারা ব্যবহৃত সমস্ত স্ট্রিংগুলির জন্য শনাক্তকারী, হয় অভ্যন্তরীণ নামকরণের জন্য (যেমন, টাইপ বর্ণনাকারী) বা কোড দ্বারা উল্লেখিত ধ্রুবক বস্তু হিসাবে। এই তালিকাটি অবশ্যই UTF-16 কোড পয়েন্ট মান ব্যবহার করে স্ট্রিং বিষয়বস্তু দ্বারা বাছাই করা উচিত (স্থানীয়-সংবেদনশীল পদ্ধতিতে নয়), এবং এটিতে অবশ্যই কোনো ডুপ্লিকেট এন্ট্রি থাকবে না।
type_ids টাইপ_আইডি_আইটেম[] টাইপ শনাক্তকারী তালিকা. ফাইলে সংজ্ঞায়িত হোক বা না হোক এই ফাইলের দ্বারা উল্লেখ করা সমস্ত প্রকারের (শ্রেণী, অ্যারে, বা আদিম প্রকার) জন্য এইগুলি শনাক্তকারী৷ এই তালিকাটি string_id সূচী অনুসারে বাছাই করা আবশ্যক, এবং এটিতে অবশ্যই কোনো ডুপ্লিকেট এন্ট্রি থাকবে না।
proto_ids প্রোটো_আইডি_আইটেম[] পদ্ধতি প্রোটোটাইপ শনাক্তকারী তালিকা. এই ফাইলের দ্বারা উল্লেখ করা সমস্ত প্রোটোটাইপের জন্য এইগুলি শনাক্তকারী৷ এই তালিকাটি অবশ্যই রিটার্ন-টাইপ ( type_id সূচক অনুসারে) প্রধান ক্রম অনুসারে সাজাতে হবে এবং তারপরে আর্গুমেন্ট তালিকা (লেক্সিকোগ্রাফিক ক্রম, type_id সূচক অনুসারে পৃথক আর্গুমেন্ট) অনুসারে সাজাতে হবে। তালিকায় কোনো ডুপ্লিকেট এন্ট্রি থাকা উচিত নয়।
field_ids ক্ষেত্র_আইডি_আইটেম[] ক্ষেত্র শনাক্তকারী তালিকা। ফাইলে সংজ্ঞায়িত হোক বা না হোক এই ফাইলের দ্বারা উল্লেখ করা সমস্ত ক্ষেত্রের জন্য এগুলি শনাক্তকারী৷ এই তালিকাটি অবশ্যই সাজাতে হবে, যেখানে সংজ্ঞায়িত প্রকার ( type_id সূচক দ্বারা) প্রধান ক্রম, ক্ষেত্রের নাম ( string_id সূচক দ্বারা) মধ্যবর্তী ক্রম, এবং টাইপ ( type_id সূচক দ্বারা) হল ছোট ক্রম। তালিকায় কোনো ডুপ্লিকেট এন্ট্রি থাকা উচিত নয়।
পদ্ধতি_আইডি পদ্ধতি_আইডি_আইটেম[] পদ্ধতি শনাক্তকারী তালিকা। ফাইলে সংজ্ঞায়িত হোক বা না হোক এই ফাইলের দ্বারা উল্লেখ করা সমস্ত পদ্ধতির জন্য এগুলি শনাক্তকারী। এই তালিকাটি অবশ্যই সাজাতে হবে, যেখানে সংজ্ঞায়িত প্রকার ( type_id সূচক দ্বারা) প্রধান ক্রম, পদ্ধতির নাম ( string_id সূচক দ্বারা) হল মধ্যবর্তী ক্রম এবং পদ্ধতির প্রোটোটাইপ ( proto_id সূচক দ্বারা) হল ছোট ক্রম। তালিকায় কোনো ডুপ্লিকেট এন্ট্রি থাকা উচিত নয়।
class_defs class_def_item[] শ্রেণীর সংজ্ঞা তালিকা। ক্লাসগুলিকে এমনভাবে অর্ডার করতে হবে যাতে প্রদত্ত ক্লাসের সুপারক্লাস এবং বাস্তবায়িত ইন্টারফেসগুলি রেফারিং ক্লাসের আগে তালিকায় উপস্থিত হয়। তদ্ব্যতীত, তালিকায় একাধিকবার উপস্থিত হওয়া একই নামের ক্লাসের জন্য একটি সংজ্ঞার জন্য এটি অবৈধ।
কল_সাইট_আইডি কল_সাইট_আইডি_আইটেম[] কল সাইট শনাক্তকারী তালিকা. ফাইলে সংজ্ঞায়িত হোক বা না হোক এই ফাইলের দ্বারা উল্লেখ করা সমস্ত কল সাইটের জন্য এগুলি শনাক্তকারী৷ এই তালিকাটি অবশ্যই call_site_off ঊর্ধ্বক্রম অনুসারে সাজাতে হবে।
পদ্ধতি_হ্যান্ডল পদ্ধতি_হ্যান্ডেল_আইটেম[] পদ্ধতি হ্যান্ডেল তালিকা। এই ফাইলের দ্বারা উল্লেখ করা সমস্ত পদ্ধতির হ্যান্ডেলগুলির একটি তালিকা, ফাইলে সংজ্ঞায়িত হোক বা না হোক। এই তালিকাটি সাজানো হয়নি এবং এতে ডুপ্লিকেট থাকতে পারে যা যৌক্তিকভাবে বিভিন্ন পদ্ধতি হ্যান্ডেল উদাহরণের সাথে মিলে যাবে।
তথ্য ubyte[] ডেটা এলাকা, উপরে তালিকাভুক্ত টেবিলের জন্য সমস্ত সমর্থন ডেটা রয়েছে। বিভিন্ন আইটেমের বিভিন্ন প্রান্তিককরণের প্রয়োজনীয়তা রয়েছে এবং যথাযথ প্রান্তিককরণ অর্জনের জন্য প্রয়োজন হলে প্রতিটি আইটেমের আগে প্যাডিং বাইট ঢোকানো হয়।
লিঙ্ক_ডেটা ubyte[] স্ট্যাটিকভাবে লিঙ্ক করা ফাইলে ব্যবহৃত ডেটা। এই বিভাগে তথ্য বিন্যাস এই নথি দ্বারা অনির্দিষ্ট রেখে গেছে. এই বিভাগটি আনলিঙ্ক করা ফাইলগুলিতে খালি, এবং রানটাইম বাস্তবায়নগুলি উপযুক্ত হিসাবে এটি ব্যবহার করতে পারে।

বিটফিল্ড, স্ট্রিং এবং ধ্রুবক সংজ্ঞা

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 9.0 রিলিজে ফর্ম্যাটের 039 সংস্করণের জন্য সমর্থন যোগ করা হয়েছিল, যা দুটি নতুন বাইটকোড, const-method-handle এবং const-method-type চালু করেছে। (এগুলি প্রতিটি বাইটকোড সেট টেবিলের সারাংশে বর্ণিত হয়েছে।) Android 10-এ, সংস্করণ 039 লুকানো API তথ্য অন্তর্ভুক্ত করার জন্য DEX ফাইল বিন্যাসকে প্রসারিত করে যা শুধুমাত্র বুট ক্লাস পাথের DEX ফাইলগুলির জন্য প্রযোজ্য।

দ্রষ্টব্য: Android 8.0 রিলিজে ফর্ম্যাটের 038 সংস্করণের জন্য সমর্থন যোগ করা হয়েছে। সংস্করণ 038 নতুন বাইটকোড যুক্ত করেছে ( invoke-polymorphic এবং invoke-custom ) এবং পদ্ধতি হ্যান্ডেলগুলির জন্য ডেটা।

দ্রষ্টব্য: Android 7.0 রিলিজে ফর্ম্যাটের 037 সংস্করণের জন্য সমর্থন যোগ করা হয়েছে। সংস্করণ 037 এর আগে অ্যান্ড্রয়েডের বেশিরভাগ সংস্করণ ফরম্যাটের সংস্করণ 035 ব্যবহার করেছে। সংস্করণ 035 এবং 037 মধ্যে একমাত্র পার্থক্য হল ডিফল্ট পদ্ধতির সংযোজন এবং invoke সমন্বয়।

দ্রষ্টব্য: সর্বজনীন সফ্টওয়্যার প্রকাশগুলিতে বিন্যাসের অন্তত কয়েকটি পূর্ববর্তী সংস্করণ ব্যবহার করা হয়েছে। উদাহরণস্বরূপ, সংস্করণ 009 অ্যান্ড্রয়েড প্ল্যাটফর্মের M3 রিলিজের জন্য ব্যবহার করা হয়েছিল (নভেম্বর-ডিসেম্বর 2007), এবং সংস্করণ 013 ব্যবহার করা হয়েছিল অ্যান্ড্রয়েড প্ল্যাটফর্মের M5 রিলিজের জন্য (ফেব্রুয়ারি-মার্চ 2008)। বিভিন্ন দিক থেকে, বিন্যাসের এই আগের সংস্করণগুলি এই নথিতে বর্ণিত সংস্করণ থেকে উল্লেখযোগ্যভাবে পৃথক।

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 এবং InnerClas এ এমবেড করা হয়েছে

এই পতাকার বিটফিল্ডগুলি ক্লাস এবং ক্লাস সদস্যদের অ্যাক্সেসযোগ্যতা এবং সামগ্রিক বৈশিষ্ট্যগুলি নির্দেশ করতে ব্যবহৃত হয়।

নাম মান ক্লাসের জন্য (এবং InnerClass টীকা) ক্ষেত্রগুলির জন্য পদ্ধতির জন্য
ACC_Public 0x1 public : সর্বত্র দৃশ্যমান public : সর্বত্র দৃশ্যমান public : সর্বত্র দৃশ্যমান
ACC_PRIVATE 0x2 * private : শুধুমাত্র ক্লাস সংজ্ঞায়িত করার জন্য দৃশ্যমান private : শুধুমাত্র ক্লাস সংজ্ঞায়িত করার জন্য দৃশ্যমান private : শুধুমাত্র ক্লাস সংজ্ঞায়িত করার জন্য দৃশ্যমান
ACC_PROTECTED 0x4 * protected : প্যাকেজ এবং সাবক্লাসে দৃশ্যমান protected : প্যাকেজ এবং সাবক্লাসে দৃশ্যমান protected : প্যাকেজ এবং সাবক্লাসে দৃশ্যমান
ACC_STATIC 0x8 * static : this রেফারেন্সের বাইরের দিয়ে তৈরি করা হয় না static : গ্লোবাল থেকে ডিফাইনিং ক্লাস static : this যুক্তি গ্রহণ করে না
ACC_FINAL 0x10 final : সাবক্লাসেবল নয় final : নির্মাণের পরে অপরিবর্তনীয় final : ওভাররিডেবল নয়
ACC_SYNCHRONIZED 0x20 synchronized : যুক্ত লক স্বয়ংক্রিয়ভাবে এই পদ্ধতিতে কলের চারপাশে অর্জিত।

দ্রষ্টব্য: এটি শুধুমাত্র সেট করার জন্য বৈধ যখন ACC_NATIVE ও সেট করা থাকে।

ACC_VOLATILE 0x40 volatile : থ্রেড নিরাপত্তার জন্য সাহায্য করার জন্য বিশেষ অ্যাক্সেসের নিয়ম
ACC_BRIDGE 0x40 সেতু পদ্ধতি, একটি টাইপ-নিরাপদ সেতু হিসাবে কম্পাইলার দ্বারা স্বয়ংক্রিয়ভাবে যোগ করা হয়েছে
ACC_TRANSIENT 0x80 transient : ডিফল্ট সিরিয়ালাইজেশন দ্বারা সংরক্ষণ করা যাবে না
ACC_VARARGS 0x80 শেষ যুক্তিকে কম্পাইলার দ্বারা একটি "বিশ্রাম" যুক্তি হিসাবে বিবেচনা করা উচিত
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_
সিঙ্ক্রোনাইজড
0x20000 synchronized ঘোষণা করা হয়েছে।

দ্রষ্টব্য: এটি কার্যকর করার উপর কোন প্রভাব ফেলে না (এই পতাকার প্রতিফলন ব্যতীত, প্রতি সে)।

* শুধুমাত্র InnerClass টীকাগুলির জন্য অনুমোদিত, এবং কখনই একটি class_def_item এ চালু করা উচিত নয়।

পরিবর্তিত 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 প্রকৃতপক্ষে (অপেক্ষাকৃত কম সুপরিচিত) এনকোডিং CESU-8- এর থেকে UTF-8 প্রতি সে-এর কাছাকাছি।

encoded_value এনকোডিং

annotation_element এবং encoded_array_item এ এমবেড করা হয়েছে

একটি encoded_value হল (প্রায়) নির্বিচারে শ্রেণীবদ্ধভাবে কাঠামোবদ্ধ ডেটার একটি এনকোড করা অংশ। এনকোডিংটি কম্প্যাক্ট এবং পার্স করার জন্য সহজবোধ্য উভয়ই বোঝানো হয়েছে।

নাম বিন্যাস বর্ণনা
(মান_আর্গ << 5) | মান_প্রকার 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[আকার] স্বাক্ষরিত দুই-বাইট পূর্ণসংখ্যা মান, সাইন-বর্ধিত
VALUE_CHAR 0x03 আকার - 1 (0…1) ubyte[আকার] স্বাক্ষরবিহীন দুই-বাইট পূর্ণসংখ্যা মান, শূন্য-বর্ধিত
VALUE_INT 0x04 আকার - 1 (0…3) ubyte[আকার] স্বাক্ষরিত চার-বাইট পূর্ণসংখ্যা মান, সাইন-বর্ধিত
VALUE_LONG 0x06 আকার - 1 (0…7) ubyte[আকার] স্বাক্ষরিত আট-বাইট পূর্ণসংখ্যা মান, সাইন-বর্ধিত
VALUE_FLOAT 0x10 আকার - 1 (0…3) ubyte[আকার] চার-বাইট বিট প্যাটার্ন, ডানদিকে শূন্য-প্রসারিত এবং IEEE754 32-বিট ফ্লোটিং পয়েন্ট মান হিসাবে ব্যাখ্যা করা হয়েছে
VALUE_DOUBLE 0x11 আকার - 1 (0…7) ubyte[আকার] আট-বাইট বিট প্যাটার্ন, ডানদিকে শূন্য-প্রসারিত এবং IEEE754 64-বিট ফ্লোটিং পয়েন্ট মান হিসাবে ব্যাখ্যা করা হয়েছে
VALUE_METHOD_TYPE 0x15 আকার - 1 (0…3) ubyte[আকার] স্বাক্ষরবিহীন (শূন্য-বর্ধিত) চার-বাইট পূর্ণসংখ্যার মান, proto_ids বিভাগে একটি সূচক হিসাবে ব্যাখ্যা করা হয় এবং একটি পদ্ধতি প্রকারের মান উপস্থাপন করে
VALUE_METHOD_HANDLE 0x16 আকার - 1 (0…3) ubyte[আকার] স্বাক্ষরবিহীন (শূন্য-বর্ধিত) চার-বাইট পূর্ণসংখ্যা মান, method_handles বিভাগে একটি সূচক হিসাবে ব্যাখ্যা করা হয়েছে এবং একটি পদ্ধতি হ্যান্ডেল মান উপস্থাপন করে
VALUE_STRING 0x17 আকার - 1 (0…3) ubyte[আকার] স্বাক্ষরবিহীন (শূন্য-বর্ধিত) চার-বাইট পূর্ণসংখ্যা মান, string_ids বিভাগে একটি সূচক হিসাবে ব্যাখ্যা করা হয় এবং একটি স্ট্রিং মান উপস্থাপন করে
VALUE_TYPE 0x18 আকার - 1 (0…3) ubyte[আকার] স্বাক্ষরবিহীন (শূন্য-বর্ধিত) চার-বাইট পূর্ণসংখ্যা মান, type_ids বিভাগে একটি সূচক হিসাবে ব্যাখ্যা করা হয় এবং একটি প্রতিফলিত প্রকার/শ্রেণী মান উপস্থাপন করে
VALUE_FIELD 0x19 আকার - 1 (0…3) ubyte[আকার] স্বাক্ষরবিহীন (শূন্য-বর্ধিত) চার-বাইট পূর্ণসংখ্যা মান, field_ids বিভাগে একটি সূচক হিসাবে ব্যাখ্যা করা হয়েছে এবং একটি প্রতিফলিত ক্ষেত্র মান উপস্থাপন করে
VALUE_METHOD 0x1a আকার - 1 (0…3) ubyte[আকার] স্বাক্ষরবিহীন (শূন্য-বর্ধিত) চার-বাইট পূর্ণসংখ্যার মান, method_ids বিভাগে একটি সূচক হিসাবে ব্যাখ্যা করা হয়েছে এবং একটি প্রতিফলিত পদ্ধতির মান উপস্থাপন করে
VALUE_ENUM 0x1 খ আকার - 1 (0…3) ubyte[আকার] স্বাক্ষরবিহীন (শূন্য-বর্ধিত) চার-বাইট পূর্ণসংখ্যার মান, field_ids বিভাগে একটি সূচক হিসাবে ব্যাখ্যা করা হয় এবং একটি গণনাকৃত টাইপ ধ্রুবকের মান উপস্থাপন করে
VALUE_ARRAY 0x1c (কোনটিই নয়; 0 হতে হবে) encoded_array মানগুলির একটি বিন্যাস, নীচে " encoded_array বিন্যাস" দ্বারা নির্দিষ্ট করা বিন্যাসে। value আকার এনকোডিং এর মধ্যে নিহিত।
VALUE_ANNOTATION 0x1d (কোনটিই নয়; 0 হতে হবে) এনকোডেড_টীকা একটি উপ-টীকা, নীচের " encoded_annotation বিন্যাস" দ্বারা নির্দিষ্ট করা বিন্যাসে। value আকার এনকোডিং এর মধ্যে নিহিত।
VALUE_NULL 0x1e (কোনটিই নয়; 0 হতে হবে) (কোনটিই নয়) null রেফারেন্স মান
VALUE_BOOLEAN 0x1f বুলিয়ান (0…1) (কোনটিই নয়) এক-বিট মান; false জন্য 0 এবং true জন্য 1 । বিট value_arg উপস্থাপন করা হয়।

encoded_array বিন্যাস

নাম বিন্যাস বর্ণনা
আকার uleb128 অ্যারের উপাদানের সংখ্যা
মান encoded_value[আকার] এই বিভাগ দ্বারা নির্দিষ্ট বিন্যাসে size encoded_value বাইট ক্রমগুলির একটি সিরিজ, ক্রমানুসারে সংযুক্ত।

এনকোডেড_টীকা বিন্যাস

নাম বিন্যাস বর্ণনা
type_idx uleb128 টীকা প্রকার। এটি অবশ্যই একটি ক্লাস (অ্যারে বা আদিম নয়) টাইপ হতে হবে।
আকার uleb128 এই টীকাটিতে নাম-মানের ম্যাপিংয়ের সংখ্যা
উপাদান টীকা_উপাদান[আকার] টীকাটির উপাদান, সরাসরি ইন-লাইনে প্রতিনিধিত্ব করে (অফসেট হিসাবে নয়)। উপাদানগুলিকে string_id সূচক দ্বারা ক্রমবর্ধমান ক্রমে সাজাতে হবে৷

টীকা_এলিমেন্ট বিন্যাস

নাম বিন্যাস বর্ণনা
name_idx uleb128 উপাদানের নাম, string_ids বিভাগে একটি সূচক হিসাবে উপস্থাপিত। স্ট্রিংটি অবশ্যই উপরে সংজ্ঞায়িত MemberName এর জন্য সিনট্যাক্সের সাথে সঙ্গতিপূর্ণ হতে হবে।
মান encoded_value উপাদান মান

স্ট্রিং সিনট্যাক্স

একটি .dex ফাইলে বিভিন্ন ধরণের আইটেম রয়েছে যা শেষ পর্যন্ত একটি স্ট্রিংকে উল্লেখ করে। নিম্নলিখিত BNF-শৈলী সংজ্ঞাগুলি এই স্ট্রিংগুলির জন্য গ্রহণযোগ্য সিনট্যাক্স নির্দেশ করে৷

সরল নাম

একটি সরলনাম হল অন্যান্য জিনিসের নামের সিনট্যাক্সের ভিত্তি। .dex বিন্যাস এখানে ন্যায্য পরিমাণ অক্ষাংশের অনুমতি দেয় (সবচেয়ে সাধারণ উৎস ভাষার চেয়ে অনেক বেশি)। সংক্ষেপে, একটি সাধারণ নাম যে কোনো নিম্ন-ASCII বর্ণানুক্রমিক অক্ষর বা অঙ্ক, কয়েকটি নির্দিষ্ট নিম্ন-ASCII চিহ্ন এবং বেশিরভাগ নন-ASCII কোড পয়েন্ট যা নিয়ন্ত্রণ, স্থান বা বিশেষ অক্ষর নয়। সংস্করণ 040 থেকে শুরু করে বিন্যাসটি অতিরিক্তভাবে স্থান অক্ষর (ইউনিকোড Zs বিভাগ) অনুমোদন করে। মনে রাখবেন যে সারোগেট কোড পয়েন্টগুলি (ব্যপ্তি U+d800U+dfff ) হিসাবে বৈধ নামের অক্ষর হিসাবে বিবেচিত হয় না, তবে ইউনিকোড সম্পূরক অক্ষরগুলি বৈধ (যা SimpleNameChar এর নিয়মের চূড়ান্ত বিকল্প দ্বারা উপস্থাপিত হয়), এবং তারা MUTF-8 এনকোডিং-এ সারোগেট কোড পয়েন্টের জোড়া হিসাবে একটি ফাইলে উপস্থাপন করা উচিত।

সরল নাম
সরলনামচর ( সিম্পলনেমচার )*
সরলনামচর
'A''Z'
| 'a''z'
| '0''9'
| ' ' DEX সংস্করণ 040 থেকে
| '$'
| '-'
| '_'
| U+00a0 DEX সংস্করণ 040 থেকে
| U+00a1U+1fff
| U+2000U+200a DEX সংস্করণ 040 থেকে
| U+2010U+2027
| U+202f DEX সংস্করণ 040 থেকে
| U+2030U+d7ff
| U+e000U+ffef
| U+10000U+10ffff

সদস্যের নাম

field_id_item এবং method_id_item দ্বারা ব্যবহৃত

একটি সদস্য নাম হল একটি শ্রেণীর সদস্যের নাম, সদস্যরা ক্ষেত্র, পদ্ধতি এবং অভ্যন্তরীণ ক্লাস।

সদস্যের নাম
সরল নাম
| '<' SimpleName '>'

ফুলক্লাস নাম

একটি FullClassName হল একটি সম্পূর্ণ যোগ্য শ্রেণির নাম, একটি ঐচ্ছিক প্যাকেজ স্পেসিফায়ার সহ একটি প্রয়োজনীয় নাম অনুসরণ করে৷

সম্পূর্ণ ক্লাসের নাম
ঐচ্ছিক প্যাকেজ প্রিফিক্স সরলনাম
ঐচ্ছিক প্যাকেজ উপসর্গ
( সরল নাম '/' )*

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 ';'

সংক্ষিপ্ত বর্ণনাকারী

proto_id_item দ্বারা ব্যবহৃত

একটি শর্টডিসক্রিপ্টর হল রিটার্ন এবং প্যারামিটারের ধরন সহ একটি পদ্ধতির প্রোটোটাইপের সংক্ষিপ্ত ফর্ম উপস্থাপনা, বিভিন্ন রেফারেন্স (শ্রেণী বা অ্যারে) প্রকারের মধ্যে কোন পার্থক্য নেই। পরিবর্তে, সমস্ত রেফারেন্স প্রকার একটি একক 'L' অক্ষর দ্বারা উপস্থাপিত হয়।

সংক্ষিপ্ত বর্ণনাকারী
ShortyReturnType ( ShortyFieldType )*
ছোট রিটার্ন টাইপ
'V'
| শর্টফিল্ড টাইপ
শর্টফিল্ড টাইপ
'Z'
| 'B'
| 'S'
| 'C'
| 'I'
| 'J'
| 'F'
| 'D'
| 'L'

TypeDescriptor শব্দার্থবিদ্যা

এটি TypeDescriptor এর প্রতিটি রূপের অর্থ।

সিনট্যাক্স অর্থ
ভি void শুধুমাত্র রিটার্ন ধরনের জন্য বৈধ
জেড boolean
byte
এস short
char
আমি int
জে long
float
ডি double
L সম্পূর্ণ/যোগ্য/নাম ; ক্লাস fully.qualified.Name
[ বর্ণনাকারী descriptor অ্যারে, অ্যারে-অফ-অ্যারের জন্য পুনরাবৃত্তিমূলকভাবে ব্যবহারযোগ্য, যদিও এটি 255টির বেশি মাত্রা থাকা অবৈধ।

আইটেম এবং সম্পর্কিত কাঠামো

এই বিভাগে .dex ফাইলে প্রদর্শিত হতে পারে এমন প্রতিটি শীর্ষ-স্তরের আইটেমের সংজ্ঞা অন্তর্ভুক্ত করে।

হেডার_আইটেম

শিরোনাম বিভাগে প্রদর্শিত হয়

প্রান্তিককরণ: 4 বাইট

নাম বিন্যাস বর্ণনা
জাদু ubyte[8] = DEX_FILE_MAGIC জাদু মান। আরো বিস্তারিত জানার জন্য " DEX_FILE_MAGIC " এর অধীনে উপরে আলোচনা দেখুন।
চেকসাম uint adler32 বাকি ফাইলের চেকসাম ( magic এবং এই ক্ষেত্র ছাড়া সবকিছু); ফাইল দুর্নীতি সনাক্ত করতে ব্যবহৃত হয়
স্বাক্ষর ubyte[20] বাকি ফাইলের SHA-1 স্বাক্ষর (হ্যাশ) ( magic , checksum , এবং এই ক্ষেত্র ছাড়া সবকিছু); অনন্যভাবে ফাইল সনাক্ত করতে ব্যবহৃত হয়
ফাইল_সাইজ uint সম্পূর্ণ ফাইলের আকার (হেডার সহ), বাইটে
হেডার_সাইজ uint = 0x70 হেডারের আকার (এই পুরো বিভাগটি), বাইটে। এটি বিন্যাসটি অবৈধ না করে কমপক্ষে সীমিত পরিমাণের পিছনে/ফরোয়ার্ড সামঞ্জস্যের জন্য অনুমতি দেয়।
endian_tag uint = ENDIAN_CONSTANT endianness ট্যাগ। আরো বিস্তারিত জানার জন্য " 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 (অবশ্যই একটি অদ্ভুত প্রান্তের ক্ষেত্রে)। অফসেট, যদি শূন্য না হয়, string_ids বিভাগের শুরুতে হওয়া উচিত।
type_ids_size uint টাইপ শনাক্তকারী তালিকায় উপাদানের সংখ্যা, সর্বাধিক 65535
type_ids_off uint ফাইলের শুরু থেকে টাইপ আইডেন্টিফায়ার লিস্টে অফসেট, অথবা 0 if type_ids_size == 0 (স্বীকৃতভাবে একটি অদ্ভুত এজ কেস)। অফসেট, যদি শূন্য না থাকে, তাহলে type_ids বিভাগের শুরুতে হওয়া উচিত।
proto_ids_size uint প্রোটোটাইপ শনাক্তকারী তালিকায় উপাদানের সংখ্যা, সর্বাধিক 65535
proto_ids_off uint ফাইলের শুরু থেকে প্রোটোটাইপ শনাক্তকারীর তালিকায় অফসেট, অথবা 0 যদি proto_ids_size == 0 (অবশ্যই একটি অদ্ভুত প্রান্তের ক্ষেত্রে)। অফসেট, যদি শূন্য না হয়, proto_ids বিভাগের শুরুতে হওয়া উচিত।
ক্ষেত্র_আইডি_সাইজ uint ক্ষেত্র শনাক্তকারী তালিকায় উপাদানের গণনা
field_ids_off uint ফাইলের শুরু থেকে ক্ষেত্র শনাক্তকারী তালিকায় অফসেট, অথবা 0 যদি field_ids_size == 0 । অফসেট, যদি শূন্য না হয়, field_ids বিভাগের শুরুতে হওয়া উচিত।
পদ্ধতি_আইডি_সাইজ uint পদ্ধতি শনাক্তকারী তালিকায় উপাদানের গণনা
পদ্ধতি_আইডি_অফ uint ফাইলের শুরু থেকে মেথড আইডেন্টিফায়ার লিস্টে অফসেট, অথবা 0 if method_ids_size == 0 । অফসেট, যদি শূন্য না থাকে তবে method_ids বিভাগের শুরুতে হওয়া উচিত।
class_defs_size uint বর্গ সংজ্ঞা তালিকায় উপাদানের গণনা
class_defs_off uint ফাইলের শুরু থেকে ক্লাস ডেফিনিশন লিস্টে অফসেট, অথবা 0 if class_defs_size == 0 (অবশ্যই একটি অদ্ভুত এজ কেস)। অফসেট, যদি শূন্য না হয়, class_defs বিভাগের শুরুতে হওয়া উচিত।
ডেটা_সাইজ uint বাইটে data বিভাগের আকার। সাইজের (uint) এর একটি জোড় মাল্টিপল হতে হবে।
ডেটা_বন্ধ uint ফাইলের শুরু থেকে data বিভাগের শুরু পর্যন্ত অফসেট।

মানচিত্রের_তালিকা

ডেটা বিভাগে উপস্থিত হয়

হেডার_আইটেম থেকে উল্লেখ করা হয়েছে

প্রান্তিককরণ: 4 বাইট

এটি একটি ফাইলের সম্পূর্ণ বিষয়বস্তুর একটি তালিকা, ক্রমানুসারে। এটি header_item এর ক্ষেত্রে কিছু অপ্রয়োজনীয়তা ধারণ করে কিন্তু এটি একটি সম্পূর্ণ ফাইলের উপর পুনরাবৃত্তি করার জন্য ব্যবহার করার জন্য একটি সহজ ফর্মের উদ্দেশ্যে। একটি প্রদত্ত টাইপ একটি মানচিত্রে সর্বাধিক একবার উপস্থিত হওয়া আবশ্যক, তবে বাকি বিন্যাস দ্বারা উহ্য বিধিনিষেধগুলি ব্যতীত কোন ক্রম প্রকারগুলি উপস্থিত হতে পারে তার উপর কোন বিধিনিষেধ নেই (যেমন, একটি header বিভাগটি অবশ্যই প্রথমে প্রদর্শিত হবে, তারপরে একটি string_ids বিভাগ, ইত্যাদি)। উপরন্তু, মানচিত্র এন্ট্রি প্রাথমিক অফসেট দ্বারা অর্ডার করা আবশ্যক এবং ওভারল্যাপ করা উচিত নয়।

নাম বিন্যাস বর্ণনা
আকার uint তালিকার আকার, এন্ট্রিতে
তালিকা মানচিত্র_আইটেম [আকার] তালিকার উপাদান

map_item বিন্যাস

নাম বিন্যাস বর্ণনা
টাইপ ছোট আইটেম প্রকার; নীচের টেবিল দেখুন
অব্যবহৃত ছোট (অব্যবহৃত)
আকার uint নির্দেশিত অফসেটে পাওয়া আইটেমের সংখ্যা গণনা
অফসেট uint ফাইলের শুরু থেকে প্রশ্নে থাকা আইটেমগুলিতে অফসেট

কোড টাইপ করুন

আইটেম প্রকার ধ্রুবক মান বাইটে আইটেমের আকার
হেডার_আইটেম TYPE_HEADER_ITEM 0x0000 0x70
স্ট্রিং_আইডি_আইটেম TYPE_STRING_ID_ITEM 0x0001 0x04
টাইপ_আইডি_আইটেম TYPE_TYPE_ID_ITEM 0x0002 0x04
প্রোটো_আইডি_আইটেম TYPE_PROTO_ID_ITEM 0x0003 0x0c
ক্ষেত্র_আইডি_আইটেম TYPE_FIELD_ID_ITEM 0x0004 0x08
পদ্ধতি_আইডি_আইটেম TYPE_METHOD_ID_ITEM 0x0005 0x08
class_def_item TYPE_CLASS_DEF_ITEM 0x0006 0x20
কল_সাইট_আইডি_আইটেম TYPE_CALL_SITE_ID_ITEM 0x0007 0x04
পদ্ধতি_হ্যান্ডেল_আইটেম TYPE_METHOD_HANDLE_ITEM 0x0008 0x08
মানচিত্রের_তালিকা TYPE_MAP_LIST 0x1000 4 + (আইটেম. আকার * 12)
type_list TYPE_TYPE_LIST 0x1001 4 + (আইটেম. আকার * 2)
annotation_set_ref_list TYPE_ANNOTATION_SET_REF_LIST 0x1002 4 + (আইটেম. আকার * 4)
টীকা_সেট_আইটেম TYPE_ANNOTATION_SET_ITEM 0x1003 4 + (আইটেম. আকার * 4)
ক্লাস_ডেটা_আইটেম TYPE_CLASS_DATA_ITEM 0x2000 অন্তর্নিহিত; পার্স করতে হবে
কোড_আইটেম TYPE_CODE_ITEM 0x2001 অন্তর্নিহিত; পার্স করতে হবে
স্ট্রিং_ডেটা_আইটেম TYPE_STRING_DATA_ITEM 0x2002 অন্তর্নিহিত; পার্স করতে হবে
ডিবাগ_তথ্য_আইটেম TYPE_DEBUG_INFO_ITEM 0x2003 অন্তর্নিহিত; পার্স করতে হবে
টীকা_আইটেম TYPE_ANNOTATION_ITEM 0x2004 অন্তর্নিহিত; পার্স করতে হবে
encoded_array_item TYPE_ENCODED_ARRAY_ITEM 0x2005 অন্তর্নিহিত; পার্স করতে হবে
annotations_directory_item TYPE_ANNOTATIONS_DIRECTORY_ITEM 0x2006 অন্তর্নিহিত; পার্স করতে হবে
hiddenapi_class_data_item TYPE_HIDDENAPI_CLASS_DATA_ITEM 0xF000 অন্তর্নিহিত; পার্স করতে হবে

স্ট্রিং_আইডি_আইটেম

string_ids বিভাগে উপস্থিত হয়

প্রান্তিককরণ: 4 বাইট

নাম বিন্যাস বর্ণনা
string_data_off uint এই আইটেমের জন্য ফাইলের শুরু থেকে স্ট্রিং ডেটা পর্যন্ত অফসেট। অফসেটটি data বিভাগে একটি অবস্থানে হওয়া উচিত এবং ডেটা নীচের " string_data_item " দ্বারা নির্দিষ্ট করা বিন্যাসে হওয়া উচিত৷ অফসেটের জন্য কোন প্রান্তিককরণের প্রয়োজন নেই।

স্ট্রিং_ডেটা_আইটেম

ডেটা বিভাগে উপস্থিত হয়

প্রান্তিককরণ: কোনোটিই নয় (বাইট-সারিবদ্ধ)

নাম বিন্যাস বর্ণনা
utf16_size uleb128 এই স্ট্রিংটির আকার, UTF-16 কোড ইউনিটে (যা অনেক সিস্টেমে "স্ট্রিং দৈর্ঘ্য")। অর্থাৎ, এটি স্ট্রিংয়ের ডিকোডেড দৈর্ঘ্য। (এনকোড করা দৈর্ঘ্য 0 বাইটের অবস্থান দ্বারা নিহিত।)
তথ্য ubyte[] MUTF-8 কোড ইউনিটের একটি সিরিজ (ওরফে অক্টেটস, ওরফে বাইট) এর পরে 0 মানের একটি বাইট। তথ্য বিন্যাস সম্পর্কে বিস্তারিত এবং আলোচনার জন্য উপরে "MUTF-8 (সংশোধিত UTF-8) এনকোডিং" দেখুন।

দ্রষ্টব্য: এটি একটি স্ট্রিং থাকা গ্রহণযোগ্য যাতে (এর এনকোড করা ফর্ম) UTF-16 সারোগেট কোড ইউনিট (অর্থাৎ, U+d800U+dfff ) থাকে বিচ্ছিন্নভাবে বা স্বাভাবিক এনকোডিং-এর সাপেক্ষে আউট-অফ-অর্ডার। ইউনিকোডের UTF-16-এ। উপযুক্ত হলে এই ধরনের অবৈধ এনকোডিং প্রত্যাখ্যান করা স্ট্রিংগুলির উচ্চ-স্তরের ব্যবহার পর্যন্ত।

টাইপ_আইডি_আইটেম

type_ids বিভাগে উপস্থিত হয়

প্রান্তিককরণ: 4 বাইট

নাম বিন্যাস বর্ণনা
descriptor_idx uint এই ধরনের বর্ণনাকারী স্ট্রিংয়ের জন্য string_ids তালিকায় সূচী করুন। স্ট্রিংটি উপরে সংজ্ঞায়িত TypeDescriptor- এর জন্য সিনট্যাক্সের সাথে সঙ্গতিপূর্ণ হতে হবে।

প্রোটো_আইডি_আইটেম

proto_ids বিভাগে উপস্থিত হয়

প্রান্তিককরণ: 4 বাইট

নাম বিন্যাস বর্ণনা
shorty_idx uint এই প্রোটোটাইপের সংক্ষিপ্ত-ফর্ম বর্ণনাকারী স্ট্রিংয়ের জন্য string_ids তালিকায় সূচী করুন। স্ট্রিংটি অবশ্যই ShortyDescriptor- এর জন্য সিনট্যাক্সের সাথে সঙ্গতিপূর্ণ হতে হবে, উপরে সংজ্ঞায়িত করা হয়েছে, এবং এই আইটেমের রিটার্ন টাইপ এবং পরামিতির সাথে সঙ্গতিপূর্ণ হতে হবে।
return_type_idx uint এই প্রোটোটাইপের রিটার্ন টাইপের জন্য type_ids তালিকায় সূচক করুন
প্যারামিটার_বন্ধ uint এই প্রোটোটাইপের জন্য ফাইলের শুরু থেকে পরামিতি প্রকারের তালিকা পর্যন্ত অফসেট, অথবা 0 যদি এই প্রোটোটাইপের কোনো পরামিতি না থাকে। এই অফসেট, যদি শূন্য না থাকে তবে data বিভাগে থাকা উচিত এবং সেখানে থাকা ডেটা নীচে "type_list" দ্বারা নির্দিষ্ট করা বিন্যাসে থাকা উচিত। অতিরিক্তভাবে, তালিকায় void প্রকারের কোন উল্লেখ থাকা উচিত নয়।

ক্ষেত্র_আইডি_আইটেম

field_ids বিভাগে উপস্থিত হয়

প্রান্তিককরণ: 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 তালিকায় সূচী। এটি অবশ্যই একটি শ্রেণী প্রকার হতে হবে, এবং একটি অ্যারে বা আদিম প্রকার নয়৷
অ্যাক্সেস_পতাকা uint ক্লাসের জন্য পতাকা অ্যাক্সেস করুন ( public , final , ইত্যাদি)। বিস্তারিত জানার জন্য " access_flags সংজ্ঞা" দেখুন।
সুপারক্লাস_আইডিএক্স 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 ক্ষেত্রগুলির সংখ্যার চেয়ে বড় হওয়া উচিত নয় এবং উপাদানগুলি সংশ্লিষ্ট field_list এ ঘোষিত একই ক্রমে static ক্ষেত্রগুলির সাথে সামঞ্জস্যপূর্ণ। প্রতিটি অ্যারের উপাদানের প্রকার অবশ্যই তার সংশ্লিষ্ট ক্ষেত্রের ঘোষিত প্রকারের সাথে মেলে। যদি অ্যারেতে static ক্ষেত্রগুলির তুলনায় কম উপাদান থাকে, তবে অবশিষ্ট ক্ষেত্রগুলি টাইপ-উপযুক্ত 0 বা null দিয়ে আরম্ভ করা হয়।

কল_সাইট_আইডি_আইটেম

কল_সাইট_আইডি বিভাগে উপস্থিত হয়

প্রান্তিককরণ: 4 বাইট

নাম বিন্যাস বর্ণনা
কল_সাইট_অফ uint অফসেট ফাইলের শুরু থেকে কল সাইট সংজ্ঞা. অফসেটটি ডেটা বিভাগে থাকা উচিত এবং সেখানে থাকা ডেটা নীচে "কল_সাইট_আইটেম" দ্বারা নির্দিষ্ট করা বিন্যাসে থাকা উচিত।

কল_সাইট_আইটেম

ডেটা বিভাগে উপস্থিত হয়

প্রান্তিককরণ: কোনোটিই নয় (বাইট সারিবদ্ধ)

call_site_item হল একটি encoded_array_item যার উপাদানগুলি একটি বুটস্ট্র্যাপ লিঙ্কার পদ্ধতিতে দেওয়া আর্গুমেন্টের সাথে মিলে যায়। প্রথম তিনটি যুক্তি হল:

  1. বুটস্ট্র্যাপ লিঙ্কার পদ্ধতি (VALUE_METHOD_HANDLE) প্রতিনিধিত্বকারী একটি পদ্ধতি হ্যান্ডেল।
  2. একটি পদ্ধতির নাম যা বুটস্ট্র্যাপ লিঙ্কারের সমাধান করা উচিত (VALUE_STRING)।
  3. যে পদ্ধতির নামটি সমাধান করা হবে তার সাথে সঙ্গতিপূর্ণ একটি পদ্ধতির প্রকার (VALUE_METHOD_TYPE)৷

যেকোনো অতিরিক্ত আর্গুমেন্ট হল বুটস্ট্র্যাপ লিঙ্কার পদ্ধতিতে পাস করা ধ্রুবক মান। এই আর্গুমেন্টগুলি ক্রমানুসারে এবং কোন প্রকার রূপান্তর ছাড়াই পাস করা হয়।

বুটস্ট্র্যাপ লিঙ্কার পদ্ধতির প্রতিনিধিত্বকারী পদ্ধতি হ্যান্ডেলটিতে অবশ্যই রিটার্ন টাইপ java.lang.invoke.CallSite থাকতে হবে। প্রথম তিনটি পরামিতি প্রকার হল:

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

যেকোনো অতিরিক্ত আর্গুমেন্টের প্যারামিটারের ধরন তাদের স্থির মান থেকে নির্ধারিত হয়।

পদ্ধতি_হ্যান্ডেল_আইটেম

পদ্ধতি_হ্যান্ডেল বিভাগে উপস্থিত হয়

প্রান্তিককরণ: 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 পদ্ধতি হ্যান্ডেল একটি উদাহরণ পদ্ধতি ইনভোকার
পদ্ধতি_হ্যান্ডল_ টাইপ_ইনভোক_কনস্ট্রাক্টর 0x06 পদ্ধতি হ্যান্ডেল একটি কনস্ট্রাক্টর পদ্ধতি ইনভোকার
পদ্ধতি_হ্যান্ডলে_ টাইপ_ইনভোক_ডাইরেক্ট 0x07 পদ্ধতি হ্যান্ডেল একটি সরাসরি পদ্ধতি ইনভোকার
পদ্ধতি_হ্যান্ডলে_ টাইপ_ইনভোক_ইন্টারফেস 0x08 পদ্ধতি হ্যান্ডেল একটি ইন্টারফেস পদ্ধতি ইনভোকার

ক্লাস_ডাটা_আইটিএম

CLASS_DEF_ITEM থেকে রেফারেন্স

ডেটা বিভাগে প্রদর্শিত হবে

প্রান্তিককরণ: কিছুই নয় (বাইট-সারিবদ্ধ)

নাম বিন্যাস বর্ণনা
স্ট্যাটিক_ফিল্ডস_সাইজ uleb128 এই আইটেমটিতে সংজ্ঞায়িত স্ট্যাটিক ক্ষেত্রগুলির সংখ্যা
উদাহরণ_ফিল্ডস_সাইজ uleb128 এই আইটেমটিতে সংজ্ঞায়িত উদাহরণ ক্ষেত্রগুলির সংখ্যা
Direct_methods_size uleb128 এই আইটেমটিতে সংজ্ঞায়িত প্রত্যক্ষ পদ্ধতির সংখ্যা
ভার্চুয়াল_মেটডস_সাইজ uleb128 এই আইটেমটিতে সংজ্ঞায়িত ভার্চুয়াল পদ্ধতির সংখ্যা
স্ট্যাটিক_ফিল্ডস এনকোডেড_ফিল্ড [স্ট্যাটিক_ফিল্ডস_সাইজ] সংজ্ঞায়িত স্ট্যাটিক ক্ষেত্রগুলি এনকোডেড উপাদানগুলির ক্রম হিসাবে প্রতিনিধিত্ব করে। ক্ষেত্রগুলি অবশ্যই ক্রমবর্ধমান ক্রমে field_idx দ্বারা বাছাই করা উচিত।
উদাহরণ_ফিল্ডস এনকোডেড_ফিল্ড [উদাহরণ_ফিল্ডস_সাইজ] সংজ্ঞায়িত উদাহরণ ক্ষেত্রগুলি, এনকোডেড উপাদানগুলির ক্রম হিসাবে প্রতিনিধিত্ব করে। ক্ষেত্রগুলি অবশ্যই ক্রমবর্ধমান ক্রমে field_idx দ্বারা বাছাই করা উচিত।
ডাইরেক্ট_মেথডস এনকোডেড_মেটড [ডাইরেক্ট_মেথডস_সাইজ] সংজ্ঞায়িত প্রত্যক্ষ (কোনও static , private , বা কনস্ট্রাক্টর) পদ্ধতিগুলি এনকোডেড উপাদানগুলির ক্রম হিসাবে প্রতিনিধিত্ব করে। পদ্ধতিগুলি অবশ্যই ক্রমবর্ধমান ক্রমে method_idx দ্বারা বাছাই করা উচিত।
ভার্চুয়াল_মেথডস এনকোডেড_মথোড [ভার্চুয়াল_মেটডস_সাইজ] সংজ্ঞায়িত ভার্চুয়াল ( static , private , বা নির্মাণকারীগুলির কোনওটিই নয়) পদ্ধতিগুলি এনকোডেড উপাদানগুলির ক্রম হিসাবে প্রতিনিধিত্ব করে। এই তালিকায় উত্তরাধিকারসূত্রে প্রাপ্ত পদ্ধতিগুলি অন্তর্ভুক্ত করা উচিত নয় যদি না এই আইটেমটি প্রতিনিধিত্ব করে এমন শ্রেণীর দ্বারা ওভাররাইড করা হয়। পদ্ধতিগুলি অবশ্যই ক্রমবর্ধমান ক্রমে method_idx দ্বারা বাছাই করা উচিত। ভার্চুয়াল পদ্ধতির method_idx অবশ্যই কোনও সরাসরি পদ্ধতির মতো হওয়া উচিত নয়

দ্রষ্টব্য: সমস্ত উপাদানগুলির field_id এবং method_id দৃষ্টান্তগুলি অবশ্যই একই সংজ্ঞায়িত শ্রেণীর উল্লেখ করতে হবে।

এনকোডেড_ফিল্ড ফর্ম্যাট

নাম বিন্যাস বর্ণনা
ফিল্ড_আইডিএক্স_ডিফ uleb128 এই ক্ষেত্রের পরিচয়ের জন্য field_ids তালিকায় সূচক (নাম এবং বর্ণনাকারী অন্তর্ভুক্ত), তালিকার পূর্ববর্তী উপাদানগুলির সূচক থেকে পার্থক্য হিসাবে উপস্থাপিত। একটি তালিকার প্রথম উপাদানটির সূচক সরাসরি প্রতিনিধিত্ব করা হয়।
অ্যাক্সেস_পতাকা uleb128 ক্ষেত্রের জন্য পতাকা অ্যাক্সেস করুন ( public , final ইত্যাদি)। বিশদের জন্য " access_flags সংজ্ঞা" দেখুন।

এনকোডেড_মিথড ফর্ম্যাট

নাম বিন্যাস বর্ণনা
পদ্ধতি_আইডিএক্স_ডিফ uleb128 এই পদ্ধতির পরিচয়ের জন্য method_ids তালিকায় সূচক (নাম এবং বর্ণনাকারী অন্তর্ভুক্ত), তালিকার পূর্ববর্তী উপাদানগুলির সূচক থেকে পার্থক্য হিসাবে উপস্থাপিত। একটি তালিকার প্রথম উপাদানটির সূচক সরাসরি প্রতিনিধিত্ব করা হয়।
অ্যাক্সেস_পতাকা uleb128 পদ্ধতির জন্য পতাকা অ্যাক্সেস করুন ( public , final ইত্যাদি)। বিশদের জন্য " access_flags সংজ্ঞা" দেখুন।
কোড_অফ uleb128 ফাইলের শুরু থেকে এই পদ্ধতির জন্য কোড কাঠামোতে অফসেট, বা 0 যদি এই পদ্ধতিটি abstract বা native হয়। অফসেটটি data বিভাগের কোনও স্থানে হওয়া উচিত। ডেটার ফর্ম্যাটটি নীচে " code_item " দ্বারা নির্দিষ্ট করা হয়েছে।

টাইপ_লিস্ট

CLAST_DEF_ITEM এবং PROTO_ID_ITEM থেকে রেফারেন্স

ডেটা বিভাগে প্রদর্শিত হবে

প্রান্তিককরণ: 4 বাইট

নাম বিন্যাস বর্ণনা
আকার uint তালিকার আকার, এন্ট্রিগুলিতে
তালিকা টাইপ_ আইটেম [আকার] তালিকার উপাদান

টাইপ_ আইটেম ফর্ম্যাট

নাম বিন্যাস বর্ণনা
টাইপ_আইডিএক্স ছোট type_ids তালিকায় সূচক

কোড_ আইটেম

এনকোডেড_মথোড থেকে রেফারেন্স

ডেটা বিভাগে প্রদর্শিত হবে

প্রান্তিককরণ: 4 বাইট

নাম বিন্যাস বর্ণনা
রেজিস্টার_সাইজ ছোট এই কোড দ্বারা ব্যবহৃত রেজিস্টার সংখ্যা
ins_size ছোট এই কোডটির জন্য যে পদ্ধতিতে আগত যুক্তিগুলির শব্দের সংখ্যা
আউট_সাইজ ছোট পদ্ধতি অনুরোধের জন্য এই কোড দ্বারা প্রয়োজনীয় বহির্গামী আর্গুমেন্ট স্পেসের শব্দের সংখ্যা
চেষ্টা_সাইজ ছোট এই উদাহরণের জন্য try_item এর সংখ্যা। যদি অ-শূন্য হয়, তবে এগুলি এই উদাহরণে insns ঠিক পরে tries অ্যারে হিসাবে উপস্থিত হয়।
debug_info_off uint এই কোডটির জন্য ফাইলের শুরু থেকে ডিবাগ তথ্য (লাইন নম্বর + স্থানীয় ভেরিয়েবল তথ্য) ক্রম পর্যন্ত অফসেট, বা 0 যদি কেবল কোনও তথ্য না থাকে। অফসেট, যদি শূন্য-না হয় তবে data বিভাগে কোনও স্থানে হওয়া উচিত। ডেটার ফর্ম্যাটটি নীচে " debug_info_item " দ্বারা নির্দিষ্ট করা হয়েছে।
inss_size uint নির্দেশাবলী তালিকার আকার, 16-বিট কোড ইউনিটগুলিতে
inss ushort [inss_size] বাইটকোডের আসল অ্যারে। একটি insns অ্যারেতে কোডের ফর্ম্যাটটি সহচর ডকুমেন্ট ডালভিক বাইটকোড দ্বারা নির্দিষ্ট করা হয়েছে। মনে রাখবেন যে এটি ushort একটি অ্যারে হিসাবে সংজ্ঞায়িত করা হয়েছে, এমন কিছু অভ্যন্তরীণ কাঠামো রয়েছে যা চার-বাইট প্রান্তিককরণ পছন্দ করে। এছাড়াও, যদি এটি কোনও এন্ডিয়ান-অদলবদল ফাইলের মধ্যে থাকে, তবে অদলবদলটি কেবলমাত্র পৃথক ushort দৃষ্টান্তগুলিতে করা হয় এবং বৃহত্তর অভ্যন্তরীণ কাঠামোগুলিতে নয়।
প্যাডিং ushort (al চ্ছিক) = 0 চার-বাইট সারিবদ্ধ করার tries করার জন্য দুটি বাইট প্যাডিং। এই উপাদানটি কেবল তখনই উপস্থিত থাকে যখন tries_size অ-শূন্য এবং insns_size বিজোড় হয়।
চেষ্টা করে ট্রাই_আইটিএম [চেষ্টা_সাইজ] (al চ্ছিক) কোড ব্যতিক্রমগুলি কোথায় ধরা পড়ে এবং কীভাবে সেগুলি পরিচালনা করতে হয় তা নির্দেশ করে অ্যারে। অ্যারের উপাদানগুলি অবশ্যই পরিসীমা এবং কম থেকে উচ্চ ঠিকানা পর্যন্ত অ-ওভারল্যাপিং হতে হবে। এই উপাদানটি কেবল তখনই উপস্থিত থাকে যখন tries_size অ-শূন্য হয়।
হ্যান্ডলার এনকোডড_ক্যাচ_হ্যান্ডলার_লিস্ট (al চ্ছিক) বাইটগুলি ক্যাচ প্রকার এবং সম্পর্কিত হ্যান্ডলার ঠিকানাগুলির তালিকার তালিকার প্রতিনিধিত্ব করে। প্রতিটি try_item এই কাঠামোর মধ্যে একটি বাইট-ভিত্তিক অফসেট থাকে। এই উপাদানটি কেবল তখনই উপস্থিত থাকে যখন tries_size অ-শূন্য হয়।

চেষ্টা_ আইটেম ফর্ম্যাট

নাম বিন্যাস বর্ণনা
start_addr uint এই এন্ট্রি দ্বারা আচ্ছাদিত কোডের ব্লকের ঠিকানা শুরু করুন। ঠিকানাটি প্রথম কাভার্ড নির্দেশের শুরুতে 16-বিট কোড ইউনিটগুলির একটি গণনা।
insn_count ছোট এই এন্ট্রি দ্বারা আচ্ছাদিত 16-বিট কোড ইউনিটের সংখ্যা। শেষ কোড ইউনিটটি আচ্ছাদিত (অন্তর্ভুক্ত) হ'ল start_addr + insn_count - 1
হ্যান্ডলার_ফ ছোট এই প্রবেশের জন্য সম্পর্কিত encoded_catch_hander_list শুরু থেকে বাইটে অফসেট করুন encoded_catch_handler এটি অবশ্যই একটি encoded_catch_handler শুরুতে অফসেট হতে হবে।

এনকোডড_ক্যাচ_হ্যান্ডলার_লিস্ট ফর্ম্যাট

নাম বিন্যাস বর্ণনা
আকার uleb128 এই তালিকার আকার, এন্ট্রিগুলিতে
তালিকা এনকোডেড_ক্যাচ_হ্যান্ডলার [হ্যান্ডলার_সাইজ] হ্যান্ডলার তালিকার প্রকৃত তালিকা, সরাসরি প্রতিনিধিত্ব করে (অফসেট হিসাবে নয়) এবং ধারাবাহিকভাবে সংমিশ্রিত

এনকোডেড_ক্যাচ_হ্যান্ডলার ফর্ম্যাট

নাম বিন্যাস বর্ণনা
আকার স্লেব 128 এই তালিকায় ক্যাচ ধরণের সংখ্যা। যদি অ-পজিটিভ হয়, তবে এটি ক্যাচ ধরণের সংখ্যার নেতিবাচক এবং ক্যাচগুলি একটি ক্যাচ-অল হ্যান্ডলার অনুসরণ করে। উদাহরণস্বরূপ: 0 এর size অর্থ হ'ল এখানে একটি ক্যাচ-সমস্ত রয়েছে তবে কোনও স্পষ্টভাবে টাইপ করা ক্যাচ নেই। 2 এর size অর্থ দুটি স্পষ্টভাবে টাইপ করা ক্যাচ এবং কোনও ক্যাচ-অল নেই। এবং -1 এর size অর্থ হ'ল ক্যাচ -অল সহ একটি টাইপ ক্যাচ রয়েছে।
হ্যান্ডলার এনকোডেড_ টাইপ_এডিডিআর_পায়ার [অ্যাবস (আকার)] টাইপগুলি পরীক্ষা করা উচিত এমন ক্রমে প্রতিটি ধরা প্রকারের জন্য একটি abs(size) এনকোডেড আইটেমগুলির স্ট্রিম।
ক্যাচ_আল_এডিডিআর uleb128 (al চ্ছিক) ক্যাচ-অল হ্যান্ডলারের বাইটকোড ঠিকানা। এই উপাদানটি কেবল তখনই উপস্থিত থাকে যদি size অ-পজিটিভ হয়।

এনকোডেড_ টাইপ_এডিডিআর_পায়ার ফর্ম্যাট

নাম বিন্যাস বর্ণনা
টাইপ_আইডিএক্স uleb128 ক্যাচ ব্যতিক্রমের ধরণের জন্য type_ids তালিকায় সূচক
addr uleb128 সম্পর্কিত ব্যতিক্রম হ্যান্ডলারের বাইটকোড ঠিকানা

debug_info_item

কোড_আইটিএম থেকে রেফারেন্স

ডেটা বিভাগে প্রদর্শিত হবে

প্রান্তিককরণ: কিছুই নয় (বাইট-সারিবদ্ধ)

প্রতিটি debug_info_item একটি বামন 3-অনুপ্রাণিত বাইট-কোডেড স্টেট মেশিনকে সংজ্ঞায়িত করে যা ব্যাখ্যা করা হলে পজিশনের টেবিলটি নির্গত করে এবং (সম্ভাব্যভাবে) একটি code_item জন্য স্থানীয় পরিবর্তনশীল তথ্য। ক্রমটি একটি পরিবর্তনশীল দৈর্ঘ্যের শিরোনাম দিয়ে শুরু হয় (যার দৈর্ঘ্য পদ্ধতির পরামিতিগুলির সংখ্যার উপর নির্ভর করে), তারপরে স্টেট মেশিন বাইটকোডগুলি অনুসরণ করে এবং একটি DBG_END_SEQUENCE বাইট দিয়ে শেষ হয়।

রাজ্য মেশিনে পাঁচটি রেজিস্টার রয়েছে। address রেজিস্টারটি 16-বিট কোড ইউনিটে সম্পর্কিত insns_item এ অফসেটটির প্রতিনিধিত্ব করে। address রেজিস্টারটি প্রতিটি debug_info সিকোয়েন্সের শুরুতে 0 এ শুরু হয় এবং কেবল একঘেয়েভাবে বৃদ্ধি করতে হবে। line রেজিস্টারটি প্রতিনিধিত্ব করে যে কোন উত্স লাইন নম্বরটি রাষ্ট্রীয় মেশিন দ্বারা নির্গত পরবর্তী অবস্থানের টেবিল এন্ট্রির সাথে যুক্ত হওয়া উচিত। এটি সিকোয়েন্স শিরোনামে শুরু করা হয়েছে, এবং ইতিবাচক বা নেতিবাচক দিকগুলিতে পরিবর্তিত হতে পারে তবে কখনই 1 এর চেয়ে কম হতে হবে না। source_file রেজিস্টারটি উত্স ফাইলটি উপস্থাপন করে যা লাইন নম্বর এন্ট্রিগুলি উল্লেখ করে। এটি class_def_itemsource_file_idx মানকে সূচনা করা হয়েছে। অন্য দুটি ভেরিয়েবল, prologue_end এবং epilogue_begin হ'ল বুলিয়ান পতাকা ( false থেকে শুরু করে) যা নির্দেশ করে যে পরবর্তী অবস্থানটি নির্গত হওয়া কোনও পদ্ধতি প্রোলোগ বা এপিলোগ হিসাবে বিবেচনা করা উচিত কিনা। স্টেট মেশিনটি অবশ্যই DBG_RESTART_LOCAL কোডের জন্য প্রতিটি রেজিস্টারে সর্বশেষ স্থানীয় ভেরিয়েবলের লাইভের নাম এবং প্রকারটি ট্র্যাক করতে হবে।

শিরোনামটি নিম্নরূপ:

নাম বিন্যাস বর্ণনা
লাইন_স্টার্ট uleb128 রাজ্য মেশিনের line রেজিস্টারের জন্য প্রাথমিক মান। প্রকৃত অবস্থান প্রবেশের প্রতিনিধিত্ব করে না।
প্যারামিটার_সাইজ uleb128 এনকোডযুক্ত প্যারামিটারের নামগুলির সংখ্যা। একটি উদাহরণ পদ্ধতি বাদ দিয়ে একটি পদ্ধতি প্যারামিটার থাকতে হবে, যদি this থাকে।
প্যারামিটার_নাম uleb128p1 [প্যারামিটার_সাইজ] পদ্ধতি প্যারামিটারের নামের স্ট্রিং সূচক। NO_INDEX এর একটি এনকোডেড মান নির্দেশ করে যে সম্পর্কিত প্যারামিটারের জন্য কোনও নাম পাওয়া যায় না। প্রকারের বর্ণনাকারী এবং স্বাক্ষরটি পদ্ধতি বর্ণনাকারী এবং স্বাক্ষর থেকে বোঝানো হয়।

বাইট কোড মানগুলি নিম্নরূপ:

নাম মান বিন্যাস যুক্তি বর্ণনা
Dbg_end_secence 0x00 (কোনটিই নয়) একটি code_item এর জন্য একটি ডিবাগ তথ্য ক্রম সমাপ্ত করে
Dbg_advance_pc 0x01 uleb128 ADDR_DIFF addr_diff : ঠিকানা রেজিস্টারে যোগ করার পরিমাণ পজিশন এন্ট্রি নির্গমন না করে ঠিকানা রেজিস্টারকে অগ্রসর করে
Dbg_advance_line 0x02 স্লেব 128 লাইন_ডিফ line_diff : লাইন রেজিস্টার পরিবর্তন করার পরিমাণ পজিশন এন্ট্রি নির্গমন না করে লাইন রেজিস্টারকে অগ্রসর করে
Dbg_start_local 0x03 uleb128 রেজিস্টার_নুম
uleb128p1 নাম_আইডিএক্স
uleb128p1 টাইপ_আইডিএক্স
register_num : রেজিস্টার যাতে স্থানীয় থাকবে
name_idx : নামের স্ট্রিং সূচক
type_idx : প্রকারের সূচক টাইপ করুন
বর্তমান ঠিকানায় একটি স্থানীয় পরিবর্তনশীল প্রবর্তন করে। name_idx বা type_idx হয় NO_INDEX হতে পারে যে এই মানটি অজানা।
Dbg_start_local_extended 0x04 uleb128 রেজিস্টার_নুম
uleb128p1 নাম_আইডিএক্স
uleb128p1 টাইপ_আইডিএক্স
uleb128p1 sig_idx
register_num : রেজিস্টার যাতে স্থানীয় থাকবে
name_idx : নামের স্ট্রিং সূচক
type_idx : প্রকারের সূচক টাইপ করুন
sig_idx : টাইপ স্বাক্ষরের স্ট্রিং সূচক
বর্তমান ঠিকানায় একটি ধরণের স্বাক্ষর সহ স্থানীয় পরিচয় করিয়ে দেয়। name_idx , type_idx , বা sig_idx এর যে কোনও মানটি অজানা তা নির্দেশ করতে NO_INDEX হতে পারে। (যদি sig_idx -1 হয় তবে একই ডেটা ওপকোড DBG_START_LOCAL ব্যবহার করে আরও দক্ষতার সাথে প্রতিনিধিত্ব করা যেতে পারে))

দ্রষ্টব্য: স্বাক্ষরগুলি পরিচালনা করার বিষয়ে সতর্কতার জন্য নীচে " dalvik.annotation.Signature " এর অধীনে আলোচনাটি দেখুন।

Dbg_end_local 0x05 uleb128 রেজিস্টার_নুম register_num : স্থানীয় রয়েছে এমন নিবন্ধন করুন বর্তমান ঠিকানায় সুযোগের বাইরে হিসাবে বর্তমানে একটি লাইভ স্থানীয় ভেরিয়েবল চিহ্নিত করে
Dbg_restart_local 0x06 uleb128 রেজিস্টার_নুম register_num : পুনরায় চালু করতে নিবন্ধন করুন বর্তমান ঠিকানায় একটি স্থানীয় ভেরিয়েবল পুনরায় চালু করে। নাম এবং প্রকারটি নির্দিষ্ট রেজিস্টারে লাইভ ছিল সর্বশেষ স্থানীয় হিসাবে।
Dbg_set_prologue_end 0x07 (কোনটিই নয়) prologue_end স্টেট মেশিন রেজিস্টার সেট করে, ইঙ্গিত করে যে পরবর্তী অবস্থানের এন্ট্রি যুক্ত করা হয়েছে তা একটি পদ্ধতি প্রোলোগের শেষ হিসাবে বিবেচনা করা উচিত (একটি পদ্ধতি ব্রেকপয়েন্টের জন্য উপযুক্ত জায়গা)। prologue_end রেজিস্টারটি কোনও বিশেষ ( >= 0x0a ) ওপকোড দ্বারা সাফ করা হয়।
ডিবিজি_সেট_পিলোগ_বেগিন 0x08 (কোনটিই নয়) epilogue_begin স্টেট মেশিন রেজিস্টার সেট করে, এটি ইঙ্গিত করে যে পরবর্তী অবস্থানের এন্ট্রি যুক্ত করা হয়েছে তা একটি পদ্ধতি এপিলোগের সূচনা হিসাবে বিবেচনা করা উচিত (পদ্ধতি থেকে বেরিয়ে যাওয়ার আগে মৃত্যুদন্ড কার্যকর করার জন্য একটি উপযুক্ত জায়গা)। epilogue_begin রেজিস্টারটি কোনও বিশেষ ( >= 0x0a ) ওপকোড দ্বারা সাফ করা হয়েছে।
Dbg_set_file 0x09 uleb128p1 নাম_আইডিএক্স name_idx : উত্স ফাইলের নামের স্ট্রিং সূচক; NO_INDEX অজানা যদি ইঙ্গিত করে যে সমস্ত পরবর্তী লাইন নম্বর এন্ট্রিগুলি code_item -এ উল্লিখিত ডিফল্ট নামের পরিবর্তে এই উত্স ফাইলের নামটির রেফারেন্স দেয়
বিশেষ opcodes 0x0a… 0xff (কোনটিই নয়) line এবং address নিবন্ধন করে, একটি অবস্থানের প্রবেশ নির্গত করে এবং prologue_end এবং epilogue_begin সাফ করে। বর্ণনার জন্য নীচে দেখুন।

বিশেষ opcodes

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)

টীকাগুলি_ডাইরেক্টরি_আইটিএম

CLASS_DEF_ITEM থেকে রেফারেন্স

ডেটা বিভাগে প্রদর্শিত হবে

প্রান্তিককরণ: 4 বাইট

নাম বিন্যাস বর্ণনা
ক্লাস_অনোটেশনস_ফ uint ফাইলের শুরু থেকে সরাসরি ক্লাসে তৈরি টীকাগুলিতে অফসেট করুন, বা 0 শ্রেণীর সরাসরি টীকা না থাকলে 0 । অফসেট, যদি শূন্য-না হয় তবে data বিভাগে কোনও স্থানে হওয়া উচিত। ডেটার ফর্ম্যাটটি নীচে " annotation_set_item " দ্বারা নির্দিষ্ট করা হয়েছে।
ক্ষেত্র_সাইজ uint এই আইটেম দ্বারা টীকায়িত ক্ষেত্রগুলির গণনা
টীকা_মথোডস_সাইজ uint এই আইটেম দ্বারা টীকায়িত পদ্ধতি গণনা
টীকা_প্যারামিটার_সাইজ uint পদ্ধতি প্যারামিটার গণনা এই আইটেম দ্বারা টীকা
ফিল্ড_অনোটেশনস ফিল্ড_অনোটেশন [ফিল্ডস_সাইজ] (al চ্ছিক) সম্পর্কিত ক্ষেত্র টীকাগুলির তালিকা। তালিকার উপাদানগুলি অবশ্যই field_idx দ্বারা ক্রমবর্ধমান ক্রমে বাছাই করা উচিত।
পদ্ধতি_অনোটেশন পদ্ধতি_অনোটেশন [পদ্ধতি_সাইজ] (al চ্ছিক) সম্পর্কিত পদ্ধতি টীকাগুলির তালিকা। তালিকার উপাদানগুলি অবশ্যই method_idx দ্বারা ক্রমবর্ধমান ক্রমে বাছাই করা উচিত।
প্যারামিটার_টীকা প্যারামিটার_অনোটেশন [প্যারামিটার_সাইজ] (al চ্ছিক) সম্পর্কিত পদ্ধতি প্যারামিটার টীকাগুলির তালিকা। তালিকার উপাদানগুলি অবশ্যই method_idx দ্বারা ক্রমবর্ধমান ক্রমে বাছাই করা উচিত।

দ্রষ্টব্য: সমস্ত উপাদানগুলির field_id এবং method_id দৃষ্টান্তগুলি অবশ্যই একই সংজ্ঞায়িত শ্রেণীর উল্লেখ করতে হবে।

ফিল্ড_অ্যানোটেশন ফর্ম্যাট

নাম বিন্যাস বর্ণনা
ফিল্ড_আইডিএক্স uint ক্ষেত্রের পরিচয় দেওয়ার জন্য field_ids তালিকায় সূচক
টীকা_অফ uint ফাইলের শুরু থেকে ক্ষেত্রের জন্য টীকাগুলির তালিকায় অফসেট করুন। অফসেটটি data বিভাগের কোনও স্থানে হওয়া উচিত। ডেটার ফর্ম্যাটটি নীচে " annotation_set_item " দ্বারা নির্দিষ্ট করা হয়েছে।

পদ্ধতি_অনোটেশন ফর্ম্যাট

নাম বিন্যাস বর্ণনা
পদ্ধতি_আইডিএক্স uint পদ্ধতিটি টীকাযুক্ত হওয়ার জন্য পরিচয়ের জন্য method_ids তালিকায় সূচক
টীকা_অফ uint ফাইলের শুরু থেকে পদ্ধতির জন্য টীকাগুলির তালিকায় অফসেট করুন। অফসেটটি data বিভাগের কোনও স্থানে হওয়া উচিত। ডেটার ফর্ম্যাটটি নীচে " annotation_set_item " দ্বারা নির্দিষ্ট করা হয়েছে।

প্যারামিটার_অনোটেশন ফর্ম্যাট

নাম বিন্যাস বর্ণনা
পদ্ধতি_আইডিএক্স uint method_ids প্যারামিটারগুলি টী
টীকা_অফ uint ফাইলের শুরু থেকে পদ্ধতি পরামিতিগুলির জন্য টীকাগুলির তালিকায় অফসেট করুন। অফসেটটি data বিভাগের কোনও স্থানে হওয়া উচিত। ডেটার ফর্ম্যাটটি নীচে " annotation_set_ref_list " দ্বারা নির্দিষ্ট করা হয়েছে।

টীকা_সেট_রেফ_লিস্ট

প্যারামিটার_অনোটেশনস_আইটিএম থেকে রেফারেন্স

ডেটা বিভাগে প্রদর্শিত হবে

প্রান্তিককরণ: 4 বাইট

নাম বিন্যাস বর্ণনা
আকার uint তালিকার আকার, এন্ট্রিগুলিতে
তালিকা টীকা_সেট_রেফ_আইটিএম [আকার] তালিকার উপাদান

টীকা_সেট_রেফ_আইটিএম ফর্ম্যাট

নাম বিন্যাস বর্ণনা
টীকা_অফ uint এই উপাদানটির জন্য কোনও টীকা না থাকলে ফাইলের শুরু থেকে রেফারেন্সযুক্ত টীকা সেট বা 0 পর্যন্ত অফসেট করুন। অফসেট, যদি শূন্য-না হয় তবে data বিভাগে কোনও স্থানে হওয়া উচিত। ডেটার ফর্ম্যাটটি নীচে " annotation_set_item " দ্বারা নির্দিষ্ট করা হয়েছে।

টীকা_সেট_আইটিএম

টীকাগুলি_ডাইরেক্টরি_আইটিএম, ফিল্ড_অ্যানোটেশনস_আইটিএম, পদ্ধতি_অনোটেশন_আইটিএম এবং টীকা_সেট_সেট_আরফ_আইটিএম থেকে রেফারেন্স

ডেটা বিভাগে প্রদর্শিত হবে

প্রান্তিককরণ: 4 বাইট

নাম বিন্যাস বর্ণনা
আকার uint সেটের আকার, এন্ট্রিগুলিতে
এন্ট্রি টীকা_অফ_ আইটেম [আকার] সেট উপাদান। উপাদানগুলি অবশ্যই ক্রমবর্ধমান ক্রমে বাছাই করা উচিত, type_idx দ্বারা।

টীকা_অফ_ আইটেম ফর্ম্যাট

নাম বিন্যাস বর্ণনা
টীকা_ফ uint ফাইলের শুরু থেকে একটি টীকা পর্যন্ত অফসেট। অফসেটটি data বিভাগের কোনও স্থানে হওয়া উচিত, এবং সেই অবস্থানের ডেটার ফর্ম্যাটটি নীচে " annotation_item " দ্বারা নির্দিষ্ট করা হয়েছে।

টীকা_ আইটেম

টীকা_সেট_আইটিএম থেকে রেফারেন্স

ডেটা বিভাগে প্রদর্শিত হবে

প্রান্তিককরণ: কিছুই নয় (বাইট-সারিবদ্ধ)

নাম বিন্যাস বর্ণনা
দৃশ্যমানতা ubyte এই টীকাটির উদ্দেশ্যযুক্ত দৃশ্যমানতা (নীচে দেখুন)
টীকা এনকোডড_অনোটেশন উপরে " encoded_annotation ফর্ম্যাট" দ্বারা বর্ণিত ফর্ম্যাটে এনকোডেড টীকা বিষয়বস্তুগুলি উপরে " encoded_value এনকোডিং" এর অধীনে বর্ণিত।

দৃশ্যমানতার মান

এগুলি একটি annotation_item -এ visibility ক্ষেত্রের বিকল্পগুলি:

নাম মান বর্ণনা
দৃশ্যমান_বিল্ড 0x00 কেবল বিল্ড টাইমে দৃশ্যমান হওয়ার উদ্দেশ্যে (যেমন, অন্যান্য কোড সংকলনের সময়)
দৃশ্যমানতা_রানটাইম 0x01 রানটাইমে দৃশ্যমান উদ্দেশ্যে
দৃশ্যমান_সিস্টেম 0x02 রানটাইমে দৃশ্যমান হওয়ার উদ্দেশ্যে, তবে কেবল অন্তর্নিহিত সিস্টেমে (এবং নিয়মিত ব্যবহারকারী কোড নয়)

এনকোডেড_আরে_আইটিএম

CLASS_DEF_ITEM থেকে রেফারেন্স

ডেটা বিভাগে প্রদর্শিত হবে

প্রান্তিককরণ: কিছুই নয় (বাইট-সারিবদ্ধ)

নাম বিন্যাস বর্ণনা
মান এনকোডেড_আরে উপরে " encoded_array ফর্ম্যাট" দ্বারা নির্দিষ্ট ফর্ম্যাটে এনকোডেড অ্যারে মান উপস্থাপনকারী বাইটগুলি উপরে " encoded_value এনকোডিং" এর অধীনে।

HIDEDAPI_CLASS_DATA_ITEM

এই বিভাগে প্রতিটি শ্রেণীর দ্বারা ব্যবহৃত সীমাবদ্ধ ইন্টারফেসগুলির ডেটা রয়েছে।

দ্রষ্টব্য: লুকানো এপিআই বৈশিষ্ট্যটি অ্যান্ড্রয়েড 10.0 এ প্রবর্তিত হয়েছিল এবং এটি কেবল বুট শ্রেণীর পাথের ক্লাসগুলির ডেক্স ফাইলগুলির জন্য প্রযোজ্য। নীচে বর্ণিত পতাকাগুলির তালিকা অ্যান্ড্রয়েডের ভবিষ্যতের প্রকাশে প্রসারিত হতে পারে। আরও তথ্যের জন্য, নন-এসডিকে ইন্টারফেসগুলিতে বিধিনিষেধগুলি দেখুন।

নাম বিন্যাস বর্ণনা
আকার uint বিভাগের মোট আকার
অফসেট uint [] class_idx দ্বারা সূচকযুক্ত অফসেটগুলির অ্যারে। সূচক class_idx একটি শূন্য অ্যারে এন্ট্রিটির অর্থ হ'ল হয় এই class_idx জন্য কোনও ডেটা নেই, বা সমস্ত লুকানো এপিআই পতাকাগুলি শূন্য। অন্যথায় অ্যারে এন্ট্রিটি শূন্য নয় এবং বিভাগের শুরু থেকে এই class_idx জন্য লুকানো এপিআই পতাকাগুলির একটি অ্যারে পর্যন্ত অফসেট রয়েছে।
পতাকা uleb128 [] প্রতিটি শ্রেণীর জন্য লুকানো এপিআই পতাকাগুলির সংক্ষিপ্ত অ্যারে। সম্ভাব্য পতাকা মানগুলি নীচের সারণীতে বর্ণিত হয়েছে। ক্ষেত্রগুলি একই ক্রমে এনকোড করা হয় কারণ ক্ষেত্রগুলি এবং পদ্ধতিগুলি শ্রেণীর ডেটাতে এনকোড করা হয়।

সীমাবদ্ধতা পতাকা প্রকার:

নাম মান বর্ণনা
সাদা তালিকা 0 যে ইন্টারফেসগুলি অবাধে ব্যবহৃত হতে পারে এবং আনুষ্ঠানিকভাবে ডকুমেন্টেড অ্যান্ড্রয়েড ফ্রেমওয়ার্ক প্যাকেজ সূচকের অংশ হিসাবে সমর্থিত।
গ্রিলিস্ট 1 নন-এসডিকে ইন্টারফেস যা অ্যাপ্লিকেশনটির লক্ষ্য এপিআই স্তর নির্বিশেষে ব্যবহার করা যেতে পারে।
কালো তালিকা 2 নন-এসডিকে ইন্টারফেসগুলি যা অ্যাপ্লিকেশনটির লক্ষ্য এপিআই স্তর নির্বিশেষে ব্যবহার করা যায় না। এই ইন্টারফেসগুলির মধ্যে একটি অ্যাক্সেস করার ফলে রানটাইম ত্রুটি ঘটে।
গ্রেইলিস্ট - ম্যাক্স - ও 3 নন-এসডিকে ইন্টারফেসগুলি যা অ্যান্ড্রয়েড 8.x এবং নীচে ব্যবহার করা যেতে পারে যদি না সেগুলি সীমাবদ্ধ থাকে।
গ্রেইলিস্ট - ম্যাক্স - পি 4 নন-এসডিকে ইন্টারফেসগুলি যা অ্যান্ড্রয়েড 9.x এর জন্য ব্যবহার করা যেতে পারে যদি না তারা সীমাবদ্ধ থাকে।
গ্রেইলিস্ট - ম্যাক্স - কিউ 5 নন-এসডিকে ইন্টারফেসগুলি যা অ্যান্ড্রয়েড 10.x এর জন্য ব্যবহার করা যেতে পারে যদি না তারা সীমাবদ্ধ থাকে।
গ্রেইলিস্ট - ম্যাক্স - আর 6 নন-এসডিকে ইন্টারফেস যা অ্যান্ড্রয়েড ১১.x এর জন্য ব্যবহার করা যেতে পারে যদি না তারা সীমাবদ্ধ থাকে।

সিস্টেম টীকা

সিস্টেম টীকাগুলি ক্লাস (এবং পদ্ধতি এবং ক্ষেত্রগুলি) সম্পর্কে প্রতিফলিত তথ্যের বিভিন্ন টুকরো উপস্থাপন করতে ব্যবহৃত হয়। এই তথ্যটি সাধারণত ক্লায়েন্ট (অ-সিস্টেম) কোড দ্বারা পরোক্ষভাবে অ্যাক্সেস করা হয়।

সিস্টেম টীকাগুলি VISIBILITY_SYSTEM সাথে দৃশ্যমানতার সাথে টীকা হিসাবে .dex ফাইলগুলিতে প্রতিনিধিত্ব করা হয়।

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
অ্যাক্সেসফ্ল্যাগস int মূলত ক্লাসের অ্যাক্সেস পতাকাগুলি ঘোষিত (যা উত্স ভাষার কার্যকরকরণ মডেল এবং টার্গেট ভার্চুয়াল মেশিনের মধ্যে অমিলের কারণে কার্যকর পতাকাগুলির থেকে পৃথক হতে পারে)

dalvik.annotation.memberclasses

ক্লাসে প্রদর্শিত হবে

একটি MemberClasses টীকা প্রতিটি শ্রেণীর সাথে সংযুক্ত থাকে যা সদস্য শ্রেণীর ঘোষণা করে। (একটি সদস্য শ্রেণি একটি প্রত্যক্ষ অভ্যন্তরীণ শ্রেণি যার একটি নাম রয়েছে))

নাম বিন্যাস বর্ণনা
মান শ্রেণি [] সদস্য শ্রেণীর অ্যারে

dalvik.annotation.methodparameters

পদ্ধতিতে প্রদর্শিত হবে

দ্রষ্টব্য: অ্যান্ড্রয়েড 7.1 এর পরে এই টীকাটি যুক্ত করা হয়েছিল। পূর্ববর্তী অ্যান্ড্রয়েড রিলিজগুলিতে এর উপস্থিতি উপেক্ষা করা হবে।

একটি MethodParameters টীকাগুলি al চ্ছিক এবং প্যারামিটার মেটাডেটা যেমন প্যারামিটারের নাম এবং সংশোধক সরবরাহ করতে ব্যবহার করা যেতে পারে।

রানটাইমে প্যারামিটার মেটাডেটা প্রয়োজন না হলে নিরাপদে কোনও পদ্ধতি বা কনস্ট্রাক্টর থেকে টীকাটি বাদ দেওয়া যেতে পারে। java.lang.reflect.Parameter.isNamePresent() মেটাডেটা কোনও প্যারামিটারের জন্য উপস্থিত রয়েছে কিনা তা পরীক্ষা করতে ব্যবহার করা যেতে পারে এবং সম্পর্কিত প্রতিবিম্ব পদ্ধতি যেমন java.lang.reflect.Parameter.getName() রানটাইমের সময় ডিফল্ট আচরণে ফিরে আসবে তথ্য উপস্থিত না থাকলে।

প্যারামিটার মেটাডেটা অন্তর্ভুক্ত করার সময়, সংকলকগুলিকে অবশ্যই এনামগুলির মতো উত্পন্ন শ্রেণীর জন্য তথ্য অন্তর্ভুক্ত করতে হবে, যেহেতু প্যারামিটার মেটাডেটাতে প্যারামিটার সিন্থেটিক বা বাধ্যতামূলক কিনা তা অন্তর্ভুক্ত করে।

একটি MethodParameters টীকাগুলি কেবল পৃথক পদ্ধতির পরামিতিগুলি বর্ণনা করে। অতএব, সংকলকগুলি কোড-আকার এবং রানটাইম দক্ষতার স্বার্থে কোনও পরামিতি নেই এমন নির্মাণকারী এবং পদ্ধতিগুলির জন্য সম্পূর্ণ টীকাগুলি বাদ দিতে পারে।

নীচের নথিভুক্ত অ্যারেগুলি অবশ্যই পদ্ধতির সাথে সম্পর্কিত method_id_item ডেক্স কাঠামোর মতো একই আকারের হতে হবে, অন্যথায় একটি java.lang.reflect.MalformedParametersException রানটাইমে নিক্ষেপ করা হবে।

এটি হ'ল: method_id_item.proto_idx -> proto_id_item.parameters_off -> type_list.size অবশ্যই names().length এবং accessFlags().length সমান হতে হবে।

যেহেতু MethodParameters সমস্ত আনুষ্ঠানিক পদ্ধতির পরামিতিগুলি বর্ণনা করে, এমনকি উত্স কোডে স্পষ্টভাবে বা স্পষ্টভাবে ঘোষিত নয়, অ্যারেগুলির আকার স্বাক্ষর বা অন্যান্য মেটাডেটা তথ্য থেকে পৃথক হতে পারে যা কেবলমাত্র উত্স কোডে ঘোষিত সুস্পষ্ট পরামিতিগুলির উপর ভিত্তি করে। MethodParameters টাইপ টীকাগুলি রিসিভার প্যারামিটারগুলি সম্পর্কে কোনও তথ্যও অন্তর্ভুক্ত করা হবে না যা প্রকৃত পদ্ধতি স্বাক্ষরে বিদ্যমান নেই।

নাম বিন্যাস বর্ণনা
নাম স্ট্রিং[] সম্পর্কিত পদ্ধতির জন্য আনুষ্ঠানিক পরামিতিগুলির নাম। অ্যারে অবশ্যই নাল হতে হবে না তবে কোনও আনুষ্ঠানিক পরামিতি না থাকলে অবশ্যই খালি থাকতে হবে। সূচক সহ আনুষ্ঠানিক প্যারামিটারের কোনও নাম না থাকলে অ্যারেতে একটি মান অবশ্যই বাতিল হতে হবে।
যদি java.lang.reflect.MalformedParametersException নাম স্ট্রিংগুলি খালি থাকে বা থাকে '
অ্যাক্সেসফ্ল্যাগস int[] সম্পর্কিত পদ্ধতির জন্য আনুষ্ঠানিক পরামিতিগুলির অ্যাক্সেস পতাকাগুলি। অ্যারে অবশ্যই নাল হতে হবে না তবে কোনও আনুষ্ঠানিক পরামিতি না থাকলে অবশ্যই খালি থাকতে হবে।
মানটি নিম্নলিখিত মানগুলির সাথে কিছুটা মুখোশ:
  • 0x0010: চূড়ান্ত, প্যারামিটারটি চূড়ান্ত ঘোষণা করা হয়েছিল
  • 0x1000: সিন্থেটিক, প্যারামিটারটি সংকলক দ্বারা প্রবর্তিত হয়েছিল
  • 0x8000: বাধ্যতামূলক, প্যারামিটারটি সিন্থেটিক তবে ভাষার স্পেসিফিকেশন দ্বারাও অন্তর্ভুক্ত
যদি এই সেটটির বাইরে কোনও বিট সেট করা থাকে তবে একটি java.lang.reflect.MalformedParametersException রানটাইমে নিক্ষেপ করা হবে।

dalvik.annotation.signature

ক্লাস, ক্ষেত্র এবং পদ্ধতিতে প্রদর্শিত হবে

একটি Signature টীকা প্রতিটি শ্রেণি, ক্ষেত্র বা পদ্ধতির সাথে সংযুক্ত থাকে যা type_id_item দ্বারা প্রতিনিধিত্বযোগ্য তুলনায় আরও জটিল ধরণের ক্ষেত্রে সংজ্ঞায়িত হয়। .dex ফর্ম্যাট স্বাক্ষরগুলির জন্য ফর্ম্যাটটি সংজ্ঞায়িত করে না; এটি কেবলমাত্র সেই ভাষার শব্দার্থবিজ্ঞানের সফল বাস্তবায়নের জন্য কোনও উত্স ভাষার যে স্বাক্ষর প্রয়োজন তা প্রতিনিধিত্ব করতে সক্ষম হওয়া বোঝানো। যেমন, স্বাক্ষরগুলি সাধারণত ভার্চুয়াল মেশিন বাস্তবায়ন দ্বারা পার্স করা হয় না (বা যাচাই করা)। স্বাক্ষরগুলি কেবল উচ্চ-স্তরের এপিআই এবং সরঞ্জামগুলিতে (যেমন ডিবাগার হিসাবে) হস্তান্তরিত হয়। স্বাক্ষরের যে কোনও ব্যবহার, সুতরাং, কেবল বৈধ স্বাক্ষর প্রাপ্তি সম্পর্কে কোনও অনুমান না করার জন্য, স্পষ্টভাবে নিজেকে সিনট্যাকটিক্যালি অবৈধ স্বাক্ষরটি পেরিয়ে আসার সম্ভাবনার বিরুদ্ধে নিজেকে রক্ষা করার বিষয়ে কোনও অনুমান না করার জন্য লিখতে হবে।

যেহেতু স্বাক্ষরযুক্ত স্ট্রিংগুলিতে প্রচুর নকল সামগ্রী রয়েছে, তাই একটি Signature টীকাগুলি স্ট্রিংগুলির একটি অ্যারে হিসাবে সংজ্ঞায়িত করা হয়, যেখানে নকল উপাদানগুলি স্বাভাবিকভাবে একই অন্তর্নিহিত ডেটা বোঝায় এবং স্বাক্ষরটি অ্যারেতে সমস্ত স্ট্রিংগুলির সংমিশ্রণ হিসাবে নেওয়া হয় . কীভাবে পৃথক স্ট্রিংগুলিতে স্বাক্ষরটি আলাদা করতে হয় সে সম্পর্কে কোনও নিয়ম নেই; এটি সম্পূর্ণরূপে এমন সরঞ্জামগুলির উপর নির্ভর করে যা .dex ফাইলগুলি উত্পন্ন করে।

নাম বিন্যাস বর্ণনা
মান স্ট্রিং[] এই শ্রেণি বা সদস্যের স্বাক্ষর, স্ট্রিংগুলির একটি অ্যারে হিসাবে যা একসাথে একত্রিত করা উচিত

dalvik.annotation.trows

পদ্ধতিতে প্রদর্শিত হবে

একটি Throws টীকা প্রতিটি পদ্ধতির সাথে সংযুক্ত থাকে যা এক বা একাধিক ব্যতিক্রম প্রকারের নিক্ষেপ করার ঘোষণা করা হয়।

নাম বিন্যাস বর্ণনা
মান শ্রেণি [] ব্যতিক্রম প্রকারের অ্যারে