डी8

d8 एक कमांड-लाइन टूल है, जो Android Studio और Android Gradle प्लग इन की मदद से बनाया गया है इसका इस्तेमाल, अपने प्रोजेक्ट के Java बाइटकोड को DEX बाइट कोड में कंपाइल करने के लिए करें, जो Android डिवाइसों पर. d8 आपको Java 8 भाषा सुविधाओं का उपयोग कोड पर क्लिक करें.

d8 को Android Build में स्टैंडअलोन टूल के तौर पर भी शामिल किया गया है टूल 28.0.1 और उसके बाद के वर्शन: android_sdk/build-tools/version/.

सामान्य इस्तेमाल

d8 को सिर्फ़ कंपाइल किए गए Java बाइट कोड का पाथ चाहिए जिसे आप DEX बाइटकोड में बदलना चाहते हैं. उदाहरण के लिए:

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

इनपुट बाइट कोड, *.class फ़ाइलों के किसी भी कॉम्बिनेशन में हो सकता है या कंटेनर, जैसे कि JAR, APK या ZIP फ़ाइलें. इन्हें भी शामिल किया जा सकता है d8 के लिए DEX फ़ाइलें, ताकि वे DEX आउटपुट में मर्ज हो जाएं. यह तरीका काम का है इंक्रीमेंटल बिल्ड से आउटपुट शामिल करते समय.

डिफ़ॉल्ट रूप से, d8, Java बाइटकोड को ऑप्टिमाइज़ की गई DEX फ़ाइलों में इकट्ठा करता है और इसमें डीबग की जानकारी शामिल होती है. इसे का इस्तेमाल रनटाइम के दौरान आपके कोड को डीबग करने के लिए करते हैं. हालांकि, आपके पास वैकल्पिक फ़्लैग, इंंक्रीमेंटल बिल्ड करने के लिए फ़्लैग करते हैं, तो ऐसी क्लास के बारे में बताएं जो मुख्य DEX फ़ाइल में कंपाइल किया जाना चाहिए और Java 8 भाषा सुविधाओं का उपयोग करने के लिए आवश्यक अतिरिक्त संसाधन.

d8 path-to-input-files [options]

इस टेबल में उन वैकल्पिक फ़्लैग के बारे में बताया गया है जिनका इस्तेमाल d8 के साथ किया जा सकता है:

विकल्प ब्यौरा
--debug

डीबग सिंबल जैसी डीबग जानकारी शामिल करने के लिए, DEX बाइटकोड को कंपाइल करें टेबल.

यह विकल्प, डिफ़ॉल्ट रूप से चालू होता है. अपने DEX बाइट कोड, d8 चाहता है कि इनपुट में जावा बाइटकोड वह जानकारी शामिल होती है. उदाहरण के लिए, अगर 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 SDK के android.jar का पाथ बताएं. इस फ़्लैग की ज़रूरत तब होती है, जब बाइटकोड को कंपाइल करते समय 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 फ़ाइलों में कंपाइल करें.

इस फ़्लैग को चालू करने से आप इंक्रीमेंटल बिल्ड कर सकते हैं सिर्फ़ उन क्लास को फिर से कंपाइल किया जाएगा जिनमें बदलाव हुआ है. परफ़ॉर्म करते समय इंंक्रीमेंटल बिल्ड को 'Android Gradle प्लग इन' का इस्तेमाल करके बनाया जाता है, तो यह ऑप्टिमाइज़ेशन डिफ़ॉल्ट रूप से चालू रहता है.

यह फ़्लैग करते समय भी इस फ़्लैग का इस्तेमाल नहीं किया जा सकता --main-dex-list.

--no-desugaring Java 8 भाषा सुविधाओं को अक्षम करें. इस फ़्लैग का इस्तेमाल सिर्फ़ तब करें, जब आपको का इस्तेमाल करें.
--main-dex-list path

कोई ऐसी टेक्स्ट फ़ाइल चुनें जिसमें क्लास d8 की सूची शामिल हो मुख्य DEX फ़ाइल में मौजूद होती है, जिसका नाम आम तौर पर classes.dex होता है. अगर आपने इस फ़्लैग का इस्तेमाल करके क्लास की सूची नहीं बनाई है, d8 इस बात की गारंटी नहीं देता है कि मुख्य क्लास में कौनसी क्लास शामिल की जाएंगी DEX फ़ाइल का इस्तेमाल करता है.

क्योंकि शुरू करते समय Android सिस्टम मुख्य DEX फ़ाइल को सबसे पहले लोड करता है है, तो आप स्टार्टअप पर कुछ क्लास को प्राथमिकता देने के लिए इस फ़्लैग का इस्तेमाल कर सकते हैं इन्हें मुख्य DEX फ़ाइल में कंपाइल करके. यह खास तौर पर काम का है लेगसी मल्टीडेक्स के साथ काम करते हैं, क्योंकि सिर्फ़ मुख्य DEX में शामिल क्लास फ़ाइल रनटाइम के दौरान तब तक उपलब्ध रहती है, जब तक कि लेगसी मल्टीडेक्स लाइब्रेरी लोड हो गया.

ध्यान रखें कि हर DEX फ़ाइल को अब भी 64K में पहचान फ़ाइलाें की सीमा तय की गई है. इसलिए, ऐसा न करें मुख्य DEX फ़ाइल के लिए कई क्लास शामिल करें या आपको कंपाइल करने में गड़बड़ी हुई. डिफ़ॉल्ट रूप से, इसका उपयोग करके क्लास तय करते समय --main-dex-list, d8 में सिर्फ़ वे चीज़ें शामिल हैं क्लास का उपयोग करती हैं. ऐसा क्लास से जुड़ी समस्याओं को हल करने के लिए किया जाता है मुख्य DEX फ़ाइल से गायब होना, डीबग करने में आसान होता है. अगर आप तय करते हैं कि --release मोड, d8 नंबर कम करने की कोशिश करता है ऐसी DEX फ़ाइलें हैं जिन्हें आपके ऐप्लिकेशन के रिलीज़ वर्शन में पैकेज के तौर पर मुख्य DEX फ़ाइल में ज़्यादा से ज़्यादा अन्य क्लास तक शामिल होना 64K की सीमा पूरी हो गई.

यह फ़्लैग करते समय भी इस फ़्लैग का इस्तेमाल नहीं किया जा सकता --file-per-class.

--pg-map file डिस्ट्रिब्यूशन के लिए, मैपिंग फ़ाइल के तौर पर file का इस्तेमाल करें.
--file-per-class-file

हर इनपुट .class फ़ाइल के लिए अलग DEX फ़ाइल बनाएं.

सिंथेटिक क्लास को उनकी मूल क्लास के साथ बनाए रखें.

--desugared-lib file

गहरे रंग की लाइब्रेरी का कॉन्फ़िगरेशन तय करें.

file, JSON में रंगीन लाइब्रेरी की कॉन्फ़िगरेशन फ़ाइल है फ़ॉर्मैट.

--main-dex-rules file प्रोगार्ड की, लागू की जाने वाली क्लास से जुड़े नियम प्राथमिक DEX फ़ाइल का इस्तेमाल किया जाता है.
--main-dex-list-output file आउटपुट, 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 बताया गया है की तरह, क्लास के नाम के बाद डॉट और मेथड का नाम डालें. कॉन्टेंट बनाने हैंडलर तरीके में एक आर्ग्युमेंट टाइप करें 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 को मुख्य सेक्शन में इकट्ठा करना है --main-dex-list का इस्तेमाल करने वाली DEX फ़ाइल. क्योंकि इनपुट फ़ाइलों का एक सेट है पहले से ही DEX बाइटकोड में कंपाइल किया गया है, इसलिए यह बिल्ड तेज़ी से पूरा होना चाहिए एक साफ़ निर्माण की तुलना में.

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

Java 8 लैंग्वेज फ़ीचर का इस्तेमाल करने वाले बाइट कोड को कंपाइल करें

d8 आपको Java 8 भाषा सुविधाओं का इस्तेमाल करने की सुविधा देता है को इकट्ठा करने की प्रोसेस के ज़रिए अपने कोड में डालें. इस प्रोसेस को डिसयूगरिंग कहते हैं. Desugaring ग्राहक में बदल सकता है भाषा की इन उपयोगी सुविधाओं को बाइटकोड में बदल देता है, जो Android पर चल सकते हैं प्लैटफ़ॉर्म.

Android Studio और 'Android Gradle प्लग इन' में क्लासपाथ शामिल होता है ऐसे संसाधन जिनके लिए d8 को आपके लिए टारगेटिंग चालू करने की ज़रूरत है. हालांकि, 'टूल' का इस्तेमाल करते समय d8 कमांड लाइन से, आपको उन्हें खुद ही शामिल करना होगा.

आपके टारगेट किए गए Android SDK से android.jar भी ऐसा ही एक संसाधन है. यह संसाधन में 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