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 ไบต์โค้ด เมื่อคอมไพล์ไฟล์ DEX สำหรับแอปเวอร์ชันที่เผยแพร่ หรือ
โปรดใช้แฟล็ก |
--release
|
คอมไพล์ไบต์โค้ด DEX โดยไม่มีข้อมูลการแก้ไขข้อบกพร่อง อย่างไรก็ตาม
ส่ง Flag นี้เมื่อคอมไพล์ไบต์โค้ดสำหรับรุ่นสาธารณะ |
--output path
|
ระบุเส้นทางที่ต้องการสำหรับเอาต์พุต DEX โดยค่าเริ่มต้น
หากคุณระบุเส้นทางและชื่อของไฟล์ ZIP หรือ JAR |
--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 นี้ในขณะที่ระบุ
|
--no-desugaring
|
ปิดใช้ฟีเจอร์ภาษาของ Java 8 ใช้ธงนี้ในกรณีที่ไม่ต้องการเท่านั้น เพื่อคอมไพล์ไบต์โค้ด Java ที่ใช้ฟีเจอร์ภาษา Java 8 |
--main-dex-list path
|
ระบุไฟล์ข้อความที่แสดงรายการชั้นเรียนที่ เนื่องจากระบบ Android จะโหลดไฟล์ DEX หลักก่อนเมื่อเริ่มดำเนินการ แอปของคุณ คุณจะใช้ Flag นี้เพื่อจัดลำดับความสำคัญของบางคลาสได้เมื่อเริ่มต้นใช้งาน โดยการคอมไพล์ให้เป็นไฟล์ DEX หลัก ซึ่งจะเป็นประโยชน์อย่างยิ่ง เมื่อรองรับ Multidex เดิม เนื่องจากมีเพียงคลาสใน DEX หลักเท่านั้น ขณะรันไทม์จนถึงไลบรารี Multidex เดิม โหลดแล้ว โปรดทราบว่าไฟล์ DEX แต่ละไฟล์ต้องตรงตาม
ขีดจำกัดการอ้างอิง 64K ดังนั้นอย่า
ระบุคลาสมากเกินไปสำหรับไฟล์ DEX หลัก มิเช่นนั้นคุณจะได้รับ
ข้อผิดพลาดในการคอมไพล์ โดยค่าเริ่มต้น เมื่อระบุชั้นเรียนโดยใช้
คุณไม่สามารถใช้ Flag นี้ในขณะที่ระบุ
|
--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 หลักใน |
|
บังคับให้เปิดใช้โค้ดการยืนยันที่ javac สร้างขึ้น
|
|
บังคับให้ปิดใช้โค้ดการยืนยันที่ javac สร้างขึ้น ช่วงเวลานี้
เป็นการจัดการโค้ดยืนยัน javac ตามค่าเริ่มต้นเมื่อ
การสร้างไฟล์ DEX
|
|
โปรดอย่าเปลี่ยนรหัสยืนยันที่ javac สร้างขึ้น ช่วงเวลานี้
เป็นการจัดการโค้ดยืนยัน javac ตามค่าเริ่มต้นเมื่อ
กำลังสร้างไฟล์ class ไฟล์
|
|
เปลี่ยนการยืนยันที่ 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