d8

d8 เป็นเครื่องมือบรรทัดคำสั่งที่ Android Studio และปลั๊กอิน Android Gradle ใช้คอมไพล์ Java Bytecode ของโปรเจ็กต์เป็นไบต์โค้ด 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 นอกจากนี้ คุณยังใส่ ไฟล์ DEX สำหรับ d8 เพื่อผสานเข้ากับเอาต์พุต DEX ซึ่งมีประโยชน์ เมื่อรวมเอาต์พุตจากบิลด์ที่เพิ่มขึ้น

โดยค่าเริ่มต้น d8 จะรวบรวมไบต์โค้ด Java เป็นไฟล์ DEX ที่เพิ่มประสิทธิภาพแล้ว และมีข้อมูลการแก้ไขข้อบกพร่องที่คุณ ใช้เพื่อแก้ไขข้อบกพร่องของโค้ดระหว่างรันไทม์ แต่คุณสามารถใส่ตัวเลือก เพื่อดำเนินการบิลด์ที่เพิ่มขึ้น ให้ระบุคลาสที่ ควรคอมไพล์ไว้ในไฟล์ DEX หลัก และระบุเส้นทางไปยัง จำเป็นต้องมีทรัพยากรเพิ่มเติมเพื่อใช้ฟีเจอร์ภาษาของ Java 8

d8 path-to-input-files [options]

ตารางต่อไปนี้อธิบาย Flag ที่ไม่บังคับที่คุณใช้กับ d8 ได้

ตัวเลือก คำอธิบาย
--debug

คอมไพล์ไบต์โค้ด DEX เพื่อรวมข้อมูลการแก้ไขข้อบกพร่อง เช่น สัญลักษณ์การแก้ไขข้อบกพร่อง

ตัวเลือกนี้จะเปิดใช้โดยค่าเริ่มต้น วิธีรวมข้อมูลการแก้ไขข้อบกพร่องใน DEX ไบต์โค้ด d8 คาดหวังว่า Java ไบต์โค้ดอินพุต มีข้อมูลดังกล่าว เช่น หากคุณใช้ javac ในการคอมไพล์โค้ด คุณต้องส่งแฟล็ก -g เพื่อใส่ ข้อมูลการแก้ไขข้อบกพร่องในไบต์โค้ด Java เอาต์พุต

เมื่อคอมไพล์ไฟล์ DEX สำหรับแอปเวอร์ชันที่เผยแพร่ หรือ โปรดใช้แฟล็ก --release แทน

--release

คอมไพล์ไบต์โค้ด DEX โดยไม่มีข้อมูลการแก้ไขข้อบกพร่อง อย่างไรก็ตาม d8 มีข้อมูลบางอย่างที่ใช้เมื่อสร้าง สแต็กเทรซและข้อยกเว้นการบันทึก

ส่ง Flag นี้เมื่อคอมไพล์ไบต์โค้ดสำหรับรุ่นสาธารณะ

--output path

ระบุเส้นทางที่ต้องการสำหรับเอาต์พุต DEX โดยค่าเริ่มต้น d8 จะแสดงผลไฟล์ DEX ในการทำงานปัจจุบัน ไดเรกทอรี

หากคุณระบุเส้นทางและชื่อของไฟล์ ZIP หรือ JAR d8 สร้างไฟล์ที่ระบุและรวมไฟล์ DEX เอาต์พุต หากคุณ ระบุเส้นทางไปยังไดเรกทอรีที่มีอยู่ d8 จะแสดงผล DEX ในไดเรกทอรีนั้น

--lib android_sdk/platforms/api-level/android.jar ระบุเส้นทางไปยัง android.jar ของ Android SDK ของคุณ ต้องใช้แฟล็กนี้เมื่อคอมไพล์ไบต์โค้ดที่ใช้ ฟีเจอร์ภาษาของ Java 8
--classpath path ระบุทรัพยากรคลาสพาธที่ d8 อาจต้องใช้เพื่อคอมไพล์ ไฟล์ DEX ของโปรเจ็กต์ โดยเฉพาะอย่างยิ่ง d8 กำหนดให้คุณต้อง ระบุทรัพยากรบางอย่างเมื่อคอมไพล์ไบต์โค้ดที่ใช้ ฟีเจอร์ภาษาของ Java 8
--min-api number ระบุระดับ API ขั้นต่ำที่คุณต้องการให้ไฟล์ DEX เอาต์พุตรองรับ
--intermediate ส่งแฟล็กนี้เพื่อแจ้งให้ d8 ทราบว่าคุณไม่ได้คอมไพล์ Java Bytecode ของโครงการทั้งชุด การตั้งค่าสถานะนี้มีประโยชน์เมื่อ ในการสร้างบิลด์ที่เพิ่มขึ้น แทนที่จะรวบรวมไฟล์ DEX ที่เพิ่มประสิทธิภาพแล้ว ที่คุณคาดว่าจะเรียกใช้ในอุปกรณ์ d8 จะสร้างส่วน DEX และจัดเก็บไว้ในเอาต์พุตที่ระบุหรือเส้นทางเริ่มต้น

เมื่อต้องการคอมไพล์ไฟล์ DEX ที่ต้องการจะเรียกใช้ในอุปกรณ์ ยกเว้นแฟล็กนี้และระบุเส้นทางไปยังคลาส DEX ระดับกลาง เป็นอินพุต

--file-per-class

คอมไพล์แต่ละคลาสเป็นไฟล์ DEX แยกกัน

การเปิดใช้แฟล็กนี้จะทำให้คุณสามารถสร้างบิลด์เพิ่มเติมได้มากขึ้นโดย คอมไพล์ซ้ำเฉพาะชั้นเรียนที่มีการเปลี่ยนแปลงเท่านั้น เมื่อแสดง ที่เพิ่มขึ้นโดยใช้ปลั๊กอิน Android Gradle เปิดใช้งานโดยค่าเริ่มต้น

คุณไม่สามารถใช้ Flag นี้ในขณะที่ระบุ --main-dex-list

--no-desugaring ปิดใช้ฟีเจอร์ภาษาของ Java 8 ใช้ธงนี้ในกรณีที่ไม่ต้องการเท่านั้น เพื่อคอมไพล์ไบต์โค้ด Java ที่ใช้ฟีเจอร์ภาษา Java 8
--main-dex-list path

ระบุไฟล์ข้อความที่แสดงรายการชั้นเรียนที่ d8 ควรมี ในไฟล์ DEX หลัก ซึ่งปกติจะมีชื่อว่า classes.dex เมื่อคุณไม่ระบุรายการชั้นเรียนโดยใช้แฟล็กนี้ d8 ไม่รับประกันว่าจะจัดชั้นเรียนใดไว้ในหมวดหมู่หลัก DEX

เนื่องจากระบบ Android จะโหลดไฟล์ DEX หลักก่อนเมื่อเริ่มดำเนินการ แอปของคุณ คุณจะใช้ Flag นี้เพื่อจัดลำดับความสำคัญของบางคลาสได้เมื่อเริ่มต้นใช้งาน โดยการคอมไพล์ให้เป็นไฟล์ DEX หลัก ซึ่งจะเป็นประโยชน์อย่างยิ่ง เมื่อรองรับ Multidex เดิม เนื่องจากมีเพียงคลาสใน DEX หลักเท่านั้น ขณะรันไทม์จนถึงไลบรารี Multidex เดิม โหลดแล้ว

โปรดทราบว่าไฟล์ DEX แต่ละไฟล์ต้องตรงตาม ขีดจำกัดการอ้างอิง 64K ดังนั้นอย่า ระบุคลาสมากเกินไปสำหรับไฟล์ DEX หลัก มิเช่นนั้นคุณจะได้รับ ข้อผิดพลาดในการคอมไพล์ โดยค่าเริ่มต้น เมื่อระบุชั้นเรียนโดยใช้ --main-dex-list, d8 จะรวมเฉพาะ ในไฟล์ DEX หลัก เพื่อทำให้ปัญหาที่เกี่ยวข้องกับชั้นเรียน หายไปจากไฟล์ DEX หลักเพื่อให้แก้ไขข้อบกพร่องได้ง่ายขึ้น หากระบุ โหมด --release d8 พยายามลดจำนวน ของไฟล์ DEX ที่รวมอยู่ในแอปเวอร์ชันเผยแพร่โดย รวมคลาสอื่นๆ ในไฟล์ DEX หลักให้ได้มากที่สุดจนกว่า ถึงขีดจำกัดที่ 64,000 แล้ว

คุณไม่สามารถใช้ Flag นี้ในขณะที่ระบุ --file-per-class

--pg-map file ใช้ file เป็นไฟล์การแมปสำหรับการเผยแพร่
--file-per-class-file

สร้างไฟล์ DEX แยกต่างหากต่อไฟล์ .class ของอินพุต

เก็บชั้นเรียนสังเคราะห์ไว้กับชั้นเรียนต้นทาง

--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 ระบุจำนวนชุดข้อความที่จะใช้ในการคอมไพล์ หากไม่ได้ระบุ ตัวเลขจะขึ้นอยู่กับการประเมิน โดยนำตัวเลข ของแกนประมาณ 1.5 แกน
--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 ของโปรเจ็กต์ ไบต์โค้ด เช่น ถ้าเปิดใช้ Dexing ระดับชั้นเรียน คุณจะคอมไพล์ใหม่ได้ คลาสที่คุณแก้ไขตั้งแต่บิลด์ก่อนหน้า

คำสั่งต่อไปนี้สร้างบิลด์เพิ่มขึ้นจากชั้นเรียนบางรายการและเปิดใช้ Dexing ต่อคลาส คำสั่งยังระบุไดเรกทอรีเอาต์พุตสำหรับ บิลด์เพิ่มขึ้น

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 คอมไพล์เป็นคลาสหลักได้ด้วย 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 ในโค้ดผ่านกระบวนการคอมไพล์ที่เรียกว่าการนำผลิตภัณฑ์ Desugaring มาใช้ การทำ Conversion ด้วยน้ำตาล เหล่านี้ให้เป็นไบต์โค้ดที่ทำงานได้ใน ที่มีการจัดการครบวงจรได้เลย

Android Studio และปลั๊กอิน Android Gradle มีคลาสพาธ ทรัพยากรที่ d8 ต้องการเพื่อเปิดใช้การลดน้ำตาลสำหรับคุณ อย่างไรก็ตาม เมื่อใช้ d8 จากบรรทัดคำสั่ง คุณจะต้องใส่โค้ดด้วยตนเอง

ทรัพยากรดังกล่าวรายการหนึ่งคือ android.jar จาก Android SDK เป้าหมายของคุณ ช่วงเวลานี้ ทรัพยากรมีชุด API ของแพลตฟอร์ม Android ระบุเส้นทางโดยใช้ ธง--lib

ทรัพยากรอีกรายการคือชุดของ Java Bytecode ที่คอมไพล์ไว้ในโปรเจ็กต์ที่คุณ ไม่ได้คอมไพล์เป็นไบต์โค้ด DEX แต่ต้องการคอมไพล์อื่นๆ เป็นไบต์โค้ด DEX

ตัวอย่างเช่น หากโค้ดของคุณใช้ เมธอดอินเทอร์เฟซแบบค่าเริ่มต้นและแบบคงที่ซึ่งเป็นแบบ Java ฟีเจอร์ 8 ภาษา คุณต้องใช้ธงนี้เพื่อระบุเส้นทางไปยัง Java Bycode ของโปรเจ็กต์ แม้ว่าคุณจะไม่ตั้งใจคอมไพล์ไบต์โค้ดทั้งหมดก็ตาม เป็นไบต์โค้ด 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