এই ডকুমেন্টে .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 হিসেবে |
|---|---|---|---|
| ০০ | 0 | 0 | -1 |
| ০১ | 1 | 1 | 0 |
| 7f | -1 | 127 | 126 |
| 80 7f | -128 | 16256 | 16255 |
ফাইল লেআউট
| নাম | ফর্ম্যাট | বর্ণনা |
|---|---|---|
| হেডার | header_item | হেডার |
| string_ids | string_id_item[] | স্ট্রিং শনাক্তকারীর তালিকা। এই ফাইলে ব্যবহৃত সব স্ট্রিংয়ের জন্য এগুলি হল শনাক্তকারী, যা ইন্টার্নাল নামকরণের জন্য (যেমন, টাইপ ডেসক্রিপ্টর) অথবা কোড দ্বারা রেফার করা কনস্ট্যান্ট অবজেক্ট হিসেবে ব্যবহার করা হয়। এই তালিকাটি UTF-16 কোড পয়েন্ট ভ্যালু (লোকেল-সংবেদনশীল পদ্ধতিতে নয়) ব্যবহার করে স্ট্রিং কন্টেন্ট অনুযায়ী সাজাতে হবে এবং এতে কোনও ডুপ্লিকেট এন্ট্রি থাকলে চলবে না। |
| type_ids | type_id_item[] | শনাক্তকারীর ধরন সংক্রান্ত তালিকা। এই ফাইলে উল্লেখ করা সব ধরনের (ক্লাস,
অ্যারে বা প্রিমিটিভ ধরন) শনাক্তকারী এগুলি, ফাইলে উল্লেখ করা
থাকুক বা না থাকুক। এই তালিকাটি অবশ্যই string_id
ইনডেক্স অনুসারে সাজানো হতে হবে এবং এতে কোনও ডুপ্লিকেট এন্ট্রি থাকা চলবে না।
|
| proto_ids | proto_id_item[] | মেথড প্রোটোটাইপ শনাক্তকারীর তালিকা। এই ফাইলে উল্লেখ করা সব
প্রোটোটাইপের জন্য এগুলি হল শনাক্তকারী। এই তালিকাটি অবশ্যই
রিটার্ন-টাইপ (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_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 |
বাইটে ব্যবহার করা হয়নি (v41 বা তার পরের যেকোনও ভার্সন) |
| data_off | uint |
ফাইলের শুরু থেকে ব্যবহার করা হয়নি (v41 বা তার পরবর্তী ভার্সন) |
| container_size | uint |
এই ফিল্ডটি নেই। এটি সম্পূর্ণ ফাইলের সাইজ (অন্যান্য dex হেডার ও তাদের ডেটা সহ)। (v41 বা তার পরের যেকোনও ভার্সন) |
| header_offset | uint |
এই ফিল্ডটি নেই। এটি ফাইলের শুরু থেকে এই হেডারের শুরু পর্যন্ত অফসেট। (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 সারোগেট কোড ইউনিটের (অর্থাৎ,
|
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 যার এলিমেন্টগুলি বুটস্ট্র্যাপ লিঙ্কার পদ্ধতিতে প্রদান করা আর্গুমেন্টের সাথে সম্পর্কিত। প্রথম তিনটি আর্গুমেন্ট হল:
- একটি মেথড হ্যান্ডেল যা বুটস্ট্র্যাপ লিঙ্কার মেথড (VALUE_METHOD_HANDLE) দেখায়।
- একটি পদ্ধতির নাম যা বুটস্ট্র্যাপ লিঙ্কারকে সমাধান করতে হবে (VALUE_STRING)।
- সমাধান করতে হবে এমন পদ্ধতির নামের ধরনের সাথে সম্পর্কিত পদ্ধতির ধরন (VALUE_METHOD_TYPE)।
অতিরিক্ত আর্গুমেন্ট হল বুটস্ট্র্যাপ লিঙ্কার পদ্ধতিতে পাস করা ধ্রুবক মান। এইসব আর্গুমেন্ট ক্রম অনুযায়ী এবং কোনও ধরনের কনভার্সন ছাড়াই পাস করা হয়।
বুস্ট্র্যাপ লিঙ্কার পদ্ধতির প্রতিনিধিত্বকারী মেথড হ্যান্ডেলের রিটার্ন টাইপ java.lang.invoke.CallSite হতে হবে। প্রথম তিনটি প্যারামিটারের ধরন হল:
java.lang.invoke.Lookupjava.lang.Stringjava.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 localname_idx: string index of the nametype_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 অপকোড ব্যবহার করে আরও
দক্ষতার সাথে উপস্থাপন করা যেতে পারে।)
মনে রাখবেন: স্বাক্ষর ম্যানেজ করার বিষয়ে
সতর্কতা সম্পর্কে জানতে নিচে
" |
| 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[] | সংশ্লিষ্ট পদ্ধতির জন্য ফর্মাল প্যারামিটারের অ্যাক্সেস ফ্ল্যাগ। অ্যারে
অবশ্যই ফাঁকা রাখা যাবে না, তবে কোনও ফর্মাল প্যারামিটার না থাকলে অবশ্যই খালি থাকতে হবে। মানটি হল নিম্নলিখিত মান সহ একটি বিট মাস্ক:
java.lang.reflect.MalformedParametersException থ্রো করা হবে।
|
dalvik.annotation.Signature
ক্লাস, ফিল্ড ও পদ্ধতিতে দেখা যায়
Signature অ্যানোটেশন প্রতিটি ক্লাস,
ফিল্ড বা পদ্ধতির সাথে যুক্ত থাকে, যা type_id_item-এর মাধ্যমে
প্রতিনিধিত্ব করা যায় এমন কোনও জটিল ধরনের মাধ্যমে সংজ্ঞায়িত করা হয়। .dex ফর্ম্যাটটি স্বাক্ষরের ফর্ম্যাটকে সংজ্ঞায়িত করে না; এটি
কেবলমাত্র সেই ভাষার শব্দার্থের সফল বাস্তবায়নের জন্য একটি সোর্স
ভাষার প্রয়োজনীয় স্বাক্ষরগুলিকে উপস্থাপন করতে সক্ষম হওয়ার জন্য
উদ্দেশ্য করা হয়েছে। এই কারণে, ভার্চুয়াল মেশিন ইমপ্লিমেন্টেশনের মাধ্যমে সাধারণত সিগনেচার পার্স (বা যাচাই) করা হয় না।
সিগনেচারগুলি শুধুমাত্র
উচ্চ-লেভেলের API এবং টুলে (যেমন, ডিবাগার) হ্যান্ড-অফ করা হয়। তাই, সিগনেচারের যেকোনও ব্যবহার এমনভাবে লেখা উচিত যাতে শুধুমাত্র বৈধ সিগনেচার পাওয়ার ব্যাপারে কোনও অনুমান না করা হয়, সিনট্যাক্সগতভাবে অবৈধ সিগনেচার পাওয়ার সম্ভাবনা থেকে নিজেকে স্পষ্টভাবে রক্ষা করা হয়।
সিগনেচার স্ট্রিংয়ে অনেক ডুপ্লিকেট কন্টেন্ট থাকে বলে,
Signature অ্যানোটেশনকে স্ট্রিংয়ের অ্যারে হিসেবে
সংজ্ঞায়িত করা হয়, যেখানে ডুপ্লিকেট এলিমেন্ট স্বাভাবিকভাবেই একই
আন্ডারলায়িং ডেটাকে রেফার করে এবং সিগনেচারকে অ্যারের
সব স্ট্রিংয়ের কনক্যাটেনেশন হিসেবে ধরা হয়। কোনও স্বাক্ষরকে আলাদা স্ট্রিংয়ে কীভাবে বিভক্ত করতে হবে সেই সম্পর্কে কোনও নিয়ম নেই; এটি সম্পূর্ণভাবে .dex ফাইল জেনারেট করা টুলের উপর নির্ভর করে।
| নাম | ফর্ম্যাট | বর্ণনা |
|---|---|---|
| মান | String[] | এই ক্লাস বা মেম্বারের স্বাক্ষর, স্ট্রিংয়ের অ্যারে হিসেবে যা একসাথে কনক্যাটিনেট করতে হবে |
dalvik.annotation.Throws
পদ্ধতিতে দেখা যায়
এক বা একাধিক ব্যতিক্রমের ধরন থ্রো করার জন্য ঘোষণা করা প্রতিটি পদ্ধতির সাথে একটি Throws অ্যানোটেশন যুক্ত করা হয়।
| নাম | ফর্ম্যাট | বর্ণনা |
|---|---|---|
| মান | Class[] | নিক্ষিপ্ত ব্যতিক্রমের ধরনের অ্যারে |