ק8

d8 הוא כלי שורת הפקודה Android Studio והפלאגין של Android Gradle משמש להרכבת בייטקוד Java של הפרויקט לבייטקוד DEX שרץ במכשירי Android. d8 מאפשר לך להשתמש בתכונות של שפת Java 8 בקוד של האפליקציה.

d8 כלול גם ככלי עצמאי ב-Android Build כלים 28.0.1 ואילך: android_sdk/build-tools/version/.

שימוש כללי

ב-d8 נדרש רק נתיב לבייטקוד (bytecode) של Java שעבר הידור שרוצים להמיר לבייטקוד DEX. לדוגמה:

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

בייטקוד הקלט יכול להיות בכל שילוב של קובצי *.class או מאגרים כמו JAR, APK או ZIP. אפשר גם לכלול קובצי DEX של d8 כדי להתמזג עם פלט ה-DEX, וזה שימושי כשכוללים פלט מ-build מצטבר.

כברירת מחדל, ב-d8 מהדרת הבייטקוד של Java לקובצי DEX שעברו אופטימיזציה והוא כולל מידע על תוצאות ניפוי הבאגים לצורך ניפוי באגים בקוד במהלך זמן ריצה. עם זאת, אפשר לכלול הדגלים לביצוע build מצטבר, מציינים את המחלקות צריך לעבור הידור של קובץ ה-DEX הראשי, ולציין נתיבים משאבים נוספים הנדרשים לשימוש בתכונות שפת Java 8.

d8 path-to-input-files [options]

בטבלה הבאה מתוארים הדגלים האופציונליים שבהם אפשר להשתמש ב-d8:

אפשרות תיאור
--debug

הידור בייטקוד DEX כדי לכלול מידע על תוצאות ניפוי הבאגים, כמו סמל של ניפוי באגים בטבלאות.

האפשרות הזו מופעלת כברירת מחדל. כדי לכלול מידע על תוצאות ניפוי הבאגים בייטקוד DEX, d8 מצפה לבייטקוד (bytecode) של Java שכולל את המידע הזה. לדוגמה, אם משתמשים ב-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.jar של Android SDK. הדגל הזה נדרש כאשר מחברים בייטקוד שמשתמש תכונות שפה של Java 8.
--classpath path ציון משאבי ה-classpath שייתכן שיהיה צורך להדר ב-d8 בקובצי ה-DEX של הפרויקט. באופן ספציפי, לפי דרישת d8, לציין משאבים מסוימים בעת הידור של בייטקוד שמשתמש תכונות השפה של Java 8.
--min-api number מציינים את רמת ה-API המינימלית שבה רוצים לתמוך בקובצי ה-DEX של הפלט.
--intermediate צריך להעביר את הסימון הזה כדי להודיע ל-d8 שלא הידור של את כל קוד הבייטקוד של Java בפרויקט. הסימון הזה שימושי כאשר לביצועים של גרסאות build מצטברות. במקום להרכיב קובצי DEX שעברו אופטימיזציה שאתם מצפים שיפעלו במכשיר, d8 יוצר קובצי DEX ושומרים אותם בפלט או בנתיב ברירת המחדל שצוינו.

כשרוצים להדר קובצי DEX שמתכוונים להריץ במכשיר, לא לכלול את הדגל הזה ולציין את הנתיב למחלקות הביניים של ה-DEX בתור קלט.

--file-per-class

הידור כל מחלקה לקובצי DEX נפרדים.

הפעלת הדגל הזה תאפשר לך לבצע גרסאות build מצטברות יותר על ידי ולהרכיב מחדש רק את הכיתות שהשתנו. בזמן הביצועים גרסאות build מצטברות באמצעות הפלאגין של Android Gradle, האופטימיזציה הזו מופעלת כברירת מחדל.

לא ניתן להשתמש בדגל הזה תוך כדי ציון --main-dex-list

--no-desugaring השבתת תכונות השפה Java 8. השתמשו בסימון הזה רק אם לא התכוונתם לכך כדי להדר בייטקוד של Java שמשתמש בתכונות השפה של Java 8.
--main-dex-list path

צריך לציין קובץ טקסט שבו מפורטות המחלקות ש-d8 צריך לכלול בקובץ ה-DEX הראשי, שנקרא בדרך כלל classes.dex. אם לא תציינו רשימת כיתות באמצעות הדגל הזה, לא ניתן להבטיח אילו כיתות ייכללו ב-d8 קובץ DEX.

כי מערכת Android טוענת קודם את קובץ ה-DEX הראשי בהפעלה באפליקציה שלכם, תוכלו להשתמש בסימון הזה כדי לתת עדיפות לכיתות מסוימות במהלך ההפעלה. על ידי הידור שלהם לקובץ ה-DEX הראשי. זה שימושי במיוחד כשתומכים ב-multidex מדור קודם, כי רק מחלקות ב-DEX הראשי יהיו זמינים בזמן הריצה עד שספריית Multidex מדור קודם נטען.

חשוב לזכור שכל קובץ DEX עדיין חייב לעמוד בדרישות של מגבלת העזר של 64,000. לכן, לא כדאי לציין יותר מדי מחלקות לקובץ ה-DEX הראשי, או לקבל שגיאת הידור. כברירת מחדל, כשמציינים כיתות באמצעות --main-dex-list, d8 כולל רק את אלה מחלקות בקובץ ה-DEX הראשי. זאת כדי ליצור בעיות שקשורות לכיתות חסר בקובץ ה-DEX הראשי, כדי שיהיה קל יותר לנפות בו באגים. אם מציינים במצב --release, המערכת של d8 מנסה להפחית את המספר של קובצי DEX שנארזים בגרסת ההפצה של האפליקציה באמצעות כולל כמה שיותר מחלקות בקובץ ה-DEX הראשי עד הגעת למגבלה של 64,000.

לא ניתן להשתמש בדגל הזה תוך כדי ציון --file-per-class

--pg-map file שימוש ב-file כקובץ מיפוי להפצה.
--file-per-class-file

מפיקים קובץ DEX נפרד לכל קובץ קלט מסוג class.

להשאיר את הכיתות המלאכותיות עם הכיתה המקורית.

--desugared-lib file

ציון ההגדרה של הספרייה שהוסרה.

file הוא קובץ תצורה של ספרייה ללא סוכר ב-JSON הפורמט.

--main-dex-rules file לשמור על כללי הפעילות בכיתות בקובץ ה-DEX הראשי.
--main-dex-list-output file רשימת ה-DEX הראשית שמתקבלת ב-file.

--force-enable-assertions [:class_or_package_name...]

--force-ea [:class_or_package_name...]

הפעלה ידנית של קוד טענת נכוֹנוּת (assertion) שנוצר על ידי javac.

--force-disable-assertions [:class_or_package_name...]

--force-da [:class_or_package_name...]

השבתה בכוח של קוד טענת נכוֹנוּת (assertion) שנוצר על ידי javac. הזה הוא טיפול ברירת המחדל בקוד טענת נכוֹנוּת (assertion) של javac כאשר יצירת קובצי DEX.

--force-passthrough-assertions [:class_or_package_name...]

--force-pa [:class_or_package_name...]

לא לשנות את הקוד של טענת הנכוֹנוּת (assertion) שנוצר על ידי javac. הזה הוא טיפול ברירת המחדל בקוד טענת נכוֹנוּת (assertion) של javac כאשר שנוצרו class קבצים.

--force-assertions-handler:handler method [:class_or_package_name...]

--force-ah:handler method [:class_or_package_name...]

שינוי טענת נכוֹנוּת (assertion) שנוצרה על ידי javac ו-kotlinc כדי להפעיל את השיטה handler method עם כל טענת נכוֹנוּת (assertion) במקום לזרוק אותו. השדה 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 הם אחד מהערכים 'info', 'warning' או 'error' את הרצף type האופציונלי הוא ערך פשוט או מלא שם סוג Java של אבחון. אם לא צוין type, כל נתוני האבחון ב-from-level ממופים. שימו לב שלא ניתן למפות שגיאות מהדר (compiler) חמורה.
--version מדפיסים את הגרסה של d8 שבה אתם משתמשים כרגע.
--help הדפסת טקסט עזרה לשימוש ב-d8.

ביצוע גרסאות build מצטברות

כדי לשפר את מהירויות ה-build במהלך הפיתוח, למשל לצורך אינטגרציה רציפה (CI) build, הוראה ל-d8 להדר רק קבוצת משנה של Java של הפרויקט bytecode. לדוגמה, אם תפעילו את Dexing לפי מחלקה, תוכלו להדר מחדש רק המחלקות ששינית מאז ה-build הקודם.

הפקודה הבאה מבצעת build מצטבר מכמה מחלקות והיא מאפשרת לכל כיתה. הפקודה גם מציינת ספריית פלט build מצטבר.

d8 MainActivity.class R.class --intermediate --file-per-class --output ~/build/intermediate/dex

כאשר d8 מבצע build מצטבר, הוא שומר מידע נוסף פלט DEX. לאחר מכן, d8 ישתמש במידע הזה כדי לעבד כראוי את --main-dex-list ולמזג קובצי DEX במהלך build מלא של האפליקציה.

לדוגמה, כשמעבדים מחלקות lambda של Java 8, d8 עוקב אחרי מחלקות lambda נוצרות לכל מחלקה של קלט. במהלך build מלא, כאשר d8 כולל מחלקה בקובץ ה-DEX הראשי, הוא בודק את המטא-נתונים כדי לוודא ממחלקות ה-lambda שנוצרו בשביל זה, כלולות גם קובץ DEX.

אם כבר הרכבתם את כל קודי הבייטים של הפרויקט לקובצי DEX בכמה גרסאות build מצטברות, לבצע build מלא על ידי העברת של קובץ הביניים מסוג DEX אל d8, כפי שמוצג בפקודה הבאה. בנוסף, אפשר לציין את המחלקות שרוצים הידור שלהן ב-d8 קובץ DEX באמצעות --main-dex-list. כי הקלט הוא קבוצה של קבצים כבר עבר הידור בבייטקוד של DEX, ה-build הזה אמור להסתיים מהר יותר מאשר בנייה נקיה.

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

הידור של בייטקוד שמשתמש בתכונות השפה של Java 8

d8 מאפשר לך להשתמש בתכונות של שפת Java 8 בקוד באמצעות תהליך הידור שנקרא הסרת סוכרים. הסרת סוכרים מהמרות את תכונות השפה השימושיות האלה לבייטקוד שיכול לפעול ב-Android הפלטפורמה.

Android Studio והפלאגין של Android Gradle כוללים את classpath למשאבים שנדרשים ל-d8 כדי להפעיל את הסרת השומן. אבל, כשמשתמשים d8 משורת הפקודה, צריך לכלול אותם בעצמכם.

אחד מהמשאבים האלה הוא android.jar מגרסת היעד של Android SDK. הזה המשאב כולל קבוצה של ממשקי API של פלטפורמת Android. לציין את הנתיב באמצעות הדגל --lib.

משאב נוסף הוא קבוצת הבייטים של Java שהורכבה לפרויקט שלכם, בשלב זה לא הולכים הידור ל-bytecode של DEX אבל דורשים להדר מחלקות לבייטקוד DEX.

לדוגמה, אם הקוד שלך משתמש methods של ממשק ברירת מחדל וסטטי, שהן Java 8 language, עליך להשתמש בדגל הזה כדי לציין את הנתיב bytecode של Java, גם אם לא התכוונת להדר את כל קוד הבייט ל-bytecode של DEX. הסיבה לכך היא שהנתונים האלה נדרשים ל-d8 כדי להבין בקוד הפרויקט ותפתרו קריאות ל-methods של הממשק.

דוגמת הקוד הבאה מבצעת build מצטבר של מחלקה שניגשת שיטת ברירת מחדל בממשק:

d8 MainActivity.class --intermediate --file-per-class --output ~/build/intermediate/dex
--lib android_sdk/platforms/api-level/android.jar
--classpath ~/build/javac/debug