d8

d8 هي أداة سطر أوامر يستخدمها "استوديو Android" ومكوّن Android Gradle الإضافي لتجميع رمز بايت Java لمشروعك في رمز بايت DEX يتم تشغيله على أجهزة Android. يتيح لك d8 استخدام ميزات لغة Java 8 في التعليمات البرمجية للتطبيق.

يتم أيضًا تضمين d8 كأداة مستقلة في الإصدار 28.0.1 من "أدوات إصدار Android" والإصدارات الأحدث: android_sdk/build-tools/version/.

الاستخدام العام

لا يتطلّب d8 سوى مسار إلى رمز بايت Java المجمّع الذي تريد تحويله إلى رمز بايت DEX. مثلاً:

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

يمكن أن يكون رمز بايت الإدخال في أي مجموعة من ملفات أو حاويات *.class، مثل ملفات JAR أو APK أو ZIP. يمكنك أيضًا تضمين ملفات DEX لـ d8 لدمجها في مخرجات DEX، وهو أمر مفيد عند تضمين إخراج من إصدار تزايدي.

بشكل تلقائي، تعمل d8 على تجميع رمز بايت Java في ملفات DEX المحسَّنة وتضمين معلومات تصحيح الأخطاء التي يمكنك استخدامها لتصحيح أخطاء الرمز أثناء وقت التشغيل. ومع ذلك، يمكنك تضمين علامات اختيارية لتنفيذ إصدار تزايدي، وتحديد الفئات التي يجب تجميعها في ملف DEX الرئيسي، وتحديد المسارات إلى الموارد الإضافية المطلوبة لاستخدام ميزات لغة Java 8.

d8 path-to-input-files [options]

يوضِّح الجدول التالي العلامات الاختيارية التي يمكنك استخدامها مع d8:

Option الوصف
--debug

جمِّع رمز بايت DEX لتضمين معلومات تصحيح الأخطاء، مثل جداول رموز تصحيح الأخطاء.

يتم تفعيل هذا الخيار تلقائيًا. لتضمين معلومات تصحيح الأخطاء في رمز بايت DEX، يتوقّع d8 أنّ رمز بايت Java المُدخَل يتضمّن تلك المعلومات. على سبيل المثال، إذا كنت تستخدم javac لتجميع الرمز، عليك تمرير العلامة -g لتضمين معلومات تصحيح الأخطاء في رمز بايت Java الناتج.

عند تجميع ملفات 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.jar من حزمة تطوير البرامج (SDK) لنظام التشغيل Android. هذه العلامة مطلوبة عند تجميع رمز بايت يستخدم ميزات لغة Java 8.
--classpath path حدِّد موارد classpath التي قد يتطلبها d8 لتجميع ملفات DEX الخاصة بمشروعك. على وجه التحديد، تتطلّب السمة d8 تحديد موارد معيّنة عند تجميع رمز بايت يستخدم ميزات لغة Java 8.
--min-api number حدِّد الحد الأدنى لمستوى واجهة برمجة التطبيقات الذي تريد أن تتيحه ملفات DEX للمخرجات.
--intermediate مرِّر هذه العلامة للسماح لـ d8 بمعرفة أنّك لا تجمع المجموعة الكاملة من رمز بايت Java لمشروعك. وتكون هذه العلامة مفيدة عند تنفيذ إصدارات متزايدة. وبدلاً من تجميع ملفات DEX محسَّنة والتي تتوقّع تشغيلها على الجهاز، ينشئ d8 ملفات DEX وسيطة وتخزِّنها في مسار الإخراج أو المسار التلقائي المحدَّد.

عندما تريد تجميع ملفات DEX التي تنوي تشغيلها على أحد الأجهزة، استبعِد هذه العلامة وحدِّد المسار إلى فئات DEX الوسيطة كإدخال.

--file-per-class

جمِّع كل فئة في ملفات DEX منفصلة.

يتيح لك تفعيل هذه العلامة تنفيذ المزيد من الإصدارات الإضافية من خلال إعادة تجميع الصفوف التي تم تغييرها فقط. عند تنفيذ إصدارات متزايدة باستخدام مكوّن Gradle الإضافي لنظام التشغيل Android، يتم تفعيل هذا التحسين تلقائيًا.

لا يمكنك استخدام هذه العلامة عند تحديد --main-dex-list أيضًا.

--no-desugaring إيقاف ميزات لغة Java 8. لا تستخدم هذه العلامة إلا إذا كنت لا تنوي تجميع رمز بايت لـ Java الذي يستخدم ميزات لغة Java 8.
--main-dex-list path

حدِّد ملفًا نصيًا يسرد الفئات التي يجب أن تتضمنها d8 في ملف DEX الرئيسي، والذي يُسمى عادةً classes.dex. في حال عدم تحديد قائمة بالصفوف باستخدام هذه العلامة، لا تضمن السمة d8 الفئات التي سيتم تضمينها في ملف DEX الرئيسي.

بما أنّ نظام Android يحمّل ملف DEX الرئيسي أولاً عند بدء تطبيقك، يمكنك استخدام هذه العلامة لمنح الأولوية لفئات معيّنة عند بدء التشغيل عن طريق تجميعها في ملف DEX الرئيسي. ويكون ذلك مفيدًا على وجه الخصوص عند التوافق مع ميزة الوسائط المتعددة القديمة، لأنّ الفئات المتوفّرة في ملف DEX الرئيسي هي فقط المتاحة في وقت التشغيل إلى أن يتم تحميل المكتبة القديمة لهذه الأداة.

يُرجى العِلم أنّ كل ملف DEX يجب أن يستوفي الحدّ الأقصى لعدد الملفات المرجعية التي تبلغ 64 ألف. لذلك، لا تحدّد عددًا كبيرًا جدًا من الفئات لملف DEX الرئيسي، وإلا سيظهر خطأ في التجميع. وفقًا للإعدادات التلقائية، عند تحديد الفئات باستخدام --main-dex-list، لا يتضمّن d8 سوى هذه الفئات في ملف DEX الرئيسي. ويساهم ذلك في تسهيل تصحيح الأخطاء المتعلّقة بالصفوف التي لم يتم تضمينها في ملف DEX الرئيسي. في حال تحديد وضع --release، سيحاول d8 تقليل عدد ملفات DEX التي يتم تضمينها في إصدار تطبيقك من خلال تضمين أكبر عدد ممكن من الفئات الأخرى في ملف DEX الرئيسي إلى أن يتم بلوغ الحدّ الأقصى المسموح به، وهو 64 ألف.

لا يمكنك استخدام هذه العلامة عند تحديد --file-per-class أيضًا.

--pg-map file استخدام file كملف تعيين للتوزيع.
--file-per-class-file

أنشئ ملف DEX منفصلاً لكل ملف .class للإدخال.

احتفِظ بالصفوف الاصطناعية مع فئتها الأصلية.

--desugared-lib file

حدِّد إعدادات مكتبة مُلغاة.

file هو ملف إعداد مكتبة معدّل بتنسيق JSON.

--main-dex-rules file احتفِظ بقواعد الفئات التي يجب وضعها في ملف DEX الأساسي.
--main-dex-list-output file استخرِج قائمة DEX الرئيسية الناتجة في file.

--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 وهذه هي المعالجة التلقائية لرمز تأكيد javac عند إنشاء ملفات DEX.

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

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

لا تغيِّر رمز التأكيد الذي تم إنشاؤه باستخدام javac. هذه هي المعالجة التلقائية لرمز تأكيد javac عند إنشاء ملفات class.

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

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

ويمكنك تغيير رمز التأكيد الذي تم إنشاؤه باستخدام javac وkotlinc لاستدعاء الطريقة 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 الاختياري إما اسم نوع Java البسيط أو المؤهل بالكامل لتشخيص بيانات التشخيص. وفي حال عدم تحديد type، سيتم ربط جميع بيانات التشخيص على from-level. تجدر الإشارة إلى أنّه لا يمكن تعيين الأخطاء الفادحة في المحول البرمجي.
--version اطبع إصدار d8 الذي تستخدمه حاليًا.
--help طباعة نص المساعدة لاستخدام d8.

تنفيذ إصدارات متزايدة

لتحسين سرعات الإصدار أثناء التطوير، مثلاً لعمليات الدمج المستمر، يمكنك أن تطلب من d8 تجميع مجموعة فرعية فقط من رمز بايت Java لمشروعك. على سبيل المثال، إذا تم تفعيل الفهرسة لكل فئة، يمكنك إعادة تجميع الفئات التي عدّلتها فقط منذ الإصدار السابق.

ينفِّذ الأمر التالي إصدارًا متزايدًا من بضع فئات ويفعّل عملية فهرسة لكل فئة. يحدد الأمر أيضًا دليل إخراج للإصدار المتزايد.

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

عند تنفيذ d8 إصدار تزايدي، تخزّن معلومات إضافية في إخراج DEX. ويستخدم d8 هذه المعلومات لاحقًا لمعالجة خيار --main-dex-list ودمج ملفات DEX بشكل صحيح أثناء إنشاء إصدار كامل لتطبيقك.

على سبيل المثال، عند معالجة فئات Java 8 lambda، يتتبّع d8 فئات lambda التي تم إنشاؤها لكل فئة إدخال. خلال عملية الإنشاء الكاملة، عندما يدرج d8 فئة في ملف DEX الرئيسي، فإنّه يرجع إلى البيانات الوصفية للتأكّد من أنّ جميع فئات lambda التي تم إنشاؤها لهذه الفئة يتم تضمينها أيضًا في ملف DEX الرئيسي.

إذا سبق لك تجميع كل رمز البايت الخاص بمشروعك في ملفات DEX من خلال عدة بنيات تزايدية، عليك تنفيذ إنشاء كامل من خلال تمرير دليل ملفات DEX الوسيطة إلى d8، كما هو موضّح في الأمر التالي. بالإضافة إلى ذلك، يمكنك تحديد الفئات التي تريد من d8 تجميعها في ملفDEX الرئيسي باستخدام --main-dex-list. نظرًا لأن الإدخال عبارة عن مجموعة من الملفات التي تم تجميعها بالفعل في رمز بايت DEX، ينبغي أن يكتمل هذا الإصدار بشكل أسرع من الإصدار النظيفة.

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

تجميع رمز بايت يستخدم ميزات لغة Java 8

تتيح لك d8 استخدام ميزات لغة Java 8 في رمزك من خلال عملية تجميع تُسمى إزالة التجميع. تؤدي عملية الحذف إلى تحويل ميزات اللغة المفيدة هذه إلى رمز بايت يمكن تشغيله على نظام Android الأساسي.

يتضمّن "استوديو Android" ومكوّن Android Gradle الإضافي موارد مسار الفصل التي تتطلّبها ميزة d8 لتفعيل عملية إزالة الدرجات. ومع ذلك، عند استخدام d8 من سطر الأوامر، عليك تضمينها بنفسك.

أحد هذه الموارد هو android.jar من حزمة تطوير البرامج (SDK) لنظام التشغيل Android المستهدَف. يتضمّن هذا المورد مجموعة من واجهات برمجة التطبيقات لنظام Android. حدِّد مساره باستخدام علامة --lib.

هناك مورد آخر وهو مجموعة رموز بايت Java المجمّعة في مشروعك والتي لا يتم تجميعها حاليًا إلى رمز بايت DEX ولكن تحتاج إلى تجميع فئات أخرى إلى رمز بايت DEX.

على سبيل المثال، إذا كان الرمز البرمجي يستخدم طرق الواجهة التلقائية والثابتة، وهي ميزة خاصة بلغة Java 8، عليك استخدام هذه العلامة لتحديد المسار إلى كل رموز بايت Java الخاصة بالمشروع حتى إذا لم تكن تنوي تجميع رمز البايت بالكامل في رمز بايت 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