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, בהרכבת קובצי DEX לגרסת ההפצה של האפליקציה או
הספרייה, להשתמש בדגל |
--release
|
הידור של בייטקוד DEX ללא מידע על תוצאות ניפוי הבאגים. אבל, לפעמים
יש להעביר את הסימון הזה במהלך הידור של בייטקוד לגרסה ציבורית. |
--output path
|
מציינים את הנתיב הרצוי לפלט ה-DEX. כברירת מחדל,
אם מציינים נתיב ושם של קובץ ZIP או JAR, צריך |
--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, האופטימיזציה הזו מופעלת כברירת מחדל. לא ניתן להשתמש בדגל הזה תוך כדי ציון
|
--no-desugaring
|
השבתת תכונות השפה Java 8. השתמשו בסימון הזה רק אם לא התכוונתם לכך כדי להדר בייטקוד של Java שמשתמש בתכונות השפה של Java 8. |
--main-dex-list path
|
צריך לציין קובץ טקסט שבו מפורטות המחלקות ש- כי מערכת Android טוענת קודם את קובץ ה-DEX הראשי בהפעלה באפליקציה שלכם, תוכלו להשתמש בסימון הזה כדי לתת עדיפות לכיתות מסוימות במהלך ההפעלה. על ידי הידור שלהם לקובץ ה-DEX הראשי. זה שימושי במיוחד כשתומכים ב-multidex מדור קודם, כי רק מחלקות ב-DEX הראשי יהיו זמינים בזמן הריצה עד שספריית Multidex מדור קודם נטען. חשוב לזכור שכל קובץ DEX עדיין חייב לעמוד בדרישות של
מגבלת העזר של 64,000. לכן, לא כדאי
לציין יותר מדי מחלקות לקובץ ה-DEX הראשי, או לקבל
שגיאת הידור. כברירת מחדל, כשמציינים כיתות באמצעות
לא ניתן להשתמש בדגל הזה תוך כדי ציון
|
--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 הראשית שמתקבלת ב- |
|
הפעלה ידנית של קוד טענת נכוֹנוּת (assertion) שנוצר על ידי javac .
|
|
השבתה בכוח של קוד טענת נכוֹנוּת (assertion) שנוצר על ידי javac . הזה
הוא טיפול ברירת המחדל בקוד טענת נכוֹנוּת (assertion) של javac כאשר
יצירת קובצי DEX.
|
|
לא לשנות את הקוד של טענת הנכוֹנוּת (assertion) שנוצר על ידי javac . הזה
הוא טיפול ברירת המחדל בקוד טענת נכוֹנוּת (assertion) של javac כאשר
שנוצרו class קבצים.
|
|
שינוי טענת נכוֹנוּת (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