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 बाइट कोड, अपने ऐप्लिकेशन के रिलीज़ वर्शन के लिए DEX फ़ाइलों को कंपाइल करते समय या
लाइब्रेरी का इस्तेमाल करें, इसके बजाय |
--release
|
डीबग की जानकारी के बिना, DEX बाइटकोड को कंपाइल करें. हालांकि,
सार्वजनिक रिलीज़ के लिए बाइट कोड कंपाइल करते समय इस फ़्लैग को पास करें. |
--output path
|
DEX आउटपुट के लिए मनचाहे पाथ के बारे में बताएं. डिफ़ॉल्ट रूप से,
अगर ZIP या JAR फ़ाइल का पाथ और नाम तय किया जाता है, तो |
--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 प्लग इन' का इस्तेमाल करके बनाया जाता है, तो यह ऑप्टिमाइज़ेशन डिफ़ॉल्ट रूप से चालू रहता है. यह फ़्लैग करते समय भी इस फ़्लैग का इस्तेमाल नहीं किया जा सकता
|
--no-desugaring
|
Java 8 भाषा सुविधाओं को अक्षम करें. इस फ़्लैग का इस्तेमाल सिर्फ़ तब करें, जब आपको का इस्तेमाल करें. |
--main-dex-list path
|
कोई ऐसी टेक्स्ट फ़ाइल चुनें जिसमें क्लास क्योंकि शुरू करते समय Android सिस्टम मुख्य DEX फ़ाइल को सबसे पहले लोड करता है है, तो आप स्टार्टअप पर कुछ क्लास को प्राथमिकता देने के लिए इस फ़्लैग का इस्तेमाल कर सकते हैं इन्हें मुख्य DEX फ़ाइल में कंपाइल करके. यह खास तौर पर काम का है लेगसी मल्टीडेक्स के साथ काम करते हैं, क्योंकि सिर्फ़ मुख्य DEX में शामिल क्लास फ़ाइल रनटाइम के दौरान तब तक उपलब्ध रहती है, जब तक कि लेगसी मल्टीडेक्स लाइब्रेरी लोड हो गया. ध्यान रखें कि हर DEX फ़ाइल को अब भी
64K में पहचान फ़ाइलाें की सीमा तय की गई है. इसलिए, ऐसा न करें
मुख्य DEX फ़ाइल के लिए कई क्लास शामिल करें या आपको
कंपाइल करने में गड़बड़ी हुई. डिफ़ॉल्ट रूप से, इसका उपयोग करके क्लास तय करते समय
यह फ़्लैग करते समय भी इस फ़्लैग का इस्तेमाल नहीं किया जा सकता
|
--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
|
आउटपुट, |
|
javac के जनरेट किए गए दावा कोड को हर हाल में चालू करें.
|
|
javac के जनरेट किए गए दावा कोड को हर हाल में बंद करें. यह
यह javac दावा कोड को तब डिफ़ॉल्ट तौर पर हैंडल करता है, जब
DEX फ़ाइलें जनरेट कर रही हूँ.
|
|
javac के जनरेट किए गए दावा कोड को न बदलें. यह
यह javac दावा कोड को तब डिफ़ॉल्ट तौर पर हैंडल करता है, जब
class फ़ाइलें जनरेट की जा रही हैं.
|
|
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