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

এই ডকুমেন্টে .dex ফাইলের লেআউট ও কন্টেন্ট সম্পর্কে বর্ণনা করা হয়েছে, যেগুলি ক্লাস ডেফিনিশন ও তার সাথে যুক্ত অ্যাডজাঙ্ক্ট ডেটার সেট হোল্ড করতে ব্যবহার করা হয়।

বিভিন্ন ধরনের ব্যাপারে গাইড

নাম বর্ণনা
বাইট ৮-বিট সাইনড ইন্ট
ubyte ৮-বিট আনসাইনড ইন্ট
ছোট ভিডিও ১৬-বিট সাইনড ইন্টিজার, লিটল-এন্ডিয়ান
ushort ১৬-বিট আনসাইনড ইন্টিজার, লিটল-এন্ডিয়ান
int ৩২-বিট সাইনড ইন্টিজার, লিটল-এন্ডিয়ান
uint 32-বিট আনসাইনড ইন্টিজার, লিটল-এন্ডিয়ান
দীর্ঘ ৬৪-বিট সাইনড ইন্টিজার, লিটল-এন্ডিয়ান
উলং ৬৪-বিট আনসাইনড ইন্টিজার, লিটল-এন্ডিয়ান
sleb128 signed LEB128, ভেরিয়েবল-লেংথ (নিচে দেখুন)
uleb128 আনসাইন করা LEB128, পরিবর্তনশীল-দৈর্ঘ্য (নিচে দেখুন)
uleb128p1 আনসাইনড LEB128 plus 1, পরিবর্তনযোগ্য দৈর্ঘ্য (নিচে দেখুন)

LEB128

LEB128 ("Lিটল-ইন্ডিয়ান Bেস 128") হল যেকোনও সাইন করা বা সাইন না করা পূর্ণসংখ্যা কোয়ান্টিটির জন্য পরিবর্তনযোগ্য-দৈর্ঘ্যের এনকোডিং। এই ফর্ম্যাটটি DWARF3 স্পেসিফিকেশন থেকে ধার করা হয়েছে। .dex ফাইলে, LEB128 শুধুমাত্র ৩২-বিট পরিমাণ এনকোড করতে ব্যবহার করা হয়।

প্রতিটি LEB128 এনকোড করা ভ্যালুতে এক থেকে পাঁচটি বাইট থাকে, যা একসাথে একটি ৩২-বিট ভ্যালু দেখায়। প্রতিটি বাইটের সবচেয়ে গুরুত্বপূর্ণ বিট সেট করা থাকে, তবে সিকোয়েন্সের শেষ বাইটের ক্ষেত্রে সবচেয়ে গুরুত্বপূর্ণ বিটটি ক্লিয়ার করা থাকে। প্রতিটি বাইটের বাকি সাতটি বিট হল পেলোড, প্রথম বাইটে পরিমাণের সবচেয়ে কম গুরুত্বপূর্ণ সাতটি বিট, দ্বিতীয় বাইটে পরের সাতটি বিট এবং এইরকমভাবে চলতে থাকে। সাইন করা LEB128 (sleb128)-এর ক্ষেত্রে, চূড়ান্ত ভ্যালু তৈরি করার জন্য সিকোয়েন্সের চূড়ান্ত বাইটের সবচেয়ে গুরুত্বপূর্ণ পেলোড বিট সাইন-এক্সটেন্ড করা হয়। আনসাইনড ক্ষেত্রে (uleb128), স্পষ্টভাবে দেখানো হয়নি এমন যেকোনও বিটকে 0 হিসেবে ব্যাখ্যা করা হয়।

দুই-বাইট LEB128 ভ্যালুর বিটওয়াইজ ডায়াগ্রাম
ফার্স্ট বাইট দ্বিতীয় বাইট
1 bit6 বিট৫ bit4 bit3 bit2 বিট১ বিট০ 0 বিট১৩ বিট১২ bit11 bit10 bit9 bit8 বিট7

uleb128p1 ভেরিয়েন্টটি সাইন করা মান বোঝাতে ব্যবহার করা হয়, যেখানে uleb128 হিসেবে এনকোড করা মানটি হল এক যোগ করা। এর ফলে -1 (অন্যভাবে এটিকে আনসাইনড ভ্যালু 0xffffffff হিসেবেও বিবেচনা করা হয়) — কিন্তু অন্য কোনও নেগেটিভ সংখ্যা নয় — একটি বাইট হিসেবে এনকোড করা হয় এবং এটি ঠিক সেইসব ক্ষেত্রে উপযোগী যেখানে উপস্থাপিত সংখ্যাকে অবশ্যই নেগেটিভ নয় অথবা -1 (বা 0xffffffff) হতে হবে, এবং যেখানে অন্য কোনও নেগেটিভ ভ্যালু অনুমোদিত নয় (অথবা যেখানে বড় আনসাইনড ভ্যালুর প্রয়োজন হওয়ার সম্ভাবনা কম)।

এখানে ফর্ম্যাটের কিছু উদাহরণ দেওয়া হল:

এনকোড করা সিকোয়েন্স sleb128 হিসেবে uleb128 হিসেবে uleb128p1 হিসেবে
০০00-1
০১110
7f-1127126
80 7f-1281625616255

ফাইল লেআউট

নাম ফর্ম্যাট বর্ণনা
হেডার header_item হেডার
string_ids string_id_item[] স্ট্রিং শনাক্তকারীর তালিকা। এই ফাইলে ব্যবহৃত সব স্ট্রিংয়ের জন্য এগুলি হল শনাক্তকারী, যা ইন্টার্নাল নামকরণের জন্য (যেমন, টাইপ ডেসক্রিপ্টর) অথবা কোড দ্বারা রেফার করা কনস্ট্যান্ট অবজেক্ট হিসেবে ব্যবহার করা হয়। এই তালিকাটি UTF-16 কোড পয়েন্ট ভ্যালু (লোকেল-সংবেদনশীল পদ্ধতিতে নয়) ব্যবহার করে স্ট্রিং কন্টেন্ট অনুযায়ী সাজাতে হবে এবং এতে কোনও ডুপ্লিকেট এন্ট্রি থাকলে চলবে না।
type_ids type_id_item[] শনাক্তকারীর ধরন সংক্রান্ত তালিকা। এই ফাইলে উল্লেখ করা সব ধরনের (ক্লাস, অ্যারে বা প্রিমিটিভ ধরন) শনাক্তকারী এগুলি, ফাইলে উল্লেখ করা থাকুক বা না থাকুক। এই তালিকাটি অবশ্যই string_id ইনডেক্স অনুসারে সাজানো হতে হবে এবং এতে কোনও ডুপ্লিকেট এন্ট্রি থাকা চলবে না।
proto_ids proto_id_item[] মেথড প্রোটোটাইপ শনাক্তকারীর তালিকা। এই ফাইলে উল্লেখ করা সব প্রোটোটাইপের জন্য এগুলি হল শনাক্তকারী। এই তালিকাটি অবশ্যই রিটার্ন-টাইপ (type_id ইনডেক্স অনুযায়ী) প্রধান ক্রমে এবং তারপর আর্গুমেন্ট তালিকা (লেক্সিকোগ্রাফিক ক্রম, type_id ইনডেক্স অনুযায়ী ক্রমবদ্ধ স্বতন্ত্র আর্গুমেন্ট) অনুযায়ী সাজাতে হবে। তালিকায় কোনও ডুপ্লিকেট এন্ট্রি থাকলে চলবে না।
field_ids field_id_item[] ফিল্ড শনাক্তকারীর তালিকা। এই ফাইলে উল্লেখ করা সমস্ত ফিল্ডের জন্য এগুলি হল শনাক্তকারী, সেগুলি ফাইলে সংজ্ঞায়িত করা হোক বা না হোক। এই তালিকাটি অবশ্যই সাজানো হতে হবে, যেখানে সংজ্ঞা নির্ধারণকারী ধরন (type_id ইনডেক্স অনুযায়ী) হল প্রধান অর্ডার, ফিল্ডের নাম (string_id ইনডেক্স অনুযায়ী) হল মধ্যবর্তী অর্ডার এবং ধরন (type_id ইনডেক্স অনুযায়ী) হল গৌণ অর্ডার। তালিকায় কোনও ডুপ্লিকেট এন্ট্রি থাকা চলবে না।
method_ids method_id_item[] পদ্ধতি শনাক্তকারীর তালিকা। এইসব হল সেইসব পদ্ধতির শনাক্তকারী যেগুলি এই ফাইলের মাধ্যমে উল্লেখ করা হয়েছে, সেগুলি ফাইলে সংজ্ঞায়িত করা হোক বা না হোক। এই তালিকাটি অবশ্যই সাজানো হতে হবে, যেখানে সংজ্ঞা নির্ধারণকারী ধরন (type_id ইনডেক্স অনুযায়ী) হল প্রধান অর্ডার, পদ্ধতির নাম (string_id ইনডেক্স অনুযায়ী) হল মধ্যবর্তী অর্ডার এবং পদ্ধতির প্রোটোটাইপ (proto_id ইনডেক্স অনুযায়ী) হল গৌণ অর্ডার। তালিকায় কোনও ডুপ্লিকেট এন্ট্রি থাকলে চলবে না।
class_defs class_def_item[] ক্লাসের সংজ্ঞাগুলির তালিকা। ক্লাসগুলি এমনভাবে সাজাতে হবে যাতে প্রদত্ত ক্লাসের সুপারক্লাস এবং ইমপ্লিমেন্ট করা ইন্টারফেস রেফার করা ক্লাসের আগে তালিকায় দেখা যায়। এছাড়াও, একই নামের ক্লাসের সংজ্ঞা তালিকায় একাধিকবার থাকলে সেটি সঠিক নয়।
call_site_ids call_site_id_item[] সাইট শনাক্তকারী তালিকা কল করুন। এই ফাইলে উল্লেখ করা সমস্ত কল সাইটের জন্য এগুলি হল শনাক্তকারী, ফাইলে সংজ্ঞায়িত করা হোক বা না হোক। এই তালিকা call_site_off-এর ছোট থেকে বড় ক্রম অনুসারে সাজানো থাকতে হবে।
method_handles method_handle_item[] পদ্ধতি তালিকা হ্যান্ডেল করে। এই ফাইলের উল্লেখ করা সব মেথড হ্যান্ডেলের তালিকা, সেগুলি ফাইলে সংজ্ঞায়িত করা হোক বা না হোক। এই তালিকাটি সাজানো নয় এবং এতে ডুপ্লিকেট থাকতে পারে যা যৌক্তিকভাবে বিভিন্ন মেথড হ্যান্ডেল ইনস্ট্যান্সের সাথে সম্পর্কিত হবে।
ডেটা ubyte[] ডেটা এরিয়া, যেখানে উপরে তালিকাভুক্ত টেবিলের জন্য সব সহায়তা সংক্রান্ত ডেটা থাকে। আলাদা আলাদা আইটেমের জন্য আলাদা আলাদা অ্যালাইনমেন্ট সংক্রান্ত প্রয়োজনীয়তা থাকে এবং সঠিক অ্যালাইনমেন্ট পাওয়ার জন্য প্রয়োজন হলে প্রতিটি আইটেমের আগে প্যাডিং বাইট যোগ করা হয়।
link_data ubyte[] স্ট্যাটিক লিঙ্ক করা ফাইলে ব্যবহৃত ডেটা। এই বিভাগে ডেটার ফর্ম্যাট এই ডকুমেন্টে উল্লেখ করা হয়নি। আনলিঙ্ক করা ফাইলে এই বিভাগটি খালি থাকে এবং রানটাইম ইমপ্লিমেন্টেশন সেগুলি উপযুক্ত মনে করলে ব্যবহার করতে পারে।

কন্টেনার ফর্ম্যাট

ভার্সন ৪১-এ DEX ডেটার জন্য একটি নতুন কন্টেনার ফর্ম্যাট চালু করা হয়েছে, এর উদ্দেশ্য হল স্পেস সেভ করা। এই কন্টেনার ফর্ম্যাট একাধিক লজিক্যাল DEX ফাইলকে একটি ফিজিক্যাল ফাইলে একত্রিত করতে দেয়। নতুন ফর্ম্যাটটি বেশিরভাগ ক্ষেত্রেই আগের ফর্ম্যাটে থাকা ফাইলগুলির একটি সাধারণ কনক্যাটেনেশন, তবে কিছু পার্থক্য রয়েছে:

  • file_size হল লজিক্যাল ফাইলের সাইজ, ফিজিক্যাল ফাইলের সাইজ নয়। কন্টেনারের মধ্যে থাকা সব লজিক্যাল ফাইল ইটারেট করার জন্য এটি ব্যবহার করা যেতে পারে।
  • লজিক্যাল dex ফাইল কন্টেনারে থাকা যেকোনও পরবর্তী ডেটা রেফার করতে পারে (তবে আগের ডেটা নয়)। এর ফলে dex ফাইলগুলি একে অপরের সাথে স্ট্রিংয়ের মতো ডেটা শেয়ার করতে পারে।
  • সব অফসেট হল ফিজিক্যাল ফাইলের সাপেক্ষে। হেডারের সাথে সম্পর্কিত কোনও অফসেট নেই। এটি নিশ্চিত করে যে অফসেট সহ বিভাগগুলি লজিক্যাল ফাইলের মধ্যে শেয়ার করা যেতে পারে।
  • কন্টেনারের সীমা বর্ণনা করার জন্য হেডার দুটি নতুন ফিল্ড যোগ করে। এটি অতিরিক্ত সামঞ্জস্য চেক এবং এর ফলে নতুন ফর্ম্যাটে কোড পোর্ট করা সহজ হয়।
  • data_size ও data_off এখন আর ব্যবহার করা হচ্ছে না। ডেটা একাধিক লজিক্যাল ফাইল জুড়ে ছড়িয়ে থাকতে পারে এবং তা সংলগ্ন হতে হবে না।

বিটফিল্ড, স্ট্রিং এবং কনস্ট্যান্টের সংজ্ঞা

DEX_FILE_MAGIC

header_item-এ এম্বেড করা আছে

কনস্ট্যান্ট অ্যারে/স্ট্রিং DEX_FILE_MAGIC হল বাইটের তালিকা যা .dex ফাইলের শুরুতে অবশ্যই থাকতে হবে যাতে এটিকে সেইভাবে শনাক্ত করা যায়। নির্দিষ্ট কিছু ধরনের দুর্নীতি শনাক্ত করতে সাহায্য করার জন্য ভ্যালুতে ইচ্ছাকৃতভাবে একটি নতুন লাইন ("\n" বা 0x0a) এবং একটি নাল বাইট ("\0" বা 0x00) অন্তর্ভুক্ত করা হয়েছে। এছাড়াও, ভ্যালু তিনটি দশমিক সংখ্যা হিসেবে ফর্ম্যাট ভার্সন নম্বর এনকোড করে, যা ফর্ম্যাট উন্নত হওয়ার সাথে সাথে সময়ের সাথে সাথে একভাবে বাড়বে বলে আশা করা হয়।

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

মনে রাখবেন: Android 16 রিলিজের ক্ষেত্রে ফর্ম্যাটের 041 ভার্সনের জন্য সহায়তা হল পরীক্ষামূলক, যাতে কন্টেনার ফর্ম্যাট পরীক্ষা করা যায়। তবে, প্রোডাকশন কোডের জন্য ভার্সন 041 ব্যবহার করা উচিত নয়।

মনে রাখবেন: Android 10.0 রিলিজে 040 ভার্সনের ফর্ম্যাটের জন্য সহায়তা যোগ করা হয়েছে, যা SimpleNames-এ অনুমোদিত অক্ষরের সেটকে আরও বাড়িয়ে দিয়েছে।

মনে রাখবেন: Android 9.0 রিলিজের মাধ্যমে ফর্ম্যাটের 039 ভার্সনের জন্য সহায়তা যোগ করা হয়েছে, এর মধ্যে দুটি নতুন বাইটকোড, const-method-handle এবং const-method-type রয়েছে। (এগুলি বাইটকোড সেটের সারসংক্ষেপ টেবিলে প্রতিটি বর্ণনা করা হয়েছে।) Android 10-এ, 039 ভার্সন DEX ফাইল ফর্ম্যাটকে আরও বড় করে যাতে লুকানো API তথ্য অন্তর্ভুক্ত করা যায়। এটি শুধু বুট ক্লাস পাথে DEX ফাইলের ক্ষেত্রে প্রযোজ্য।

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

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

মনে রাখবেন: ফর্ম্যাটের অন্তত কয়েকটি আগের ভার্সন ব্যাপকভাবে উপলভ্য পাবলিক সফ্টওয়্যার রিলিজে ব্যবহার করা হয়েছে। যেমন, Android প্ল্যাটফর্মের M3 রিলিজের জন্য 009 ভার্সন (নভেম্বর–ডিসেম্বর ২০০৭) এবং Android প্ল্যাটফর্মের M5 রিলিজের জন্য 013 ভার্সন (ফেব্রুয়ারি–মার্চ ২০০৮) ব্যবহার করা হয়েছিল। এই ফর্ম্যাটের আগের ভার্সনগুলি বিভিন্ন দিক থেকে এই ডকুমেন্টে বর্ণিত ভার্সনের থেকে উল্লেখযোগ্যভাবে আলাদা।

ENDIAN_CONSTANT এবং REVERSE_ENDIAN_CONSTANT

header_item-এ এম্বেড করা আছে

যে ফাইলে এটি পাওয়া যায়, সেটির এন্ডিয়ানেস বোঝাতে ধ্রুবক ENDIAN_CONSTANT ব্যবহার করা হয়। যদিও স্ট্যান্ডার্ড .dex ফর্ম্যাট হল লিটল-এন্ডিয়ান, তবে প্রয়োগ করার সময় বাইট-সোয়াপিং করার বিকল্প বেছে নেওয়া যেতে পারে। কোনও ইমপ্লিমেন্টেশনে যদি এমন কোনও হেডার পাওয়া যায় যার endian_tag হল REVERSE_ENDIAN_CONSTANT কিন্তু ENDIAN_CONSTANT নয়, তাহলে সেটি বুঝতে পারবে যে ফাইলটি প্রত্যাশিত ফর্ম থেকে বাইট-সোয়াপ করা হয়েছে।

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

NO_INDEX

class_def_item ও debug_info_item-এ এম্বেড করা থাকে

NO_INDEX ধ্রুবকটি ব্যবহার করা হয় এটি বোঝাতে যে একটি ইন্ডেক্স ভ্যালু অনুপস্থিত।

মনে রাখবেন: এই ভ্যালু 0 হিসেবে সংজ্ঞায়িত করা হয়নি, কারণ এটি আসলে সাধারণত একটি সঠিক ইন্ডেক্স।

NO_INDEX-এর জন্য বেছে নেওয়া ভ্যালু uleb128p1 এনকোডিংয়ে একটি বাইট হিসেবে দেখানো যায়।

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

access_flags সংজ্ঞা

class_def_item, encoded_field, encoded_method, এবং InnerClass-এ এম্বেড করা আছে

এইসব ফ্ল্যাগের বিটফিল্ড ব্যবহার করে ক্লাস ও ক্লাস মেম্বারদের অ্যাক্সেসিবিলিটি ও সামগ্রিক প্রপার্টি দেখানো হয়।

নাম মান ক্লাসের জন্য (এবং InnerClass অ্যানোটেশন) ফিল্ডের জন্য পদ্ধতির জন্য
ACC_PUBLIC 0x1 public: সব জায়গায় দেখা যাবে public: সব জায়গায় দেখা যাবে public: সব জায়গায় দেখা যাবে
ACC_PRIVATE 0x2 * private: শুধুমাত্র ডিফাইনিং ক্লাসের জন্য দৃশ্যমান private: শুধু ডিফাইন করা ক্লাসের কাছেই দৃশ্যমান private: শুধু ডিফাইন করা ক্লাসের কাছেই দৃশ্যমান
ACC_PROTECTED 0x4 * protected: প্যাকেজ ও সাবক্লাসের কাছে দৃশ্যমান protected: প্যাকেজ ও সাবক্লাসে দেখা যায় protected: প্যাকেজ ও সাবক্লাসে দেখা যায়
ACC_STATIC 0x8 * static: is not constructed with an outer this reference static: গ্লোবাল থেকে ডিফাইন করা ক্লাস static: this আর্গুমেন্ট নেয় না
ACC_FINAL 0x10 final: সাবক্লাস করা যায় না final: কনস্ট্রাকশনের পরে অপরিবর্তনীয় final: ওভাররাইড করা যাবে না
ACC_SYNCHRONIZED 0x20     synchronized: এই পদ্ধতির কলের আশেপাশে অটোমেটিক অ্যাসোসিয়েটেড লক পাওয়া যায়।

মনে রাখবেন: এটি শুধুমাত্র তখনই সেট করা যায় যখন ACC_NATIVE-ও সেট করা থাকে।

ACC_VOLATILE 0x40   volatile: থ্রেড নিরাপত্তার ব্যাপারে সাহায্য করার জন্য বিশেষ অ্যাক্সেস সংক্রান্ত নিয়ম  
ACC_BRIDGE 0x40     ব্রিজ পদ্ধতি, কম্পাইলারের মাধ্যমে অটোমেটিক যোগ করা হয়েছে, এটি হল টাইপ-সেফ ব্রিজ
ACC_TRANSIENT 0x80   transient: ডিফল্ট সিরিয়ালাইজেশন দ্বারা সেভ করা যাবে না  
ACC_VARARGS 0x80     শেষ আর্গুমেন্টকে কম্পাইলারের "বাকি" আর্গুমেন্ট হিসেবে বিবেচনা করা উচিত
ACC_NATIVE 0x100     native: নেটিভ কোডে প্রয়োগ করা হয়েছে
ACC_INTERFACE 0x200 interface: একাধিকবার প্রয়োগযোগ্য অ্যাবস্ট্র্যাক্ট ক্লাস    
ACC_ABSTRACT 0x400 abstract: সরাসরি ইনস্ট্যান্ট করা যায় না   abstract: এই ক্লাসে প্রয়োগ করা হয়নি
ACC_STRICT 0x800     strictfp: ফ্লোটিং-পয়েন্ট পাটিগণিতের জন্য কঠোর নিয়ম
ACC_SYNTHETIC 0x1000 সোর্স কোডে সরাসরি উল্লেখ করা নেই সোর্স কোডে সরাসরি সংজ্ঞায়িত করা নেই সোর্স কোডে সরাসরি উল্লেখ করা নেই
ACC_ANNOTATION 0x2000 অ্যানোটেশন ক্লাস হিসেবে ঘোষণা করা হয়েছে    
ACC_ENUM 0x4000 এনুমারেটেড টাইপ হিসেবে ঘোষণা করা হয়েছে একটি গণনা করা মান হিসাবে ঘোষণা করা হয়েছে  
(ব্যবহার করা হয়নি) 0x8000      
ACC_CONSTRUCTOR 0x10000     কন্সট্রাক্টর পদ্ধতি (ক্লাস বা ইনস্ট্যান্স ইনিশিয়ালাইজার)
ACC_DECLARED_
SYNCHRONIZED
0x20000     synchronized ঘোষণা করা হয়েছে।

মনে রাখবেন: এটি এক্সিকিউশনের উপর কোনও প্রভাব ফেলে না (এই ফ্ল্যাগের প্রতিফলন ছাড়া, প্রতি সে)।

* শুধুমাত্র InnerClass অ্যানোটেশনের জন্য অনুমতি দেওয়া হয়, এবং class_def_item-এ কখনই ব্যবহার করা যাবে না।

পরিবর্তিত UTF-8 এনকোডিং

লেগ্যাসি সাপোর্ট সহজ করার জন্য, .dex ফর্ম্যাট এর স্ট্রিং ডেটা ডি ফ্যাক্টো স্ট্যান্ডার্ড মডিফায়েড UTF-8 ফর্ম্যাটে এনকোড করে, এর পরে সেটিকে MUTF-8 হিসেবে উল্লেখ করা হবে। এই ফর্মটি স্ট্যান্ডার্ড UTF-8-এর মতো, তবে এর মধ্যে এগুলি নেই:

  • শুধুমাত্র এক, দুই ও তিন-বাইটের এনকোডিং ব্যবহার করা হয়।
  • U+10000 … U+10ffff রেঞ্জের মধ্যে থাকা কোড পয়েন্টগুলি সারোগেট পেয়ার হিসেবে এনকোড করা হয়, যার প্রতিটি তিন-বাইট এনকোড করা ভ্যালু হিসেবে দেখানো হয়।
  • কোড পয়েন্ট U+0000 দুই-বাইট ফর্ম্যাটে এনকোড করা আছে।
  • একটি সাধারণ নাল বাইট (মান 0) একটি স্ট্রিংয়ের শেষ নির্দেশ করে, যেমনটি স্ট্যান্ডার্ড C ভাষার ব্যাখ্যায় রয়েছে।

উপরের প্রথম দুটি আইটেমকে এইভাবে সংক্ষিপ্ত করা যায়: MUTF-8 হল UTF-16-এর জন্য একটি এনকোডিং ফর্ম্যাট, এটি Unicode অক্ষরের জন্য আরও সরাসরি এনকোডিং ফর্ম্যাট নয়।

উপরের শেষ দুটি আইটেম একই সাথে স্ট্রিংয়ে কোড পয়েন্ট U+0000 যোগ করা এবং এখনও এটিকে C-স্টাইলের নাল-টার্মিনেটেড স্ট্রিং হিসেবে ম্যানিপুলেট করা সম্ভব করে তোলে।

তবে, U+0000-এর বিশেষ এনকোডিংয়ের অর্থ হল, সাধারণ UTF-8-এর মতো, MUTF-8 স্ট্রিংয়ের পেয়ারে স্ট্যান্ডার্ড C ফাংশন strcmp() কল করার ফলাফল সবসময় অসমান স্ট্রিংয়ের তুলনা করার সঠিকভাবে সাইন করা ফলাফল নির্দেশ করে না। সাজানোর ক্রম (শুধু সমান হওয়া নয়) যখন একটি সমস্যা হয়, তখন MUTF-8 স্ট্রিং তুলনা করার সবচেয়ে সহজ উপায় হল, সেগুলিকে অক্ষর পিছু ডিকোড করা এবং ডিকোড করা মানগুলির মধ্যে তুলনা করা। (তবে, আরও বুদ্ধিদীপ্ত প্রয়োগও সম্ভব।)

অক্ষর এনকোডিং সম্পর্কে আরও তথ্যের জন্য Unicode Standard দেখুন। MUTF-8 আসলে UTF-8-এর তুলনায় (তুলনামূলকভাবে কম পরিচিত) এনকোডিং CESU-8-এর বেশি কাছাকাছি।

encoded_value এনকোডিং

annotation_element ও encoded_array_item-এ এম্বেড করা আছে

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

নাম ফর্ম্যাট বর্ণনা
(value_arg << 5) | value_type ubyte বাইট যা অবিলম্বে পরবর্তী value-এর ধরন নির্দেশ করে উচ্চ-ক্রমের তিনটি বিটে ঐচ্ছিক স্পষ্টীকরণ যুক্তি সহ। value-এর বিভিন্ন সংজ্ঞা নিচে দেখুন। বেশিরভাগ ক্ষেত্রে, value_arg-এ value-এর ঠিক পরের value-এর দৈর্ঘ্য বাইটে এনকোড করা হয়, যেমন (size - 1), যেমন, 0-এর অর্থ হল ভ্যালুর জন্য এক বাইট প্রয়োজন এবং 7-এর অর্থ হল এর জন্য আট বাইট প্রয়োজন; তবে, নিচে উল্লেখ করা ব্যতিক্রমগুলি রয়েছে।
মান ubyte[] ভ্যালু, দৈর্ঘ্যে পরিবর্তনশীল এবং আলাদা আলাদা value_type বাইটের জন্য আলাদাভাবে ব্যাখ্যা করা হয়, যদিও সর্বদা লিটল-এন্ডিয়ান। বিবরণের জন্য নিচে দেওয়া বিভিন্ন ভ্যালুর সংজ্ঞা দেখুন।

ভ্যালু ফর্ম্যাট

নাম লিখুন value_type value_arg ফর্ম্যাট value ফর্ম্যাট বর্ণনা
VALUE_BYTE 0x00 (কোনওটিই নয়; 0 হতে হবে) ubyte[1] স্বাক্ষরিত এক-বাইট পূর্ণসংখ্যা মান
VALUE_SHORT 0x02 সাইজ - ১ (০…১) ubyte[size] স্বাক্ষরিত দুই-বাইট পূর্ণসংখ্যা মান, সাইন-এক্সটেন্ডেড
VALUE_CHAR 0x03 সাইজ - ১ (০…১) ubyte[size] আনসাইনড টু-বাইট ইন্টিজার ভ্যালু, শূন্য-এক্সটেন্ডেড
VALUE_INT 0x04 সাইজ - ১ (০…৩) ubyte[size] স্বাক্ষরিত চার-বাইট পূর্ণসংখ্যা মান, সাইন-এক্সটেন্ডেড
VALUE_LONG 0x06 সাইজ - ১ (০…৭) ubyte[size] চিহ্নিত আট-বাইট পূর্ণসংখ্যার মান, চিহ্ন-বর্ধিত
VALUE_FLOAT 0x10 সাইজ - ১ (০…৩) ubyte[size] চার-বাইট বিট প্যাটার্ন, শূন্য-এক্সটেন্ডেড ডানদিকে এবং IEEE754 ৩২-বিট ফ্লোটিং পয়েন্ট ভ্যালু হিসেবে ব্যাখ্যা করা হয়
VALUE_DOUBLE 0x11 সাইজ - ১ (০…৭) ubyte[size] এইট-বাইট বিট প্যাটার্ন, শূন্য-এক্সটেন্ডেড ডানদিকে এবং IEEE754 64-বিট ফ্লোটিং পয়েন্ট ভ্যালু হিসেবে ব্যাখ্যা করা হয়
VALUE_METHOD_TYPE 0x15 সাইজ - ১ (০…৩) ubyte[size] আনসাইনড (জিরো-এক্সটেন্ডেড) চার-বাইট পূর্ণসংখ্যা মান, proto_ids বিভাগের মধ্যে একটি ইন্ডেক্স হিসেবে ব্যাখ্যা করা হয় এবং একটি মেথড টাইপ মানকে উপস্থাপন করে
VALUE_METHOD_HANDLE 0x16 সাইজ - ১ (০…৩) ubyte[size] আনসাইনড (জিরো-এক্সটেন্ডেড) চার-বাইট পূর্ণসংখ্যা মান, method_handles বিভাগের মধ্যে ইনডেক্স হিসেবে ব্যাখ্যা করা হয় এবং একটি মেথড হ্যান্ডেল মানকে উপস্থাপন করে
VALUE_STRING 0x17 সাইজ - ১ (০…৩) ubyte[size] চিহ্নিত নয় এমন (শূন্য-বর্ধিত) চার-বাইট পূর্ণসংখ্যা মান, string_ids বিভাগে ইনডেক্স হিসেবে ব্যাখ্যা করা হয়েছে এবং স্ট্রিং মান হিসেবে দেখানো হয়েছে
VALUE_TYPE 0x18 সাইজ - ১ (০…৩) ubyte[size] আনসাইনড (জিরো-এক্সটেন্ডেড) চার-বাইট পূর্ণসংখ্যা মান, type_ids বিভাগে ইনডেক্স হিসেবে ব্যাখ্যা করা হয়েছে এবং রিফ্লেক্টিভ টাইপ/ক্লাস মানকে উপস্থাপন করে
VALUE_FIELD 0x19 সাইজ - ১ (০…৩) ubyte[size] আনসাইনড (জিরো-এক্সটেন্ডেড) চার-বাইট পূর্ণসংখ্যা মান, field_ids বিভাগে ইনডেক্স হিসেবে ব্যাখ্যা করা হয়েছে এবং একটি রিফ্লেক্টিভ ফিল্ড ভ্যালু উপস্থাপন করে
VALUE_METHOD 0x1a সাইজ - ১ (০…৩) ubyte[size] আনসাইনড (জিরো-এক্সটেন্ডেড) চার-বাইট পূর্ণসংখ্যা মান, method_ids বিভাগে ইনডেক্স হিসেবে ব্যাখ্যা করা হয়েছে এবং একটি রিফ্লেক্টিভ মেথড ভ্যালু উপস্থাপন করে
VALUE_ENUM 0x1b সাইজ - ১ (০…৩) ubyte[size] চিহ্নিত নয় এমন (শূন্য-বর্ধিত) চার-বাইট পূর্ণসংখ্যা মান, field_ids বিভাগে সূচক হিসেবে ব্যাখ্যা করা হয়েছে এবং একটি গণনা করা প্রকার ধ্রুবকের মান উপস্থাপন করে
VALUE_ARRAY 0x1c (কোনওটিই নয়; 0 হতে হবে) encoded_array নিচে দেওয়া "encoded_array ফর্ম্যাট" অনুযায়ী ভ্যালুর একটি অ্যারে। value-এর সাইজ এনকোডিংয়ে অন্তর্নিহিত থাকে।
VALUE_ANNOTATION 0x1d (কোনওটিই নয়; 0 হতে হবে) encoded_annotation নিচে দেওয়া "encoded_annotation ফর্ম্যাট" অনুযায়ী একটি সাব-অ্যানোটেশন। value-এর সাইজ এনকোডিংয়ে অন্তর্নিহিত থাকে।
VALUE_NULL 0x1e (কোনওটিই নয়; 0 হতে হবে) (কোনওটিই নয়) null রেফারেন্স ভ্যালু
VALUE_BOOLEAN 0x1f বুলিয়ান (০…১) (কিছুই নয়) এক-বিট ভ্যালু; false-এর জন্য 0 এবং true-এর জন্য 1। বিটটি value_arg-এ দেখানো হয়েছে।

encoded_array ফর্ম্যাট

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

encoded_annotation ফর্ম্যাট

নাম ফর্ম্যাট বর্ণনা
type_idx uleb128 অ্যানোটেশনের ধরন। এটি অবশ্যই একটি ক্লাস (অ্যারে বা প্রিমিটিভ নয়) টাইপ হতে হবে।
সাইজ uleb128 এই অ্যানোটেশনে নাম-ভ্যালু ম্যাপিংয়ের সংখ্যা
এলিমেন্ট annotation_element[size] অ্যানোটেশনের এলিমেন্ট, সরাসরি ইন-লাইন (অফসেট হিসেবে নয় ) দেখানো হয়। এলিমেন্টগুলিকে অবশ্যই string_id ইনডেক্স অনুযায়ী ছোট থেকে বড় ক্রমে সাজাতে হবে।

annotation_element ফর্ম্যাট

নাম ফর্ম্যাট বর্ণনা
name_idx uleb128 এলিমেন্টের নাম, যা string_ids বিভাগে ইন্ডেক্স হিসেবে দেখানো হয়। স্ট্রিংটিকে উপরে সংজ্ঞায়িত করা MemberName-এর সিনট্যাক্স মেনে চলতে হবে।
মান encoded_value এলিমেন্টের ভ্যালু

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

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

SimpleName

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

SimpleName →
SimpleNameChar (SimpleNameChar)*
SimpleNameChar →
'A' … 'Z'
| 'a' … 'z'
| '0' … '9'
| ' ' DEX ভার্সন 040 থেকে
| '$'
| '-'
| '_'
| U+00a0 DEX ভার্সন 040 থেকে
| U+00a1 … U+1fff
| U+2000 … U+200a DEX ভার্সন 040 থেকে
| U+2010 … U+2027
| U+202f DEX ভার্সন 040 থেকে
| U+2030 … U+d7ff
| U+e000 … U+ffef
| U+10000 … U+10ffff

সদস্যের নাম

field_id_item ও method_id_item দ্বারা ব্যবহৃত

MemberName হল কোনও ক্লাসের মেম্বারের নাম, মেম্বার বলতে ফিল্ড, মেথড ও ইনার ক্লাসকে বোঝায়।

MemberName →
SimpleName
| '<' SimpleName '>'

FullClassName

FullClassName হল সম্পূর্ণভাবে উপযুক্ত ক্লাস নেম, যার মধ্যে ঐচ্ছিক প্যাকেজ স্পেসিফায়ার এবং তারপরে প্রয়োজনীয় নাম থাকে।

FullClassName →
OptionalPackagePrefix SimpleName
OptionalPackagePrefix →
(SimpleName '/')*

TypeDescriptor

type_id_item ব্যবহার করে

TypeDescriptor হল যেকোনও ধরনের উপস্থাপনা, যার মধ্যে প্রিমিটিভ, ক্লাস, অ্যারে ও void অন্তর্ভুক্ত। বিভিন্ন ভার্সনের অর্থ জানতে নিচে দেখুন।

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

ShortyDescriptor

proto_id_item ব্যবহার করে

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

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

TypeDescriptor সেম্যান্টিক্স

TypeDescriptor-এর প্রতিটি ভ্যারিয়েন্টের অর্থ এখানে দেওয়া হল।

সিনট্যাক্স অর্থ
V void; শুধুমাত্র রিটার্ন ধরনের জন্য প্রযোজ্য
জ boolean
B byte
স short
ক char
I int
জ long
ফ float
D double
Lfully/qualified/Name; ক্লাস fully.qualified.Name
[descriptor descriptor-এর অ্যারে, অ্যারে-অফ-অ্যারের জন্য রিকার্সিভভাবে ব্যবহারযোগ্য, যদিও ২৫৫টির বেশি ডাইমেনশন থাকলে তা অবৈধ।

আইটেম ও সম্পর্কিত স্ট্রাকচার

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

header_item

হেডার বিভাগে দেখা যায়

অ্যালাইনমেন্ট: ৪ বাইট

নাম ফর্ম্যাট বর্ণনা
ম্যাজিক ubyte[8] = DEX_FILE_MAGIC ম্যাজিক ভ্যালু। আরও বিবরণের জন্য "DEX_FILE_MAGIC" বিভাগের অধীনে উপরে দেওয়া আলোচনা দেখুন।
চেকসাম uint ফাইলের বাকি অংশের adler32 চেকসাম (সবকিছু কিন্তু magic এবং এই ফিল্ড); ফাইল করাপ্ট হয়েছে কিনা তা শনাক্ত করতে ব্যবহার করা হয়
স্বাক্ষর ubyte[20] ফাইলের বাকি অংশের SHA-1 সিগনেচার (হ্যাশ) (এগুলি ছাড়া সব কিছু: magic, checksum এবং এই ফিল্ড); ফাইলকে অনন্যভাবে শনাক্ত করতে ব্যবহার করা হয়
file_size uint

সম্পূর্ণ ফাইলের সাইজ (হেডার সহ), বাইটে (v40 বা এর আগের ভার্সন)

এই হেডারের শুরু থেকে পরবর্তী হেডার বা সম্পূর্ণ ফাইলের (কন্টেনার) শেষ পর্যন্ত বাইট হিসেবে দূরত্ব। (v41 বা তার পরের যেকোনও ভার্সন)

header_size uint

হেডারের সাইজ (এই সম্পূর্ণ বিভাগ), বাইটে। এর ফলে ফর্ম্যাট বাতিল না করেই কমপক্ষে সীমিত পরিমাণে ব্যাকওয়ার্ড/ফরওয়ার্ড কম্প্যাটিবিলিটি নিশ্চিত করা যায়।

0x70 (১১২) বাইট হতে হবে (v40 বা তার আগের ভার্সন)

অবশ্যই 0x78 (120) বাইট হতে হবে (v41 বা তার পরবর্তী ভার্সন)

endian_tag uint = ENDIAN_CONSTANT এন্ডিয়াননেস ট্যাগ। আরও বিবরণের জন্য "ENDIAN_CONSTANT এবং REVERSE_ENDIAN_CONSTANT" বিকল্পের অধীনে উপরে দেওয়া আলোচনা দেখুন।
link_size uint লিঙ্ক করা অংশের সাইজ অথবা 0 যদি এই ফাইলটি স্ট্যাটিক লিঙ্ক করা না থাকে
link_off uint ফাইলের শুরু থেকে লিঙ্ক বিভাগ পর্যন্ত অফসেট, অথবা 0 যদি link_size == 0 হয়। অফসেট শূন্য না হলে, link_data বিভাগে অফসেট হতে হবে। এই ডকুমেন্টে উল্লেখ করা ডেটার ফর্ম্যাট নির্দিষ্ট করা নেই; এই হেডার ফিল্ড (এবং আগেরটি) রানটাইম ইমপ্লিমেন্টেশনের ব্যবহারের জন্য হুক হিসেবে রেখে দেওয়া হয়েছে।
map_off uint ফাইলের শুরু থেকে ম্যাপ আইটেম পর্যন্ত অফসেট। অফসেট, যা অবশ্যই শূন্য নয়, তা data বিভাগে অফসেট হতে হবে, এবং ডেটা নিচে "map_list" দ্বারা নির্দিষ্ট করা ফর্ম্যাটে থাকতে হবে।
string_ids_size uint স্ট্রিং শনাক্তকারী তালিকায় স্ট্রিংয়ের সংখ্যা
string_ids_off uint ফাইলের শুরু থেকে স্ট্রিং শনাক্তকারীর তালিকার অফসেট অথবা 0 যদি string_ids_size == 0 (নিঃসন্দেহে একটি অস্বাভাবিক প্রান্তিক কেস) হয়। অফসেট শূন্য না হলে, string_ids বিভাগের শুরুতে থাকতে হবে।
type_ids_size uint টাইপ শনাক্তকারী তালিকায় এলিমেন্টের সংখ্যা, সর্বাধিক ৬৫৫৩৫
type_ids_off uint টাইপ শনাক্তকারী তালিকার জন্য ফাইলের শুরু থেকে অফসেট অথবা 0 যদি type_ids_size == 0 (নিঃসন্দেহে একটি অস্বাভাবিক প্রান্তিক কেস) হয়। অফসেট শূন্য না হলে, type_ids বিভাগের শুরুতে থাকতে হবে।
proto_ids_size uint প্রোটোটাইপ শনাক্তকারী তালিকায় এলিমেন্টের সংখ্যা, সর্বাধিক ৬৫৫৩৫
proto_ids_off uint প্রোটোটাইপ শনাক্তকারীর তালিকার জন্য ফাইলের শুরু থেকে অফসেট অথবা 0 যদি proto_ids_size == 0 (নিঃসন্দেহে একটি অস্বাভাবিক প্রান্তিক কেস) হয়। অফসেট শূন্য না হলে, proto_ids বিভাগের শুরুতে থাকতে হবে।
field_ids_size uint ফিল্ড শনাক্তকারীর তালিকায় এলিমেন্টের সংখ্যা
field_ids_off uint ফিল্ড শনাক্তকারীর তালিকার জন্য ফাইলের শুরু থেকে অফসেট, অথবা 0 যদি field_ids_size == 0 হয়। অফসেট, যদি শূন্য না হয়, তাহলে field_ids বিভাগের শুরুতে হতে হবে।
method_ids_size uint পদ্ধতি শনাক্তকারীর তালিকায় এলিমেন্টের সংখ্যা
method_ids_off uint ফাইলের শুরু থেকে মেথড শনাক্তকারীর তালিকা পর্যন্ত অফসেট অথবা 0 যদি method_ids_size == 0 হয়। অফসেট, শূন্য না হলে, method_ids বিভাগের শুরুতে থাকতে হবে।
class_defs_size uint ক্লাস ডেফিনিশন তালিকায় এলিমেন্টের সংখ্যা
class_defs_off uint ফাইলের শুরু থেকে ক্লাস ডেফিনিশন লিস্ট পর্যন্ত অফসেট, অথবা 0 যদি class_defs_size == 0 (নিঃসন্দেহে একটি অস্বাভাবিক প্রান্তিক কেস) হয়। অফসেট শূন্য না হলে, class_defs বিভাগের শুরুতে থাকতে হবে।
data_size uint

বাইটে data বিভাগের সাইজ। sizeof(uint)-এর জোড় গুণিতক হতে হবে। (v40 বা তার আগের যেকোনও ভার্সন)

ব্যবহার করা হয়নি (v41 বা তার পরের যেকোনও ভার্সন)

data_off uint

ফাইলের শুরু থেকে data বিভাগের শুরু পর্যন্ত অফসেট (v40 বা এর আগের ভার্সন)

ব্যবহার করা হয়নি (v41 বা তার পরবর্তী ভার্সন)

container_size uint

এই ফিল্ডটি নেই। এটি file_size-এর সমান বলে ধরে নেওয়া যেতে পারে। (v40 বা তার আগের যেকোনও ভার্সন)

সম্পূর্ণ ফাইলের সাইজ (অন্যান্য dex হেডার ও তাদের ডেটা সহ)। (v41 বা তার পরের যেকোনও ভার্সন)

header_offset uint

এই ফিল্ডটি নেই। এটি 0-এর সমান বলে ধরে নেওয়া যেতে পারে। (v40 বা তার আগের ভার্সন)

ফাইলের শুরু থেকে এই হেডারের শুরু পর্যন্ত অফসেট। (v41 বা তার পরের যেকোনও ভার্সন)

map_list

ডেটা বিভাগে দেখা যায়

header_item থেকে রেফার করা হয়েছে

অ্যালাইনমেন্ট: ৪ বাইট

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

নাম ফর্ম্যাট বর্ণনা
সাইজ uint তালিকার সাইজ, এন্ট্রিতে
তালিকা map_item[size] তালিকার এলিমেন্ট

map_item ফর্ম্যাট

নাম ফর্ম্যাট বর্ণনা
ধরন ushort আইটেমের ধরন; নিচের সারণী দেখুন
unused ushort (ব্যবহার করা হয়নি)
সাইজ uint নির্দেশিত অফসেটে খুঁজে পাওয়া আইটেমের সংখ্যা
অফসেট uint ফাইলের শুরু থেকে আইটেম পর্যন্ত অফসেট

কোড টাইপ করা

আইটেমের প্রকার স্থির মান আইটেমের সাইজ বাইটে
header_item TYPE_HEADER_ITEM 0x0000 0x70
string_id_item TYPE_STRING_ID_ITEM 0x0001 0x04
type_id_item TYPE_TYPE_ID_ITEM 0x0002 0x04
proto_id_item TYPE_PROTO_ID_ITEM 0x0003 0x0c
field_id_item TYPE_FIELD_ID_ITEM 0x0004 0x08
method_id_item TYPE_METHOD_ID_ITEM 0x0005 0x08
class_def_item TYPE_CLASS_DEF_ITEM 0x0006 0x20
call_site_id_item TYPE_CALL_SITE_ID_ITEM 0x0007 0x04
method_handle_item TYPE_METHOD_HANDLE_ITEM 0x0008 0x08
map_list TYPE_MAP_LIST 0x1000 ৪ + (item.size * ১২)
type_list TYPE_TYPE_LIST 0x1001 ৪ + (item.size * 2)
annotation_set_ref_list TYPE_ANNOTATION_SET_REF_LIST 0x1002 ৪ + (item.size * ৪)
annotation_set_item TYPE_ANNOTATION_SET_ITEM 0x1003 ৪ + (item.size * ৪)
class_data_item TYPE_CLASS_DATA_ITEM 0x2000 অন্তর্নিহিত; পার্স করতে হবে
code_item TYPE_CODE_ITEM 0x2001 অন্তর্নিহিত; পার্স করতেই হবে
string_data_item TYPE_STRING_DATA_ITEM 0x2002 অন্তর্নিহিত; পার্স করতেই হবে
debug_info_item TYPE_DEBUG_INFO_ITEM 0x2003 অন্তর্নিহিত; পার্স করতে হবে
annotation_item 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_id_item

string_ids বিভাগে দেখা যায়

অ্যালাইনমেন্ট: ৪ বাইট

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

string_data_item

ডেটা বিভাগে দেখা যায়

অ্যালাইনমেন্ট: কোনওটিই নয় (বাইট-অ্যালাইন করা)

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

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

type_id_item

type_ids বিভাগে দেখা যায়

অ্যালাইনমেন্ট: ৪ বাইট

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

proto_id_item

proto_ids বিভাগে দেখা যায়

অ্যালাইনমেন্ট: ৪ বাইট

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

field_id_item

field_ids বিভাগে দেখা যায়

অ্যালাইনমেন্ট: ৪ বাইট

নাম ফর্ম্যাট বর্ণনা
class_idx ushort এই ফিল্ডের ডেফাইনারের জন্য type_ids তালিকায় ইনডেক্স। এটি অবশ্যই একটি ক্লাস টাইপ হতে হবে এবং কোনও অ্যারে বা আদিম টাইপ নয়।
type_idx ushort এই ফিল্ডের ধরনের জন্য type_ids তালিকায় ইনডেক্স করুন
name_idx uint এই ফিল্ডের নামের জন্য string_ids তালিকায় ইন্ডেক্স করুন। স্ট্রিংটিকে উপরে সংজ্ঞায়িত MemberName-এর সিনট্যাক্স মেনে চলতে হবে, ।

method_id_item

method_ids বিভাগে দেখা যায়

অ্যালাইনমেন্ট: ৪ বাইট

নাম ফর্ম্যাট বর্ণনা
class_idx ushort এই পদ্ধতির সংজ্ঞাদাতার জন্য type_ids তালিকায় ইন্ডেক্স। এটি অবশ্যই ক্লাস বা অ্যারে টাইপ হতে হবে, প্রিমিটিভ টাইপ নয়।
proto_idx ushort এই পদ্ধতির প্রোটোটাইপের জন্য proto_ids তালিকায় ইন্ডেক্স করুন
name_idx uint এই পদ্ধতির নামের জন্য string_ids তালিকায় ইন্ডেক্স করুন। স্ট্রিংটিকে উপরে সংজ্ঞায়িত MemberName-এর সিনট্যাক্স মেনে চলতে হবে, ।

class_def_item

class_defs বিভাগে দেখা যায়

অ্যালাইনমেন্ট: ৪ বাইট

নাম ফর্ম্যাট বর্ণনা
class_idx uint এই ক্লাসের জন্য type_ids তালিকায় ইন্ডেক্স করুন। এটি অবশ্যই একটি ক্লাস টাইপ হতে হবে, এবং অ্যারে বা প্রিমিটিভ টাইপ নয়।
access_flags uint ক্লাসের জন্য অ্যাক্সেস ফ্ল্যাগ (public, final, ইত্যাদি)। আরও জানতে "access_flags সংজ্ঞা" দেখুন।
superclass_idx uint সুপারক্লাসের জন্য type_ids তালিকার ইনডেক্স, অথবা এই ক্লাসের কোনও সুপারক্লাস না থাকলে কনস্ট্যান্ট ভ্যালু NO_INDEX (যেমন, এটি Object-এর মতো রুট ক্লাস)। উপস্থিত থাকলে, এটি অবশ্যই ক্লাস টাইপ হতে হবে, কোনও অ্যারে বা প্রিমিটিভ টাইপ নয়।
interfaces_off uint ফাইলের শুরু থেকে ইন্টারফেসের তালিকা পর্যন্ত অফসেট অথবা 0 যদি কোনও ইন্টারফেস না থাকে। এই অফসেট data বিভাগে থাকতে হবে এবং সেখানে "type_list" বিভাগে উল্লিখিত ফর্ম্যাটে ডেটা থাকতে হবে। তালিকার প্রতিটি এলিমেন্ট অবশ্যই ক্লাস টাইপ হতে হবে (অ্যারে বা প্রিমিটিভ টাইপ নয়) এবং কোনও ডুপ্লিকেট থাকা চলবে না।
source_file_idx uint এই ক্লাসের (অন্তত বেশিরভাগ) আসল সোর্স সহ ফাইলের নামের জন্য string_ids তালিকার ইনডেক্স, অথবা এই তথ্যের অভাব বোঝাতে বিশেষ মান NO_INDEX। যেকোনও প্রদত্ত পদ্ধতির debug_info_item এই সোর্স ফাইলকে ওভাররাইড করতে পারে, তবে আশা করা হয় যে বেশিরভাগ ক্লাস শুধুমাত্র একটি সোর্স ফাইল থেকে আসবে।
annotations_off uint এই ক্লাসের জন্য ফাইলের শুরু থেকে অ্যানোটেশন স্ট্রাকচার পর্যন্ত অফসেট, অথবা এই ক্লাসে কোনও অ্যানোটেশন না থাকলে 0। এই অফসেট, শূন্য না হলে, data বিভাগে থাকতে হবে এবং সেখানে ডেটা নিচে "annotations_directory_item" দ্বারা নির্দিষ্ট করা ফর্ম্যাটে থাকতে হবে, যেখানে সব আইটেম এই ক্লাসকে ডিফাইনার হিসেবে উল্লেখ করবে।
class_data_off uint এই আইটেমের জন্য সংশ্লিষ্ট ক্লাস ডেটার জন্য ফাইলের শুরু থেকে অফসেট অথবা এই ক্লাসের জন্য কোনও ক্লাস ডেটা না থাকলে 0। (যেমন, এই ক্লাসটি মার্কার ইন্টারফেস হলে এটি হতে পারে।) অফসেট, শূন্য না হলে, data বিভাগে থাকতে হবে এবং সেখানে ডেটা নিচে "class_data_item" দ্বারা নির্দিষ্ট করা ফর্ম্যাটে থাকতে হবে, সব আইটেম এই ক্লাসকে ডিফাইনার হিসেবে উল্লেখ করবে।
static_values_off uint ফাইলের শুরু থেকে static ফিল্ডের প্রাথমিক মানের তালিকা পর্যন্ত অফসেট, অথবা কিছু না থাকলে 0 (এবং সব static ফিল্ড 0 বা null দিয়ে শুরু করতে হবে)। এই অফসেট data বিভাগে থাকতে হবে এবং সেখানে ডেটা নিচে "encoded_array_item" দ্বারা নির্দিষ্ট করা ফর্ম্যাটে থাকতে হবে। অ্যারের সাইজ এই ক্লাস দ্বারা ঘোষিত static ফিল্ডের সংখ্যার চেয়ে বড় হলে চলবে না এবং এলিমেন্টগুলি সংশ্লিষ্ট field_list-এ ঘোষিত একই ক্রমে static ফিল্ডের সাথে সম্পর্কিত। প্রতিটি অ্যারে এলিমেন্টের ধরন তার সংশ্লিষ্ট ফিল্ডের ঘোষিত ধরনের সাথে মিলতে হবে। অ্যারেতে staticটি ফিল্ডের থেকে কম এলিমেন্ট থাকলে, বাকি ফিল্ডগুলি টাইপ-উপযুক্ত 0 বা null দিয়ে শুরু করা হয়।

call_site_id_item

call_site_ids বিভাগে দেখা যায়

অ্যালাইনমেন্ট: ৪ বাইট

নাম ফর্ম্যাট বর্ণনা
call_site_off uint কল সাইট ডেফিনিশনের জন্য ফাইলের শুরু থেকে অফসেট। অফসেটটি ডেটা বিভাগে থাকতে হবে এবং সেখানে ডেটা নিচে "call_site_item" দ্বারা নির্দিষ্ট করা ফর্ম্যাটে থাকতে হবে।

call_site_item

ডেটা বিভাগে দেখা যায়

অ্যালাইনমেন্ট: কোনওটিই নয় (বাইট অ্যালাইন করা)

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

  1. একটি মেথড হ্যান্ডেল যা বুটস্ট্র্যাপ লিঙ্কার মেথড (VALUE_METHOD_HANDLE) দেখায়।
  2. একটি পদ্ধতির নাম যা বুটস্ট্র্যাপ লিঙ্কারকে সমাধান করতে হবে (VALUE_STRING)।
  3. সমাধান করতে হবে এমন পদ্ধতির নামের ধরনের সাথে সম্পর্কিত পদ্ধতির ধরন (VALUE_METHOD_TYPE)।

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

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

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

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

method_handle_item

method_handles বিভাগে দেখা যায়

অ্যালাইনমেন্ট: ৪ বাইট

নাম ফর্ম্যাট বর্ণনা
method_handle_type ushort মেথড হ্যান্ডেলের ধরন; নিচের টেবিল দেখুন
unused ushort (ব্যবহার করা হয়নি)
field_or_method_id ushort মেথড হ্যান্ডেল টাইপ অ্যাক্সেসর বা মেথড ইনভকার কিনা তার উপর নির্ভর করে ফিল্ড বা মেথড আইডি
unused ushort (ব্যবহার করা হয়নি)

মেথড হ্যান্ডেল টাইপ কোড

স্থির মান বর্ণনা
METHOD_HANDLE_TYPE_STATIC_PUT 0x00 মেথড হ্যান্ডেল হল একটি স্ট্যাটিক ফিল্ড সেটার (অ্যাক্সেসর)
METHOD_HANDLE_TYPE_STATIC_GET 0x01 মেথড হ্যান্ডেল হল একটি স্ট্যাটিক ফিল্ড গেটার (অ্যাক্সেসর)
METHOD_HANDLE_TYPE_INSTANCE_PUT 0x02 মেথড হ্যান্ডেল হল একটি ইনস্ট্যান্স ফিল্ড সেটার (অ্যাক্সেসর)
METHOD_HANDLE_TYPE_INSTANCE_GET 0x03 পদ্ধতি হ্যান্ডেল হল একটি ইনস্ট্যান্স ফিল্ড গেটার (অ্যাক্সেসর)
METHOD_HANDLE_TYPE_INVOKE_STATIC 0x04 মেথড হ্যান্ডেল হল একটি স্ট্যাটিক মেথড ইনভকার
METHOD_HANDLE_TYPE_INVOKE_INSTANCE 0x05 মেথড হ্যান্ডেল হল একটি ইনস্ট্যান্স মেথড ইনভোকার
METHOD_HANDLE_TYPE_INVOKE_CONSTRUCTOR 0x06 মেথড হ্যান্ডেল হল কনস্ট্রাক্টর মেথড ইনভকার
METHOD_HANDLE_TYPE_INVOKE_DIRECT 0x07 মেথড হ্যান্ডেল হল একটি ডাইরেক্ট মেথড ইনভোকার
METHOD_HANDLE_TYPE_INVOKE_INTERFACE 0x08 মেথড হ্যান্ডেল হল একটি ইন্টারফেস মেথড ইনভোকার

class_data_item

class_def_item থেকে রেফারেন্স করা হয়েছে

ডেটা বিভাগে দেখা যায়

অ্যালাইনমেন্ট: কোনওটিই নয় (বাইট-অ্যালাইন করা)

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

মনে রাখবেন: সব এলিমেন্টের field_id এবং method_id ইনস্ট্যান্সকে একই ডিফাইন করা ক্লাসকে রেফার করতে হবে।

encoded_field ফর্ম্যাট

নাম ফর্ম্যাট বর্ণনা
field_idx_diff uleb128 এই ফিল্ডের পরিচয় জানার জন্য field_ids তালিকায় ইন্ডেক্স (নাম ও ডেসক্রিপ্টর সহ) যা তালিকায় আগের এলিমেন্টের ইন্ডেক্স থেকে পার্থক্য হিসেবে দেখানো হয়। তালিকার প্রথম এলিমেন্টের ইনডেক্স সরাসরি দেখানো হয়।
access_flags uleb128 ফিল্ডের জন্য অ্যাক্সেস ফ্ল্যাগ (public, final, ইত্যাদি)। বিবরণের জন্য "access_flags সংজ্ঞা" দেখুন।

encoded_method ফর্ম্যাট

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

type_list

class_def_item ও proto_id_item থেকে রেফারেন্স করা হয়েছে

ডেটা বিভাগে দেখা যায়

অ্যালাইনমেন্ট: ৪ বাইট

নাম ফর্ম্যাট বর্ণনা
সাইজ uint তালিকার সাইজ, এন্ট্রিতে
তালিকা type_item[size] তালিকার এলিমেন্ট

type_item format

নাম ফর্ম্যাট বর্ণনা
type_idx ushort type_ids তালিকায় ইন্ডেক্স করা

code_item

encoded_method থেকে রেফারেন্স করা হয়েছে

ডেটা বিভাগে দেখা যায়

অ্যালাইনমেন্ট: ৪ বাইট

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

try_item ফর্ম্যাট

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

encoded_catch_handler_list ফর্ম্যাট

নাম ফর্ম্যাট বর্ণনা
সাইজ uleb128 এই তালিকার সাইজ, এন্ট্রি হিসেবে
তালিকা encoded_catch_handler[handlers_size] হ্যান্ডলার তালিকার আসল তালিকা, সরাসরি (অফসেট হিসেবে নয়) দেখানো হয়েছে, এবং ক্রম অনুযায়ী কনক্যাটেনেট করা হয়েছে

encoded_catch_handler ফর্ম্যাট

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

encoded_type_addr_pair ফর্ম্যাট

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

debug_info_item

code_item থেকে রেফারেন্স করা হয়েছে

ডেটা বিভাগে দেখা যায়

অ্যালাইনমেন্ট: কোনওটিই নয় (বাইট-অ্যালাইন করা)

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

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

হেডারটি হল:

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

বাইট কোডের মানগুলি হল:

নাম মান ফর্ম্যাট আর্গুমেন্ট বর্ণনা
DBG_END_SEQUENCE 0x00 (কোনওটিই নয়) code_item-এর জন্য ডিবাগ তথ্য সিকোয়েন্স শেষ করে
DBG_ADVANCE_PC 0x01 uleb128 addr_diff addr_diff: ঠিকানা রেজিস্টারে যোগ করার পরিমাণ পজিশন এন্ট্রি না দেখিয়েই অ্যাড্রেস রেজিস্টারকে এগিয়ে নিয়ে যায়
DBG_ADVANCE_LINE 0x02 sleb128 line_diff line_diff: লাইন রেজিস্টার পরিবর্তন করার পরিমাণ পজিশন এন্ট্রি না দেখিয়ে লাইন রেজিস্টারকে এগিয়ে নিয়ে যায়
DBG_START_LOCAL 0x03 uleb128 register_num
uleb128p1 name_idx
uleb128p1 type_idx
register_num: register that will contain local
name_idx: string index of the name
type_idx: type index of the type
বর্তমান ঠিকানায় একটি লোকাল ভেরিয়েবল প্রবর্তন করে। ভ্যালু অজানা তা বোঝাতে 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-এ উল্লেখ করা ডিফল্ট নামকে রেফার করে
বিশেষ অপকোড 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 থেকে রেফারেন্স করা হয়েছে

ডেটা বিভাগে দেখা যায়

অ্যালাইনমেন্ট: ৪ বাইট

নাম ফর্ম্যাট বর্ণনা
class_annotations_off uint ক্লাসে সরাসরি করা অ্যানোটেশন থেকে ফাইলের শুরু পর্যন্ত অফসেট অথবা 0 ক্লাসে কোনও সরাসরি অ্যানোটেশন না থাকলে। অফসেট শূন্য না হলে, সেটি data বিভাগের কোনও লোকেশন হতে হবে। ডেটার ফর্ম্যাট নিচে "annotation_set_item" দ্বারা নির্দিষ্ট করা আছে।
fields_size uint এই আইটেম দ্বারা অ্যানোটেট করা ফিল্ডের সংখ্যা
annotated_methods_size uint এই আইটেম দ্বারা অ্যানোটেট করা পদ্ধতির সংখ্যা
annotated_parameters_size uint এই আইটেম দ্বারা অ্যানোটেট করা মেথড প্যারামিটার তালিকার সংখ্যা
field_annotations field_annotation[fields_size] (ঐচ্ছিক) সম্পর্কিত ফিল্ডের অ্যানোটেশনের তালিকা। তালিকার এলিমেন্টগুলিকে field_idx অনুযায়ী ছোট থেকে বড় ক্রমে সাজাতে হবে।
method_annotations method_annotation[methods_size] (ঐচ্ছিক) সম্পর্কিত পদ্ধতি সংক্রান্ত টীকাগুলির তালিকা। তালিকার এলিমেন্টগুলিকে method_idx অনুযায়ী ছোট থেকে বড় ক্রমে সাজাতে হবে।
parameter_annotations parameter_annotation[parameters_size] (ঐচ্ছিক) সম্পর্কিত পদ্ধতি প্যারামিটার অ্যানোটেশনের তালিকা। method_idx অনুযায়ী তালিকার এলিমেন্ট ক্রমবর্ধমান ক্রমে সাজানো থাকতে হবে।

মনে রাখবেন: সব এলিমেন্টের field_id এবং method_id ইনস্ট্যান্সকে অবশ্যই একই ডিফাইনিং ক্লাসকে রেফার করতে হবে।

field_annotation ফর্ম্যাট

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

method_annotation ফর্ম্যাট

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

parameter_annotation ফর্ম্যাট

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

annotation_set_ref_list

parameter_annotations_item থেকে রেফার করা হয়েছে

ডেটা বিভাগে দেখা যায়

অ্যালাইনমেন্ট: ৪ বাইট

নাম ফর্ম্যাট বর্ণনা
সাইজ uint তালিকার সাইজ, এন্ট্রিতে
তালিকা annotation_set_ref_item[size] তালিকার এলিমেন্ট

annotation_set_ref_item format

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

annotation_set_item

annotations_directory_item, field_annotations_item, method_annotations_item এবং annotation_set_ref_item থেকে রেফার করা হয়েছে

ডেটা বিভাগে দেখা যায়

অ্যালাইনমেন্ট: ৪ বাইট

নাম ফর্ম্যাট বর্ণনা
সাইজ uint সেটের সাইজ, এন্ট্রিতে
এন্ট্রি annotation_off_item[size] সেটের এলিমেন্ট। এলিমেন্টগুলিকে অবশ্যই ছোট থেকে বড় ক্রমে সাজাতে হবে, type_idx অনুযায়ী।

annotation_off_item ফর্ম্যাট

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

annotation_item

annotation_set_item থেকে রেফারেন্স করা হয়েছে

ডেটা বিভাগে দেখা যায়

অ্যালাইনমেন্ট: কোনওটিই নয় (বাইট-অ্যালাইন করা)

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

দৃশ্যমানতা সংক্রান্ত ভ্যালু

annotation_item-এর মধ্যে visibility ফিল্ডের জন্য এইসব বিকল্প রয়েছে:

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

encoded_array_item

class_def_item থেকে রেফারেন্স করা হয়েছে

ডেটা বিভাগে দেখা যায়

অ্যালাইনমেন্ট: কোনওটিই নয় (বাইট-অ্যালাইন করা)

নাম ফর্ম্যাট বর্ণনা
মান encoded_array বাইট এনকোড করা অ্যারে ভ্যালু দেখায়, উপরে "encoded_value এনকোডিং" বিকল্পের অধীনে "encoded_array ফর্ম্যাট" দ্বারা নির্দিষ্ট করা ফর্ম্যাটে।

hiddenapi_class_data_item

এই বিভাগে প্রতিটি ক্লাসের ব্যবহার করা সীমিত ইন্টারফেস সংক্রান্ত ডেটা থাকে।

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

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

বিধিনিষেধের ফ্ল্যাগের ধরন:

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

সিস্টেম অ্যানোটেশন

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

সিস্টেম অ্যানোটেশন .dex ফাইলে VISIBILITY_SYSTEM-এ সেট করা দৃশ্যমানতা সহ অ্যানোটেশন হিসেবে দেখানো হয়।

dalvik.annotation.AnnotationDefault

অ্যানোটেশন ইন্টারফেসে পদ্ধতিতে দেখা যায়

প্রতিটি অ্যানোটেশন ইন্টারফেসে একটি AnnotationDefault অ্যানোটেশন অ্যাটাচ করা থাকে যা ডিফল্ট বাইন্ডিং নির্দেশ করে।

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

dalvik.annotation.EnclosingClass

ক্লাসে দেখা যায়

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

নাম ফর্ম্যাট বর্ণনা
মান শ্রেণী এই ক্লাসটি যে ক্লাসের সাথে আভিধানিক স্কোপের দিক থেকে সবচেয়ে কাছাকাছি

dalvik.annotation.EnclosingMethod

ক্লাসে দেখা যায়

মেথড বডির মধ্যে ডিফাইন করা প্রতিটি ক্লাসে একটি EnclosingMethod অ্যানোটেশন অ্যাটাচ করা হয়। এই অ্যানোটেশন আছে এমন প্রতিটি ক্লাসে অবশ্যই একটি InnerClass অ্যানোটেশন থাকতে হবে। এছাড়াও, কোনও ক্লাসে EnclosingClass এবং EnclosingMethod অ্যানোটেশন, দু'টিই থাকতে পারবে না।

নাম ফর্ম্যাট বর্ণনা
মান পদ্ধতি যে পদ্ধতিটি এই ক্লাসকে সবচেয়ে বেশি করে লেক্সিক্যালি স্কোপ করে

dalvik.annotation.InnerClass

ক্লাসে দেখা যায়

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

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

dalvik.annotation.MemberClasses

ক্লাসে দেখা যায়

প্রতিটি ক্লাসের সাথে একটি MemberClasses অ্যানোটেশন অ্যাটাচ করা থাকে যা মেম্বার ক্লাস ঘোষণা করে। (মেম্বার ক্লাস হল একটি ডাইরেক্ট ইনার ক্লাস যার একটি নাম আছে।)

নাম ফর্ম্যাট বর্ণনা
মান Class[] মেম্বার ক্লাসের অ্যারে

dalvik.annotation.MethodParameters

পদ্ধতিতে দেখা যায়

মনে রাখবেন: Android 7.1-এর পরে এই অ্যানোটেশন যোগ করা হয়েছে। আগের Android রিলিজগুলিতে এটি থাকলেও তা উপেক্ষা করা হবে।

MethodParameters অ্যানোটেশন ঐচ্ছিক এবং এটি প্যারামিটারের নাম ও মডিফায়ারের মতো প্যারামিটার মেটাডেটা প্রদান করতে ব্যবহার করা যেতে পারে।

রানটাইমে প্যারামিটার মেটাডেটা প্রয়োজন না হলে, কোনও পদ্ধতি বা কনস্ট্রাক্টর থেকে নিরাপদে অ্যানোটেশন বাদ দেওয়া যেতে পারে। 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-এ প্রকৃত মেথড সিগনেচারে নেই এমন টাইপ অ্যানোটেশন রিসিভার প্যারামিটার সম্পর্কে কোনও তথ্যও থাকবে না।

নাম ফর্ম্যাট বর্ণনা
নাম String[] সংশ্লিষ্ট পদ্ধতির জন্য ফর্মাল প্যারামিটারের নাম। অ্যারে ফাঁকা রাখা যাবে না, তবে কোনও ফর্মাল প্যারামিটার না থাকলে খালি রাখতে হবে। সেই ইন্ডেক্স সহ ফর্মাল প্যারামিটারের কোনও নাম না থাকলে, অ্যারের ভ্যালু অবশ্যই শূন্য হতে হবে।
প্যারামিটারের নামের স্ট্রিং খালি থাকলে অথবা '.', ';', '[' বা '/' থাকলে, রানটাইমে java.lang.reflect.MalformedParametersException থ্রো করা হবে।
accessFlags int[] সংশ্লিষ্ট পদ্ধতির জন্য ফর্মাল প্যারামিটারের অ্যাক্সেস ফ্ল্যাগ। অ্যারে অবশ্যই ফাঁকা রাখা যাবে না, তবে কোনও ফর্মাল প্যারামিটার না থাকলে অবশ্যই খালি থাকতে হবে।
মানটি হল নিম্নলিখিত মান সহ একটি বিট মাস্ক:
  • 0x0010 : final, the parameter was declared final
  • 0x1000 : সিন্থেটিক, কম্পাইলারের মাধ্যমে প্যারামিটারটি যোগ করা হয়েছে
  • 0x8000 : বাধ্যতামূলক, প্যারামিটারটি সিন্থেটিক হলেও ভাষা স্পেসিফিকেশন দ্বারাও বোঝানো হয়
এই সেটের বাইরে কোনও বিট সেট করা থাকলে, রানটাইমে একটি java.lang.reflect.MalformedParametersException থ্রো করা হবে।

dalvik.annotation.Signature

ক্লাস, ফিল্ড ও পদ্ধতিতে দেখা যায়

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

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

নাম ফর্ম্যাট বর্ণনা
মান String[] এই ক্লাস বা মেম্বারের স্বাক্ষর, স্ট্রিংয়ের অ্যারে হিসেবে যা একসাথে কনক্যাটিনেট করতে হবে

dalvik.annotation.Throws

পদ্ধতিতে দেখা যায়

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

নাম ফর্ম্যাট বর্ণনা
মান Class[] নিক্ষিপ্ত ব্যতিক্রমের ধরনের অ্যারে