d8

d8 হল একটি কমান্ড-লাইন টুল যা অ্যান্ড্রয়েড স্টুডিও এবং অ্যান্ড্রয়েড গ্রেডল প্লাগইন আপনার প্রোজেক্টের জাভা বাইটকোডকে DEX বাইটকোডে কম্পাইল করতে ব্যবহার করে যা অ্যান্ড্রয়েড ডিভাইসে চলে। d8 আপনাকে আপনার অ্যাপের কোডে Java 8 ভাষার বৈশিষ্ট্য ব্যবহার করতে দেয়।

অ্যান্ড্রয়েড বিল্ড টুলস 28.0.1 এবং উচ্চতর: android_sdk /build-tools/ version / -এ d8 একটি স্বতন্ত্র টুল হিসেবেও অন্তর্ভুক্ত করা হয়েছে।

সাধারণ ব্যবহার

d8 জন্য শুধুমাত্র কম্পাইল করা জাভা বাইটকোডের একটি পাথ প্রয়োজন যা আপনি DEX বাইটকোডে রূপান্তর করতে চান। উদাহরণ স্বরূপ:

d8 MyProject/app/build/intermediates/classes/debug/*/*.class

ইনপুট বাইটকোড *.class ফাইল বা পাত্রের যেকোনো সংমিশ্রণে হতে পারে, যেমন JAR, APK, বা ZIP ফাইল। আপনি DEX আউটপুটে একত্রিত করার জন্য d8 এর জন্য DEX ফাইলগুলিও অন্তর্ভুক্ত করতে পারেন, যা একটি বর্ধিত বিল্ড থেকে আউটপুট অন্তর্ভুক্ত করার সময় দরকারী।

ডিফল্টরূপে, d8 জাভা বাইটকোডকে অপ্টিমাইজ করা DEX ফাইলগুলিতে কম্পাইল করে এবং ডিবাগ তথ্য অন্তর্ভুক্ত করে যা আপনি রানটাইমের সময় আপনার কোড ডিবাগ করতে ব্যবহার করতে পারেন। যাইহোক, আপনি একটি ক্রমবর্ধমান বিল্ড সম্পাদন করতে ঐচ্ছিক পতাকাগুলি অন্তর্ভুক্ত করতে পারেন, মূল DEX ফাইলে কম্পাইল করা উচিত এমন ক্লাসগুলি নির্দিষ্ট করুন এবং Java 8 ভাষার বৈশিষ্ট্যগুলি ব্যবহার করার জন্য প্রয়োজনীয় অতিরিক্ত সংস্থানগুলির পাথগুলি নির্দিষ্ট করুন৷

d8 path-to-input-files [options]

নিম্নলিখিত সারণীতে ঐচ্ছিক পতাকাগুলি বর্ণনা করা হয়েছে যা আপনি d8 এর সাথে ব্যবহার করতে পারেন:

অপশন বর্ণনা
--debug

ডিবাগ তথ্য, যেমন ডিবাগ প্রতীক টেবিল অন্তর্ভুক্ত করতে DEX বাইটকোড কম্পাইল করুন।

এই বিকল্পটি ডিফল্টরূপে সক্রিয় করা হয়। আপনার DEX বাইটকোডে ডিবাগ তথ্য অন্তর্ভুক্ত করতে, d8 আশা করে যে ইনপুট জাভা বাইটকোড সেই তথ্য অন্তর্ভুক্ত করে। উদাহরণস্বরূপ, আপনি যদি আপনার কোড কম্পাইল করতে javac ব্যবহার করেন, তাহলে আউটপুট জাভা বাইটকোডে ডিবাগ তথ্য অন্তর্ভুক্ত করার জন্য আপনাকে -g পতাকা পাস করতে হবে।

আপনার অ্যাপ বা লাইব্রেরির রিলিজ সংস্করণের জন্য DEX ফাইল কম্পাইল করার সময়, পরিবর্তে --release পতাকা ব্যবহার করুন।

--release

ডিবাগ তথ্য ছাড়াই DEX বাইটকোড কম্পাইল করুন। যাইহোক, d8 কিছু তথ্য রয়েছে যা স্ট্যাকট্রেস এবং লগিং ব্যতিক্রম তৈরি করার সময় ব্যবহৃত হয়।

পাবলিক রিলিজের জন্য বাইটকোড কম্পাইল করার সময় এই পতাকাটি পাস করুন।

--output path

DEX আউটপুট জন্য পছন্দসই পথ নির্দিষ্ট করুন. ডিফল্টরূপে, d8 বর্তমান কার্যকারী ডিরেক্টরিতে DEX ফাইল(গুলি) আউটপুট করে।

আপনি যদি একটি ZIP বা JAR ফাইলের একটি পথ এবং নাম উল্লেখ করেন, d8 নির্দিষ্ট ফাইল তৈরি করে এবং আউটপুট DEX ফাইলগুলিকে অন্তর্ভুক্ত করে। যদি আপনি একটি বিদ্যমান ডিরেক্টরির পাথ নির্দিষ্ট করেন, d8 সেই ডিরেক্টরিতে DEX ফাইলগুলিকে আউটপুট করে।

--lib android_sdk /platforms/ api-level /android.jar আপনার Android SDK-এর android.jar এর পথ নির্দিষ্ট করুন৷ জাভা 8 ভাষার বৈশিষ্ট্য ব্যবহার করে বাইটকোড কম্পাইল করার সময় এই পতাকাটির প্রয়োজন হয়।
--classpath path আপনার প্রকল্পের DEX ফাইলগুলি কম্পাইল করার জন্য d8 প্রয়োজন হতে পারে এমন ক্লাসপাথ সংস্থানগুলি নির্দিষ্ট করুন৷ বিশেষ করে, d8 প্রয়োজন হয় যে বাইটকোড কম্পাইল করার সময় আপনি নির্দিষ্ট রিসোর্স নির্দিষ্ট করুন যা Java 8 ভাষার বৈশিষ্ট্য ব্যবহার করে
--min-api number ন্যূনতম API স্তর নির্দিষ্ট করুন যা আপনি আউটপুট DEX ফাইলগুলিকে সমর্থন করতে চান৷
--intermediate d8 কে জানাতে এই পতাকাটি পাস করুন যে আপনি আপনার প্রকল্পের জাভা বাইটকোডের সম্পূর্ণ সেট কম্পাইল করছেন না। ক্রমবর্ধমান বিল্ডগুলি সম্পাদন করার সময় এই পতাকাটি কার্যকর। অপ্টিমাইজ করা DEX ফাইলগুলিকে কম্পাইল করার পরিবর্তে যা আপনি একটি ডিভাইসে চালানোর আশা করেন, d8 মধ্যবর্তী DEX ফাইল তৈরি করে এবং নির্দিষ্ট আউটপুট বা ডিফল্ট পাথে সেগুলি সংরক্ষণ করে।

আপনি যখন DEX ফাইলগুলিকে কম্পাইল করতে চান যা আপনি একটি ডিভাইসে চালাতে চান, তখন এই পতাকাটি বাদ দিন এবং একটি ইনপুট হিসাবে মধ্যবর্তী DEX ক্লাসের পথটি নির্দিষ্ট করুন৷

--file-per-class

প্রতিটি ক্লাসকে আলাদা DEX ফাইলে কম্পাইল করুন।

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

--main-dex-list উল্লেখ করার সময় আপনি এই পতাকাটি ব্যবহার করতে পারবেন না।

--no-desugaring Java 8 ভাষা বৈশিষ্ট্য অক্ষম করুন। এই পতাকাটি ব্যবহার করুন শুধুমাত্র যদি আপনি জাভা বাইটকোড কম্পাইল করতে চান না যা Java 8 ভাষা বৈশিষ্ট্য ব্যবহার করে।
--main-dex-list path

একটি টেক্সট ফাইল নির্দিষ্ট করুন যা ক্লাস d8 তালিকাভুক্ত করে প্রধান DEX ফাইলে অন্তর্ভুক্ত করা উচিত, যা সাধারণত classes.dex নামে পরিচিত। আপনি যখন এই পতাকা ব্যবহার করে ক্লাসের একটি তালিকা নির্দিষ্ট করবেন না, তখন d8 গ্যারান্টি দেয় না যে কোন ক্লাসগুলি প্রধান DEX ফাইলে অন্তর্ভুক্ত করা হয়েছে।

যেহেতু অ্যান্ড্রয়েড সিস্টেম আপনার অ্যাপ শুরু করার সময় প্রথমে প্রধান DEX ফাইল লোড করে, তাই আপনি মূল DEX ফাইলে কম্পাইল করে স্টার্টআপে নির্দিষ্ট ক্লাসকে অগ্রাধিকার দিতে এই পতাকা ব্যবহার করতে পারেন। লিগ্যাসি মাল্টিডেক্স সমর্থন করার সময় এটি বিশেষভাবে কার্যকর, কারণ লিগ্যাসি মাল্টিডেক্স লাইব্রেরি লোড না হওয়া পর্যন্ত রানটাইমে শুধুমাত্র প্রধান DEX ফাইলের ক্লাসগুলি উপলব্ধ থাকে।

মনে রাখবেন, প্রতিটি DEX ফাইলকে এখনও 64K রেফারেন্স সীমা পূরণ করতে হবে। সুতরাং, প্রধান DEX ফাইলের জন্য অনেকগুলি ক্লাস নির্দিষ্ট করবেন না, অথবা আপনি একটি কম্পাইল ত্রুটি পাবেন। ডিফল্টরূপে, --main-dex-list ব্যবহার করে ক্লাস নির্দিষ্ট করার সময়, d8 প্রধান DEX ফাইলে শুধুমাত্র সেই ক্লাসগুলিকে অন্তর্ভুক্ত করে। এটি প্রধান DEX ফাইল থেকে অনুপস্থিত ক্লাস সম্পর্কিত সমস্যাগুলি ডিবাগ করা সহজ করার জন্য। আপনি যদি --release মোড নির্দিষ্ট করেন, d8 আপনার অ্যাপের রিলিজ সংস্করণে প্যাকেজ করা DEX ফাইলের সংখ্যা কমানোর চেষ্টা করে যতক্ষণ না 64K সীমা পূরণ না হয় ততক্ষণ পর্যন্ত মূল DEX ফাইলে যতটা সম্ভব অন্যান্য ক্লাস অন্তর্ভুক্ত করে।

--file-per-class নির্দিষ্ট করার সময় আপনি এই পতাকাটি ব্যবহার করতে পারবেন না।

--pg-map file বিতরণের জন্য একটি ম্যাপিং ফাইল হিসাবে file ব্যবহার করুন।
--file-per-class-file

প্রতি ইনপুট .class ফাইলের জন্য একটি আলাদা DEX ফাইল তৈরি করুন।

কৃত্রিম শ্রেণীগুলিকে তাদের উদ্ভূত শ্রেণীর সাথে রাখুন।

--desugared-lib file

একটি desugared লাইব্রেরি কনফিগারেশন নির্দিষ্ট করুন.

file হল একটি ডিসুগারেড লাইব্রেরি কনফিগারেশন ফাইল JSON ফরম্যাটে।

--main-dex-rules file প্রোগার্ড প্রাথমিক DEX ফাইলে ক্লাস রাখার নিয়ম রাখে।
--main-dex-list-output file আউটপুট ফলাফল প্রধান DEX তালিকা মধ্যে ফাইল .

--force-enable-assertions [: class_or_package_name ...]

--force-ea [: class_or_package_name ...]

জোরপূর্বক javac জেনারেটেড অ্যাসারশন কোড সক্ষম করুন।

--force-disable-assertions [: class_or_package_name ...]

--force-da [: class_or_package_name ...]

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

--force-passthrough-assertions [: class_or_package_name ...]

--force-pa [: class_or_package_name ...]

javac -generated assertion code পরিবর্তন করবেন না। class ফাইল তৈরি করার সময় এটি javac অ্যাসারশন কোডের ডিফল্ট হ্যান্ডলিং।

--force-assertions-handler: handler method [: class_or_package_name ...]

--force-ah: handler method [: class_or_package_name ...]

javac এবং kotlinc -generated assertion code পরিবর্তন করুন যাতে করে মেথড handler method ব্যবহার করে প্রতিটি অ্যাসার্টেশন ত্রুটির সাথে এটি ছুঁড়ে ফেলার পরিবর্তে। handler method একটি শ্রেণির নাম হিসাবে নির্দিষ্ট করা হয়েছে তারপরে একটি বিন্দু এবং পদ্ধতির নাম। হ্যান্ডলার পদ্ধতিতে java.lang.Throwable টাইপের একটি একক আর্গুমেন্ট নিতে হবে এবং রিটার্ন টাইপ void থাকতে হবে।
--thread-count number of threads সংকলনের জন্য ব্যবহার করার জন্য থ্রেডের সংখ্যা উল্লেখ করুন। যদি নির্দিষ্ট করা না থাকে, সংখ্যাটি হিউরিস্টিকসের উপর ভিত্তি করে, কোরের সংখ্যা বিবেচনায় নিয়ে।
--map-diagnostics[ : type ] from-level to-level type ম্যাপ ডায়াগনস্টিকস (ডিফল্ট যেকোন) from-level থেকে to-level হিসাবে রিপোর্ট করা হয়েছে, যেখানে from-level এবং to-level হল 'তথ্য', 'সতর্কতা' বা 'ত্রুটি' এবং ঐচ্ছিক type হল সহজ বা একটি ডায়াগনস্টিক এর সম্পূর্ণ যোগ্য জাভা টাইপ নাম। যদি type অনির্দিষ্ট হয়, তবে from-level সমস্ত ডায়াগনস্টিক ম্যাপ করা হয়। মনে রাখবেন যে মারাত্মক কম্পাইলার ত্রুটি ম্যাপ করা যাবে না।
--version আপনি বর্তমানে যে d8 ব্যবহার করছেন সেটি প্রিন্ট করুন।
--help d8 ব্যবহার করার জন্য সাহায্য পাঠ্য মুদ্রণ করুন।

ক্রমবর্ধমান বিল্ড সঞ্চালন

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

নিম্নলিখিত কমান্ডটি কয়েকটি ক্লাসের একটি ক্রমবর্ধমান বিল্ড সম্পাদন করে এবং প্রতি-শ্রেণীর ডেক্সিং সক্ষম করে। কমান্ডটি ক্রমবর্ধমান বিল্ডের জন্য একটি আউটপুট ডিরেক্টরিও নির্দিষ্ট করে।

d8 MainActivity.class R.class --intermediate --file-per-class --output ~/build/intermediate/dex

যখন d8 একটি ক্রমবর্ধমান বিল্ড সম্পাদন করে, তখন এটি DEX আউটপুটে অতিরিক্ত তথ্য সঞ্চয় করে। d8 পরে সেই তথ্যটি ব্যবহার করে সঠিকভাবে --main-dex-list বিকল্পটি প্রক্রিয়া করতে এবং আপনার অ্যাপের সম্পূর্ণ বিল্ডের সময় DEX ফাইলগুলিকে মার্জ করতে।

উদাহরণস্বরূপ, জাভা 8 ল্যাম্বডা ক্লাস প্রক্রিয়া করার সময়, d8 প্রতিটি ইনপুট ক্লাসের জন্য কোন ল্যাম্বডা ক্লাস তৈরি করা হয়েছে তা ট্র্যাক করে। একটি সম্পূর্ণ বিল্ডের সময়, যখন d8 প্রধান DEX ফাইলে একটি ক্লাস অন্তর্ভুক্ত করে, তখন এটি মেটাডেটার সাথে পরামর্শ করে নিশ্চিত করে যে ক্লাসের জন্য তৈরি করা সমস্ত ল্যাম্বডা ক্লাসগুলিও মূল DEX ফাইলে অন্তর্ভুক্ত করা হয়েছে।

আপনি যদি ইতিমধ্যেই একাধিক ইনক্রিমেন্টাল বিল্ড জুড়ে আপনার প্রোজেক্টের সমস্ত বাইটকোড DEX ফাইলগুলিতে কম্পাইল করে থাকেন, তাহলে নিম্নোক্ত কমান্ডে দেখানো হিসাবে মধ্যবর্তী DEX ফাইলগুলির ডিরেক্টরিকে d8 এ পাস করে একটি সম্পূর্ণ বিল্ড করুন। উপরন্তু, আপনি --main-dex-list ব্যবহার করে মূল DEX ফাইলে d8 কম্পাইল করতে চান এমন ক্লাসগুলি নির্দিষ্ট করতে পারেন। যেহেতু ইনপুটটি ফাইলগুলির একটি সেট যা ইতিমধ্যেই DEX বাইটকোডে কম্পাইল করা হয়েছে, এই বিল্ডটি একটি পরিষ্কার বিল্ডের চেয়ে দ্রুত সম্পন্ন হওয়া উচিত।

d8 ~/build/intermediate/dex --release --main-dex-list ~/build/classes.txt --output ~/build/release/dex

জাভা 8 ভাষার বৈশিষ্ট্য ব্যবহার করে বাইটকোড কম্পাইল করুন

d8 আপনাকে desugaring নামক একটি কম্পাইল প্রক্রিয়ার মাধ্যমে আপনার কোডে জাভা 8 ভাষার বৈশিষ্ট্যগুলি ব্যবহার করতে সক্ষম করে। Desugaring এই দরকারী ভাষা বৈশিষ্ট্যগুলিকে বাইটকোডে রূপান্তর করে যা Android প্ল্যাটফর্মে চলতে পারে।

অ্যান্ড্রয়েড স্টুডিও এবং অ্যান্ড্রয়েড গ্রেডল প্লাগইন ক্লাসপাথ সংস্থানগুলি অন্তর্ভুক্ত করে যা আপনার জন্য ডিসুগারিং সক্ষম করতে d8 এর প্রয়োজন৷ যাইহোক, কমান্ড লাইন থেকে d8 ব্যবহার করার সময়, আপনাকে সেগুলি নিজেকে অন্তর্ভুক্ত করতে হবে।

এরকম একটি রিসোর্স হল আপনার টার্গেট Android SDK থেকে android.jar । এই সংস্থানটিতে Android প্ল্যাটফর্ম API-এর একটি সেট অন্তর্ভুক্ত রয়েছে। --lib পতাকা ব্যবহার করে এর পথ সুনির্দিষ্ট করুন।

আরেকটি রিসোর্স হল আপনার প্রোজেক্টে কম্পাইল করা জাভা বাইটকোডের সেট যা আপনি বর্তমানে DEX বাইটকোডে কম্পাইল করছেন না কিন্তু অন্যান্য ক্লাসকে DEX বাইটকোডে কম্পাইল করতে হবে।

উদাহরণস্বরূপ, যদি আপনার কোডটি ডিফল্ট এবং স্ট্যাটিক ইন্টারফেস পদ্ধতি ব্যবহার করে, যা একটি জাভা 8 ভাষার বৈশিষ্ট্য, আপনাকে আপনার সমস্ত প্রকল্পের জাভা বাইটকোডের পথ নির্দিষ্ট করতে এই পতাকাটি ব্যবহার করতে হবে, এমনকি যদি আপনি সমস্ত কম্পাইল করতে চান না। DEX বাইটকোডে বাইটকোড। কারণ আপনার প্রজেক্টের কোড বুঝতে এবং ইন্টারফেস পদ্ধতিতে কল করার জন্য d8 এই তথ্যের প্রয়োজন।

নিম্নলিখিত কোড নমুনা একটি ডিফল্ট ইন্টারফেস পদ্ধতি অ্যাক্সেস করে এমন একটি ক্লাসের একটি ক্রমবর্ধমান বিল্ড সঞ্চালন করে:

d8 MainActivity.class --intermediate --file-per-class --output ~/build/intermediate/dex
--lib android_sdk/platforms/api-level/android.jar
--classpath ~/build/javac/debug