d8

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

تم تضمين "d8" أيضًا كأداة مستقلة في إصدار Android الأدوات 28.0.1 والإصدارات الأحدث: 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 تحديد موارد مسار الفئة التي قد تتطلّب ميزة "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 منفصل لكل ملف فئة إدخال.

الحفاظ على الصفوف الاصطناعية مع صفها الأصلي

--desugared-lib file

حدِّد إعداد مكتبة تم إلغاء إذن الوصول إليها.

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

--main-dex-rules file يحتفظ Proguard بقواعد الفصول الدراسية التي يجب وضعها في ملف 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 خلال إصدار كامل لتطبيقك.

على سبيل المثال، عند معالجة فئات lambda في Java 8، يتتبّع d8 الفئات يتم إنشاء فئات لامدا لكل فئة إدخال. أثناء عملية الإنشاء الكاملة، عند d8 تتضمن فئة في ملف DEX الرئيسي، فإنها تراجع بيانات التعريف للتأكد من أن جميع من فئات لامدا التي تم إنشاؤها لهذه الفئة ضمن القسم 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" والمكوّن الإضافي لنظام Gradle المتوافق مع Android يتضمنان classpath الموارد التي يتطلبها 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