d8

d8 یک ابزار خط فرمان است که Android Studio و پلاگین Android Gradle برای کامپایل بایت کد جاوا پروژه شما به بایت کد DEX که روی دستگاه های اندرویدی اجرا می شود، استفاده می کنند. d8 به شما امکان می دهد از ویژگی های زبان جاوا 8 در کد برنامه خود استفاده کنید.

d8 همچنین به عنوان یک ابزار مستقل در Android Build Tools نسخه 28.0.1 و بالاتر گنجانده شده است: android_sdk /build-tools/ version / .

استفاده عمومی

d8 فقط به یک مسیر به بایت کد جاوا کامپایل شده نیاز دارد که می خواهید آن را به بایت کد DEX تبدیل کنید. به عنوان مثال:

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

بایت کد ورودی می تواند در هر ترکیبی از فایل ها یا کانتینرهای *.class مانند فایل های JAR، APK یا ZIP باشد. همچنین می‌توانید فایل‌های DEX را برای d8 اضافه کنید تا در خروجی DEX ادغام شوند، که هنگام اضافه کردن خروجی از یک ساخت افزایشی مفید است.

به طور پیش‌فرض، d8 بایت کد جاوا را در فایل‌های DEX بهینه‌سازی شده کامپایل می‌کند و شامل اطلاعات اشکال‌زدایی می‌شود که می‌توانید برای اشکال‌زدایی کد خود در طول زمان اجرا استفاده کنید. با این حال، می‌توانید پرچم‌های اختیاری را برای اجرای یک ساخت افزایشی اضافه کنید، کلاس‌هایی را مشخص کنید که باید در فایل اصلی DEX کامپایل شوند، و مسیرهای منابع اضافی مورد نیاز برای استفاده از ویژگی‌های زبان جاوا 8 را مشخص کنید.

d8 path-to-input-files [options]

جدول زیر پرچم‌های اختیاری را که می‌توانید با d8 استفاده کنید، توضیح می‌دهد:

گزینه توضیحات
--debug

بایت کد DEX را کامپایل کنید تا اطلاعات اشکال زدایی مانند جداول نماد اشکال زدایی را شامل شود.

این گزینه به صورت پیش فرض فعال است. برای گنجاندن اطلاعات اشکال زدایی در بایت کد DEX، d8 انتظار دارد که بایت کد جاوا ورودی شامل آن اطلاعات باشد. به عنوان مثال، اگر javac برای کامپایل کد خود استفاده می کنید، باید پرچم -g را ارسال کنید تا اطلاعات اشکال زدایی در بایت کد خروجی جاوا گنجانده شود.

هنگام کامپایل فایل‌های DEX برای نسخه انتشار برنامه یا کتابخانه خود، به جای آن از پرچم --release استفاده کنید.

--release

بایت کد DEX را بدون اطلاعات اشکال زدایی کامپایل کنید. با این حال، d8 شامل برخی از اطلاعات است که هنگام ایجاد stacktraces و ثبت استثناها استفاده می شود.

هنگام کامپایل بایت کد برای انتشار عمومی، این پرچم را پاس کنید.

--output path

مسیر مورد نظر را برای خروجی DEX مشخص کنید. به طور پیش فرض، d8 فایل(های) DEX را در دایرکتوری کاری فعلی خروجی می دهد.

اگر مسیر و نام یک فایل ZIP یا JAR را مشخص کنید، d8 فایل مشخص شده را ایجاد می کند و شامل فایل های خروجی DEX می شود. اگر مسیر یک دایرکتوری موجود را مشخص کنید، d8 فایل های DEX را در آن دایرکتوری خروجی می دهد.

--lib android_sdk /platforms/ api-level /android.jar مسیر android.jar SDK Android خود را مشخص کنید. این پرچم هنگام کامپایل بایت کدی که از ویژگی های زبان جاوا 8 استفاده می کند لازم است.
--classpath path منابع classpath را که d8 برای کامپایل کردن فایل های DEX پروژه شما نیاز دارد، مشخص کنید. به طور خاص، d8 نیاز دارد که هنگام کامپایل بایت کدی که از ویژگی های زبان جاوا 8 استفاده می کند، منابع خاصی را مشخص کنید.
--min-api number حداقل سطح API را که می‌خواهید فایل‌های DEX خروجی پشتیبانی کنند، مشخص کنید.
--intermediate این پرچم را پاس دهید تا به d8 بفهمانید که مجموعه کامل بایت کد جاوا پروژه خود را کامپایل نمی کنید. این پرچم هنگام اجرای ساخت های افزایشی مفید است. d8 به جای کامپایل کردن فایل‌های DEX بهینه‌شده‌ای که انتظار دارید روی دستگاه اجرا شوند، فایل‌های DEX میانی ایجاد می‌کند و آنها را در خروجی یا مسیر پیش‌فرض مشخص شده ذخیره می‌کند.

وقتی می‌خواهید فایل‌های DEX را که می‌خواهید روی دستگاهی اجرا کنید کامپایل کنید، این پرچم را حذف کنید و مسیر کلاس‌های DEX میانی را به عنوان ورودی مشخص کنید.

--file-per-class

هر کلاس را در فایل های جداگانه DEX کامپایل کنید.

فعال کردن این پرچم به شما امکان می دهد با کامپایل مجدد فقط کلاس هایی که تغییر کرده اند، ساخت های افزایشی بیشتری انجام دهید. هنگام اجرای ساخت های افزایشی با استفاده از افزونه Android Gradle، این بهینه سازی به طور پیش فرض فعال است.

شما نمی توانید از این پرچم استفاده کنید در حالی که --main-dex-list نیز مشخص می کنید.

--no-desugaring ویژگی های زبان جاوا 8 را غیرفعال کنید. فقط در صورتی از این پرچم استفاده کنید که قصد کامپایل بایت کد جاوا را ندارید که از ویژگی های زبان جاوا 8 استفاده می کند.
--main-dex-list path

یک فایل متنی را مشخص کنید که کلاس‌های d8 را فهرست می‌کند، باید در فایل اصلی DEX، که معمولا classes.dex نام دارد، گنجانده شود. وقتی لیستی از کلاس‌ها را با استفاده از این پرچم مشخص نمی‌کنید، d8 تضمین نمی‌کند که کدام کلاس‌ها در فایل اصلی DEX گنجانده شده‌اند.

از آنجایی که سیستم اندروید هنگام راه‌اندازی برنامه، ابتدا فایل اصلی DEX را بارگیری می‌کند، می‌توانید از این پرچم برای اولویت‌بندی کلاس‌های خاص در هنگام راه‌اندازی با کامپایل کردن آن‌ها در فایل اصلی DEX استفاده کنید. این به ویژه در هنگام پشتیبانی از multidex قدیمی مفید است، زیرا فقط کلاس‌ها در فایل اصلی DEX در زمان اجرا در دسترس هستند تا زمانی که کتابخانه multidex قدیمی بارگیری شود.

به خاطر داشته باشید که هر فایل DEX همچنان باید محدودیت مرجع 64K را برآورده کند. بنابراین، کلاس های زیادی را برای فایل اصلی DEX تعیین نکنید، یا با خطای کامپایل مواجه می شوید. به‌طور پیش‌فرض، هنگام تعیین کلاس‌ها با استفاده از --main-dex-list ، d8 فقط آن دسته‌ها را در فایل اصلی DEX شامل می‌شود. این کار به این دلیل است که مشکلات مربوط به کلاس های گم شده از فایل اصلی DEX را برای اشکال زدایی آسان تر کند. اگر حالت --release را مشخص کنید، d8 سعی می‌کند تعداد فایل‌های DEX را که در نسخه انتشاری برنامه شما بسته‌بندی شده‌اند، با گنجاندن هرچه بیشتر کلاس‌های دیگر در فایل اصلی DEX تا زمانی که محدودیت 64K برآورده شود، کاهش دهد.

شما نمی توانید از این پرچم استفاده کنید و در عین حال --file-per-class را نیز مشخص کنید.

--pg-map file file به عنوان یک فایل نگاشت برای توزیع استفاده کنید.
--file-per-class-file

یک فایل DEX جداگانه در هر فایل .class ورودی تولید کنید.

کلاس های مصنوعی را با کلاس اصلی خود نگه دارید.

--desugared-lib file

یک پیکربندی کتابخانه desugared را مشخص کنید.

file یک فایل پیکربندی کتابخانه بدون قند در قالب JSON است.

--main-dex-rules file Proguard قوانینی را برای قرار دادن کلاس ها در فایل اصلی 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 را به اجبار غیرفعال کنید. این روش مدیریت پیش‌فرض کد 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 به عنوان یک نام کلاس و به دنبال آن یک نقطه و نام متد مشخص می شود. متد handler باید یک آرگومان واحد از نوع 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 دستور دهید که فقط زیرمجموعه‌ای از بایت کد جاوا پروژه شما را کامپایل کند. برای مثال، اگر dexing برای هر کلاس را فعال کنید، می‌توانید فقط کلاس‌هایی را که از زمان ساخت قبلی تغییر داده‌اید، دوباره کامپایل کنید.

دستور زیر یک ساخت افزایشی از چند کلاس را انجام می دهد و dexing برای هر کلاس را فعال می کند. این دستور همچنین یک دایرکتوری خروجی را برای ساخت افزایشی مشخص می کند.

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 انجام دهید، همانطور که در دستور زیر نشان داده شده است. علاوه بر این، می‌توانید کلاس‌هایی را که می‌خواهید d8 در فایل اصلی DEX با استفاده از --main-dex-list کامپایل کند، مشخص کنید. از آنجایی که ورودی مجموعه‌ای از فایل‌هایی است که قبلاً در بایت کد DEX کامپایل شده‌اند، این ساخت باید سریع‌تر از یک ساخت تمیز کامل شود.

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

بایت کدی را کامپایل کنید که از ویژگی های زبان جاوا 8 استفاده می کند

d8 شما را قادر می سازد از ویژگی های زبان جاوا 8 در کد خود از طریق یک فرآیند کامپایل به نام desugaring استفاده کنید. Desugaring این ویژگی های مفید زبان را به بایت کد تبدیل می کند که می تواند بر روی پلت فرم اندروید اجرا شود.

Android Studio و پلاگین Android Gradle شامل منابع classpath هستند که d8 برای فعال کردن قند زدایی برای شما به آن نیاز دارد. با این حال، هنگام استفاده از d8 از خط فرمان، باید خودتان آنها را وارد کنید.

یکی از این منابع، android.jar از Android SDK مورد نظر شما است. این منبع شامل مجموعه ای از 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