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

এই ডকুমেন্টটি .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 মেথড হ্যান্ডেল একটি ইনস্ট্যান্স মেথড ইনভোকার
METHOD_HANDLE_TYPE_INVOKE_CONSTRUCTOR 0x06 মেথড হ্যান্ডেল হল কনস্ট্রাক্টর মেথড ইনভোকার
METHOD_HANDLE_TYPE_INVOKE_DIRECT 0x07 মেথড হ্যান্ডেল একটি সরাসরি পদ্ধতি আহবানকারী
METHOD_HANDLE_TYPE_INVOKE_INTERFACE 0x08 মেথড হ্যান্ডেল একটি ইন্টারফেস মেথড ইনভোকার

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

class_def_item থেকে উল্লেখ করা হয়েছে

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

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

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

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

encoded_field বিন্যাস

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

encoded_method বিন্যাস

নাম বিন্যাস বর্ণনা
পদ্ধতি_আইডিএক্স_ডিফ uleb128 এই পদ্ধতির পরিচয়ের জন্য method_ids তালিকায় সূচী (নাম এবং বর্ণনাকারী অন্তর্ভুক্ত), তালিকার পূর্ববর্তী উপাদানের সূচী থেকে একটি পার্থক্য হিসাবে উপস্থাপিত। একটি তালিকার প্রথম উপাদানের সূচক সরাসরি উপস্থাপন করা হয়।
অ্যাক্সেস_পতাকা 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 ছোট type_ids তালিকায় সূচক করুন

কোড_আইটেম

encoded_method থেকে উল্লেখ করা হয়েছে

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

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

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

try_item বিন্যাস

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

encoded_catch_handler_list বিন্যাস

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

encoded_catch_handler বিন্যাস

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

encoded_type_addr_pair বিন্যাস

নাম বিন্যাস বর্ণনা
type_idx uleb128 ধরতে ব্যতিক্রম ধরনের জন্য type_ids তালিকায় সূচক করুন
addr uleb128 সংশ্লিষ্ট ব্যতিক্রম হ্যান্ডলারের বাইটকোড ঠিকানা

ডিবাগ_তথ্য_আইটেম

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

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

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

প্রতিটি debug_info_item একটি DWARF3-অনুপ্রাণিত বাইট-কোডেড স্টেট মেশিনকে সংজ্ঞায়িত করে যা ব্যাখ্যা করা হলে, অবস্থান টেবিল এবং (সম্ভাব্যভাবে) একটি 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_SEQUENCE 0x00 (কোনটিই নয়) একটি code_item জন্য একটি ডিবাগ তথ্য ক্রম বন্ধ করে
DBG_ADVANCE_PC 0x01 uleb128 addr_diff addr_diff : ঠিকানা রেজিস্টারে যোগ করার পরিমাণ একটি অবস্থান এন্ট্রি নির্গত ছাড়া ঠিকানা নিবন্ধন অগ্রসর
DBG_ADVANCE_LINE 0x02 sleb128 লাইন_ডিফ 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 , যদিও, একই ডেটা অপকোড DBG_START_LOCAL ব্যবহার করে আরও দক্ষতার সাথে উপস্থাপন করা যেতে পারে।)

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

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

বিশেষ অপকোড

0x0a এবং 0xff (অন্তর্ভুক্ত) এর মধ্যে মান সহ অপকোডগুলি line এবং address রেজিস্টার উভয়কে অল্প পরিমাণে সরিয়ে দেয় এবং তারপরে একটি নতুন অবস্থান টেবিল এন্ট্রি নির্গত করে। বৃদ্ধির সূত্রটি নিম্নরূপ:

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

adjusted_opcode = opcode - DBG_FIRST_SPECIAL

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

annotations_directory_item

class_def_item থেকে উল্লেখ করা হয়েছে

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

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

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

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

ক্ষেত্র_টীকা বিন্যাস

নাম বিন্যাস বর্ণনা
field_idx 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 " দ্বারা নির্দিষ্ট করা হয়েছে৷

annotation_set_ref_list

প্যারামিটার_এনোটেশন_আইটেম থেকে উল্লেখ করা হয়েছে

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

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

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

annotation_set_ref_item বিন্যাস

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

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

annotations_directory_item, field_annotations_item, method_annotations_item, এবং annotation_set_ref_item থেকে উল্লেখ করা হয়েছে

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

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

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

টীকা_বন্ধ_আইটেম বিন্যাস

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

টীকা_আইটেম

annotation_set_item থেকে উল্লেখ করা হয়েছে

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

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

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

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

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

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

encoded_array_item

class_def_item থেকে উল্লেখ করা হয়েছে

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

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

নাম বিন্যাস বর্ণনা
মান encoded_array উপরের " encoded_value Encoding" এর অধীনে " encoded_array বিন্যাস" দ্বারা নির্দিষ্ট বিন্যাসে এনকোড করা অ্যারে মানকে প্রতিনিধিত্ব করে বাইট৷

hiddenapi_class_data_item

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

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

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

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

নাম মান বর্ণনা
সাদা তালিকা 0 যে ইন্টারফেসগুলি অবাধে ব্যবহার করা যেতে পারে এবং আনুষ্ঠানিকভাবে নথিভুক্ত Android ফ্রেমওয়ার্ক প্যাকেজ সূচকের অংশ হিসাবে সমর্থিত।
greylist 1 নন-SDK ইন্টারফেস যা অ্যাপ্লিকেশনের লক্ষ্য API স্তর নির্বিশেষে ব্যবহার করা যেতে পারে।
কালো তালিকা 2 নন-SDK ইন্টারফেস যা অ্যাপ্লিকেশনের লক্ষ্য API স্তর নির্বিশেষে ব্যবহার করা যাবে না। এই ইন্টারফেসগুলির মধ্যে একটি অ্যাক্সেস করার ফলে একটি রানটাইম ত্রুটি ঘটে।
গ্রেলিস্ট-সর্বোচ্চ 3 নন-SDK ইন্টারফেস যেগুলি Android 8.x এবং নীচের জন্য ব্যবহার করা যেতে পারে যদি না সেগুলি সীমাবদ্ধ থাকে৷
greylist- সর্বোচ্চ-p 4 নন-SDK ইন্টারফেস যেগুলি Android 9.x এর জন্য ব্যবহার করা যেতে পারে যদি না সেগুলি সীমাবদ্ধ থাকে৷
greylist-সর্বোচ্চ-q 5 নন-SDK ইন্টারফেস যেগুলি Android 10.x এর জন্য ব্যবহার করা যেতে পারে যদি না সেগুলি সীমাবদ্ধ থাকে৷
greylist-max-r 6 নন-SDK ইন্টারফেস যেগুলি Android 11.x এর জন্য ব্যবহার করা যেতে পারে যদি না সেগুলি সীমাবদ্ধ থাকে৷

সিস্টেম টীকা

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

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

ডালভিক.টীকা.টিকা ডিফল্ট

টীকা ইন্টারফেসে পদ্ধতিতে উপস্থিত হয়

একটি AnnotationDefault টীকা প্রতিটি টীকা ইন্টারফেসের সাথে সংযুক্ত থাকে যা ডিফল্ট বাঁধাই নির্দেশ করতে চায়।

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

dalvik.annotation.EnclosingClass

ক্লাসে হাজির হয়

একটি EnclosingClass টীকা প্রতিটি ক্লাসের সাথে সংযুক্ত থাকে যা হয় অন্য শ্রেণীর সদস্য হিসাবে সংজ্ঞায়িত করা হয়, প্রতি সে, অথবা বেনামী কিন্তু একটি পদ্ধতি বডির মধ্যে সংজ্ঞায়িত করা হয় না (যেমন, একটি সিন্থেটিক অভ্যন্তরীণ শ্রেণী)। এই টীকাটি আছে এমন প্রতিটি শ্রেণীতে অবশ্যই একটি InnerClass টীকা থাকতে হবে। উপরন্তু, একটি ক্লাসে একটি EnclosingClass এবং একটি EnclosingMethod টীকা উভয়ই থাকতে হবে না।

নাম বিন্যাস বর্ণনা
মান ক্লাস যে শ্রেণীটি সবচেয়ে ঘনিষ্ঠভাবে আভিধানিকভাবে এই শ্রেণীকে স্কোপ করে

dalvik.annotation. Enclosing Method

ক্লাসে হাজির হয়

একটি EnclosingMethod টীকা প্রতিটি ক্লাসের সাথে সংযুক্ত থাকে যা একটি মেথড বডির ভিতরে সংজ্ঞায়িত করা হয়। এই টীকাটি আছে এমন প্রতিটি শ্রেণীতে অবশ্যই একটি InnerClass টীকা থাকতে হবে। উপরন্তু, একটি ক্লাসে একটি EnclosingClass এবং একটি EnclosingMethod টীকা উভয়ই থাকতে হবে না।

নাম বিন্যাস বর্ণনা
মান পদ্ধতি পদ্ধতি যা সবচেয়ে ঘনিষ্ঠভাবে আভিধানিকভাবে এই শ্রেণীর স্কোপ করে

dalvik.annotation.InnerClass

ক্লাসে হাজির হয়

একটি InnerClass টীকা প্রতিটি শ্রেণীর সাথে সংযুক্ত থাকে যা অন্য শ্রেণীর সংজ্ঞার আভিধানিক সুযোগে সংজ্ঞায়িত করা হয়। এই টীকাটি আছে এমন যেকোন শ্রেণীতে অবশ্যই একটি EnclosingClass টীকা বা একটি EnclosingMethod টীকা থাকতে হবে।

নাম বিন্যাস বর্ণনা
নাম স্ট্রিং এই শ্রেণীর প্রাথমিকভাবে ঘোষিত সহজ নাম (কোন প্যাকেজ উপসর্গ সহ নয়)। যদি এই শ্রেণীটি বেনামী হয়, তাহলে নামটি null
অ্যাক্সেস পতাকা int ক্লাসের প্রাথমিকভাবে ঘোষিত অ্যাক্সেস পতাকা (উৎস ভাষা এবং টার্গেট ভার্চুয়াল মেশিনের এক্সিকিউশন মডেলের মধ্যে অমিলের কারণে কার্যকর পতাকাগুলির থেকে যা আলাদা হতে পারে)

ডালভিক.টীকা.মেম্বারক্লাস

ক্লাসে হাজির হয়

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

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

dalvik.annotation.Method Parameters

পদ্ধতিতে উপস্থিত হয়

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

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

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

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

একটি 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 নিক্ষেপ করা হবে।

ডালভিক।টীকা।স্বাক্ষর

ক্লাস, ক্ষেত্র এবং পদ্ধতিতে উপস্থিত হয়

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

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

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

ডালভিক.টীকা.নিক্ষেপ

পদ্ধতিতে উপস্থিত হয়

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

নাম বিন্যাস বর্ণনা
মান ক্লাস[] ব্যতিক্রম ধরনের বিন্যাস নিক্ষেপ