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، هنگام کامپایل فایلهای DEX برای نسخه انتشار برنامه یا کتابخانه خود، به جای آن از پرچم |
--release | بایت کد DEX را بدون اطلاعات اشکال زدایی کامپایل کنید. با این حال، هنگام کامپایل بایت کد برای انتشار عمومی، این پرچم را پاس کنید. |
--output path | مسیر مورد نظر را برای خروجی DEX مشخص کنید. به طور پیش فرض، اگر مسیر و نام یک فایل ZIP یا JAR را مشخص کنید، |
--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، این بهینه سازی به طور پیش فرض فعال است. شما نمی توانید از این پرچم استفاده کنید در حالی که |
--no-desugaring | ویژگی های زبان جاوا 8 را غیرفعال کنید. فقط در صورتی از این پرچم استفاده کنید که قصد کامپایل بایت کد جاوا را ندارید که از ویژگی های زبان جاوا 8 استفاده می کند. |
--main-dex-list path | یک فایل متنی را مشخص کنید که کلاسهای از آنجایی که سیستم اندروید هنگام راهاندازی برنامه، ابتدا فایل اصلی DEX را بارگیری میکند، میتوانید از این پرچم برای اولویتبندی کلاسهای خاص در هنگام راهاندازی با کامپایل کردن آنها در فایل اصلی DEX استفاده کنید. این به ویژه در هنگام پشتیبانی از multidex قدیمی مفید است، زیرا فقط کلاسها در فایل اصلی DEX در زمان اجرا در دسترس هستند تا زمانی که کتابخانه multidex قدیمی بارگیری شود. به خاطر داشته باشید که هر فایل DEX همچنان باید محدودیت مرجع 64K را برآورده کند. بنابراین، کلاس های زیادی را برای فایل اصلی DEX تعیین نکنید، یا با خطای کامپایل مواجه می شوید. بهطور پیشفرض، هنگام تعیین کلاسها با استفاده از شما نمی توانید از این پرچم استفاده کنید و در عین حال |
--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 اصلی در |
| کد ادعای تولید شده توسط javac را به اجبار فعال کنید. |
| کد ادعای تولید شده توسط javac را به اجبار غیرفعال کنید. این روش مدیریت پیشفرض کد javac در هنگام تولید فایلهای DEX است. |
| کد ادعای تولید شده توسط javac را تغییر ندهید. این روش مدیریت پیشفرض کد javac هنگام تولید فایلهای class است. |
| کد ادعای تولید شده 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
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