הידור עם ג'ק (AOSP 6.0 - 8.1), קומפילציה עם ג'ק (AOSP 6.0 - 8.1)

Jack הוא שרשרת הכלים לבניית אנדרואיד המוגדרת כברירת מחדל עבור אנדרואיד 6.0 - 8.1

ג'ק הוא שרשרת כלים של אנדרואיד שהידור מקור ג'אווה לתוך קוד byte dex של אנדרואיד. אתה לא צריך לעשות שום דבר אחרת כדי להשתמש בג'ק - פשוט השתמש בפקודות makefile הסטנדרטיות שלך כדי להדר את העץ או הפרוייקט שלך. אנדרואיד 8.1 היא המהדורה האחרונה שמשתמשת בג'ק.

על ג'ק

ג'ק פועל כמוצג באיור 1.

סקירה כללית של ג'ק.

איור 1. סקירה כללית של ג'ק.

פורמט ספריית ג'ק

ל-Jack יש פורמט קובץ .jack משלו המכיל את קוד ה-dex שהורכב מראש עבור הספרייה, המאפשר הידור מהיר יותר (Pre-dex).

תוכן קובץ ספריית ג'ק.

איור 2. תוכן קובץ ספריית ג'ק.

ג'יל

כפי שמוצג באיור הבא, הכלי Jill מתרגם את ספריות ה- .jar הקיימות לפורמט הספרייה החדש.

זרימת עבודה לייבוא ​​ספריית `jar.` קיימת.

איור 3. זרימת עבודה לייבוא ​​ספריית .jar קיימת.

שרת קומפילציה של ג'ק

בפעם הראשונה שבו נעשה שימוש ב-Jack, הוא משיק במחשב שלך שרת הידור מקומי של Jack. השרת הזה:

  • מביא להאצה מהותית מכיוון שהוא נמנע מהשקת JRE JVM מארח חדש, טעינת קוד ג'ק, אתחול של ג'ק וחימום ה-JIT בכל קומפילציה. זה גם מספק זמני קומפילציה טובים מאוד במהלך קומפילציות קטנות (לדוגמה, במצב אינקרמנטלי).
  • הוא פתרון לטווח קצר לשליטה במספר הידורים המקבילים של ג'ק. השרת מונע עומס יתר על המחשב שלך (בעיית זיכרון או דיסק) מכיוון שהוא מגביל את מספר ההידורים המקבילים.

שרת Jack מכבה את עצמו לאחר זמן סרק ללא כל קומפילציה. הוא משתמש בשתי יציאות TCP בממשק localhost ואינו זמין חיצונית. ניתן לשנות את כל הפרמטרים (מספר הידורים מקבילים, פסק זמן, מספר יציאות וכו') על ידי עריכת הקובץ $HOME/.jack .

קובץ $HOME/.jack

הקובץ $HOME/.jack מכיל את ההגדרות הבאות עבור משתני שרת Jack בתחביר bash מלא:

  • SERVER=true מאפשר את תכונת השרת של Jack.
  • SERVER_PORT_SERVICE=8072 מגדיר את מספר יציאת ה-TCP של השרת למטרות הידור.
  • SERVER_PORT_ADMIN=8073 מגדיר את מספר יציאת ה-TCP של השרת למטרות ניהול.
  • SERVER_COUNT=1 אינו בשימוש.
  • SERVER_NB_COMPILE=4 מגדיר את המספר המרבי של הידורים מקבילים המותרים. SERVER_TIMEOUT=60 מגדיר את מספר שניות הסרק שעל השרת להמתין ללא כל קומפילציה לפני שיכבה את עצמו. SERVER_LOG=${SERVER_LOG:=$SERVER_DIR/jack-$SERVER_PORT_SERVICE.log} מגדיר את הקובץ שבו נכתבים יומני השרת. כברירת מחדל, משתנה זה יכול להעמיס יתר על המידה על ידי משתנה סביבה.
  • JACK_VM_COMMAND=${JACK_VM_COMMAND:=java} מגדיר את פקודת ברירת המחדל המשמשת להפעלת JVM במארח. כברירת מחדל, ניתן להעמיס על משתנה זה על ידי משתנה סביבה.

פתרון בעיות עם קומפילציות של ג'ק

בְּעָיָה פעולה
המחשב שלך לא מגיב במהלך ההידור או שאתה נתקל בהידורי ג'ק נכשלים בשגיאת זיכרון חסר צמצם את מספר אוסף ג'ק בו-זמנית על ידי עריכת $HOME/.jack ושינוי SERVER_NB_COMPILE לערך נמוך יותר.
ההידורים נכשלים בשרת הרקע לא ניתן להפעיל הסיבה הסבירה ביותר היא שיציאות TCP כבר נמצאות בשימוש במחשב שלך. שנה יציאות על ידי עריכת $HOME/.jack (משתני SERVER_PORT_SERVICE ו- SERVER_PORT_ADMIN ). כדי לבטל את חסימת המצב, השבת את שרת ההידור של Jack על ידי עריכת $HOME/.jack ושינוי SERVER ל- false . לרוע המזל זה מאט משמעותית את ההידור שלך ועלול לאלץ אותך להפעיל make -j עם בקרת עומס (אפשרות -l של make ).
קומפילציה נתקעת ללא כל התקדמות כדי לבטל את חסימת המצב, הרוג את שרת הרקע של Jack באמצעות jack-admin kill-server ) ואז הסר את הספריות הזמניות הכלולות ב- jack-$USER של הספרייה הזמנית שלך ( /tmp או $TMPDIR ).

מצא את יומן ג'ק

אם הרצתם פקודת make עם יעד dist, יומן ה-Jack ממוקם ב- $ANDROID_BUILD_TOP/out/dist/logs/jack-server.log . אחרת, תוכל למצוא את היומן על ידי הפעלת jack-admin server-log . במקרה של כשלי ג'ק שניתנים לשחזור, תוכל לקבל יומן מפורט יותר על ידי הגדרת המשתנה הבא:

export ANDROID_JACK_EXTRA_ARGS="--verbose debug --sanity-checks on -D sched.runner=single-threaded"

השתמש בפקודות makefile סטנדרטיות כדי להדר את העץ (או הפרוייקט שלך) ולצרף פלט ושגיאה סטנדרטיים. כדי להסיר יומני בנייה מפורטים, הפעל:

unset ANDROID_JACK_EXTRA_ARGS

מגבלות ג'ק

כברירת מחדל, שרת Jack יכול לשמש רק משתמש אחד במחשב. כדי לתמוך במשתמשים נוספים, בחר מספרי יציאה שונים עבור כל משתמש והתאם את SERVER_NB_COMPILE בהתאם. אתה יכול גם להשבית את שרת Jack על ידי הגדרת SERVER=false ב- $HOME/.jack . הידור CTS איטי עקב שילוב vm-tests-tf הנוכחי. כלי מניפולציה של קוד בייט (כגון JaCoCo) אינם נתמכים.

השתמש בג'ק

Jack תומך בשפת התכנות Java 1.7 ומשלב את התכונות הנוספות המתוארות להלן.

Pre-dex

בעת יצירת קובץ ספריית ג'ק, ה- .dex של הספרייה נוצר ומאוחסן בתוך קובץ ספריית .jack כ-Pre-dex. בעת הקומפילציה, ג'ק משתמש מחדש ב-Pre-dex מכל ספריה. כל הספריות מודפסות מראש.

ספריות ג'ק עם Pre-dex.

איור 4. ספריות ג'ק עם Pre-dex.

ג'ק אינו עושה שימוש חוזר ב-Pre-dex של הספרייה אם נעשה שימוש בהידור, כיווץ, ערפול או אריזה מחדש.

קומפילציה מצטברת

הידור מצטבר פירושו שרק הרכיבים שנגעו בהם מאז ההידור האחרון (והתלות שלהם) עוברים קומפילציה מחדש. קומפילציה מצטברת יכולה להיות מהירה משמעותית מהקומפילציה מלאה כאשר השינויים מוגבלים לקבוצת רכיבים.

קומפילציה מצטברת מושבתת כברירת מחדל (ומבוטלת אוטומטית כאשר מופעלים כיווץ, ערפול, אריזה מחדש או מורשת רב-דקס). כדי לאפשר בנייה מצטברת, הוסף את השורה הבאה לקובץ Android.mk של הפרויקט שברצונך לבנות בהדרגה:

LOCAL_JACK_ENABLED := incremental

כיווץ וערפול

ג'ק משתמש בקובצי תצורה של ProGuard כדי לאפשר כיווץ וערפול.

האפשרויות הנפוצות כוללות את הדברים הבאים:

  • @
  • -include
  • -basedirectory
  • -injars
  • -outjars (רק צנצנת פלט אחת נתמכת)
  • -libraryjars
  • -keep
  • -keepclassmembers
  • -keepclasseswithmembers
  • -keepnames
  • -keepclassmembernames
  • -keepclasseswithmembernames
  • -printseeds

אפשרויות הכיווץ כוללות את הדברים הבאים:

  • -dontshrink

אפשרויות הערפול כוללות את הדברים הבאים:

  • -dontobfuscate
  • -printmapping
  • -applymapping
  • -obfuscationdictionary
  • -classobfuscationdictionary
  • -packageobfuscationdictionary
  • -useuniqueclassmembernames
  • -dontusemixedcaseclassnames
  • -keeppackagenames
  • -flattenpackagehierarchy
  • -repackageclasses
  • -keepattributes
  • -adaptclassstrings

אפשרויות התעלמות כוללות את הדברים הבאים:

  • -dontoptimize (ג'ק לא מבצע אופטימיזציה)
  • -dontpreverify (ג'ק לא מאמת מראש)
  • -skipnonpubliclibraryclasses
  • -dontskipnonpubliclibraryclasses
  • -dontskipnonpubliclibraryclassmembers
  • -keepdirectories
  • -target
  • -forceprocessing
  • -printusage
  • -whyareyoukeeping
  • -optimizations
  • -optimizationpasses
  • -assumenosideeffects
  • -allowaccessmodification
  • -mergeinterfacesaggressively
  • -overloadaggressively
  • -microedition
  • -verbose
  • -dontnote
  • -dontwarn
  • -ignorewarnings
  • -printconfiguration
  • -dump

אריזה מחדש

ג'ק משתמש בקבצי תצורה של jarjar כדי לבצע אריזה מחדש. בעוד שג'ק תואם לסוגי כללים של "כלל", הוא אינו תואם לסוגי כללים "זאפ" או "שמור".

תמיכת Multidex

Jack מציע תמיכה מובנית ומדור קודם. מכיוון שקובצי dex מוגבלים לשיטות 65K, יש לפצל אפליקציות עם יותר מ-65K למספר קובצי dex. לפרטים נוספים, ראה הפעל multidex עבור אפליקציות עם יותר מ-64K שיטות

,

Jack הוא שרשרת הכלים לבניית אנדרואיד המוגדרת כברירת מחדל עבור אנדרואיד 6.0 - 8.1

ג'ק הוא שרשרת כלים של אנדרואיד שהידור מקור ג'אווה לתוך קוד byte dex של אנדרואיד. אתה לא צריך לעשות שום דבר אחרת כדי להשתמש בג'ק - פשוט השתמש בפקודות makefile הסטנדרטיות שלך כדי להדר את העץ או הפרוייקט שלך. אנדרואיד 8.1 היא המהדורה האחרונה שמשתמשת בג'ק.

על ג'ק

ג'ק פועל כפי שמוצג באיור 1.

סקירה כללית של ג'ק.

איור 1. סקירה כללית של ג'ק.

פורמט ספריית ג'ק

ל-Jack יש פורמט קובץ .jack משלו המכיל את קוד ה-dex שהורכב מראש עבור הספרייה, המאפשר הידור מהיר יותר (Pre-dex).

תוכן קובץ ספריית ג'ק.

איור 2. תוכן קובץ ספריית ג'ק.

ג'יל

כפי שמוצג באיור הבא, הכלי Jill מתרגם את ספריות ה- .jar הקיימות לפורמט הספרייה החדש.

זרימת עבודה לייבוא ​​ספריית `jar.` קיימת.

איור 3. זרימת עבודה לייבוא ​​ספריית .jar קיימת.

שרת קומפילציה של ג'ק

בפעם הראשונה שבו נעשה שימוש ב-Jack, הוא משיק במחשב שלך שרת הידור מקומי של Jack. השרת הזה:

  • מביא להאצה מהותית מכיוון שהוא נמנע מהשקת JRE JVM מארח חדש, טעינת קוד ג'ק, אתחול של ג'ק וחימום ה-JIT בכל קומפילציה. זה גם מספק זמני קומפילציה טובים מאוד במהלך קומפילציות קטנות (לדוגמה, במצב אינקרמנטלי).
  • הוא פתרון לטווח קצר לשליטה במספר הידורים המקבילים של ג'ק. השרת מונע עומס יתר על המחשב שלך (בעיית זיכרון או דיסק) מכיוון שהוא מגביל את מספר ההידורים המקבילים.

שרת Jack מכבה את עצמו לאחר זמן סרק ללא כל קומפילציה. הוא משתמש בשתי יציאות TCP בממשק localhost ואינו זמין חיצונית. ניתן לשנות את כל הפרמטרים (מספר הידורים מקבילים, פסק זמן, מספר יציאות וכו') על ידי עריכת הקובץ $HOME/.jack .

קובץ $HOME/.jack

הקובץ $HOME/.jack מכיל את ההגדרות הבאות עבור משתני שרת Jack בתחביר bash מלא:

  • SERVER=true מאפשר את תכונת השרת של Jack.
  • SERVER_PORT_SERVICE=8072 מגדיר את מספר יציאת ה-TCP של השרת למטרות הידור.
  • SERVER_PORT_ADMIN=8073 מגדיר את מספר יציאת ה-TCP של השרת למטרות ניהול.
  • SERVER_COUNT=1 אינו בשימוש.
  • SERVER_NB_COMPILE=4 מגדיר את המספר המרבי של הידורים מקבילים המותרים. SERVER_TIMEOUT=60 מגדיר את מספר שניות הסרק שעל השרת להמתין ללא כל קומפילציה לפני שיכבה את עצמו. SERVER_LOG=${SERVER_LOG:=$SERVER_DIR/jack-$SERVER_PORT_SERVICE.log} מגדיר את הקובץ שבו נכתבים יומני השרת. כברירת מחדל, משתנה זה יכול להעמיס יתר על המידה על ידי משתנה סביבה.
  • JACK_VM_COMMAND=${JACK_VM_COMMAND:=java} מגדיר את פקודת ברירת המחדל המשמשת להפעלת JVM במארח. כברירת מחדל, ניתן להעמיס על משתנה זה על ידי משתנה סביבה.

פתרון בעיות עם קומפילציות של ג'ק

בְּעָיָה פעולה
המחשב שלך לא מגיב במהלך ההידור או שאתה נתקל בהידורי ג'ק נכשלים בשגיאת זיכרון חסר צמצם את מספר אוסף ג'ק בו-זמנית על ידי עריכת $HOME/.jack ושינוי SERVER_NB_COMPILE לערך נמוך יותר.
ההידורים נכשלים בשרת הרקע לא ניתן להפעיל הסיבה הסבירה ביותר היא שיציאות TCP כבר נמצאות בשימוש במחשב שלך. שנה יציאות על ידי עריכת $HOME/.jack (משתני SERVER_PORT_SERVICE ו- SERVER_PORT_ADMIN ). כדי לבטל את חסימת המצב, השבת את שרת ההידור של Jack על ידי עריכת $HOME/.jack ושינוי SERVER ל- false . לרוע המזל זה מאט משמעותית את ההידור שלך ועלול לאלץ אותך להפעיל make -j עם בקרת עומס (אפשרות -l של make ).
הקומפילציה נתקעת ללא כל התקדמות כדי לבטל את חסימת המצב, הרוג את שרת הרקע של Jack באמצעות jack-admin kill-server ) ואז הסר את הספריות הזמניות הכלולות ב- jack-$USER של הספרייה הזמנית שלך ( /tmp או $TMPDIR ).

מצא את יומן ג'ק

אם הרצתם פקודת make עם יעד dist, יומן ה-Jack ממוקם ב- $ANDROID_BUILD_TOP/out/dist/logs/jack-server.log . אחרת, תוכל למצוא את היומן על ידי הפעלת jack-admin server-log . במקרה של כשלי ג'ק שניתנים לשחזור, תוכל לקבל יומן מפורט יותר על ידי הגדרת המשתנה הבא:

export ANDROID_JACK_EXTRA_ARGS="--verbose debug --sanity-checks on -D sched.runner=single-threaded"

השתמש בפקודות makefile סטנדרטיות כדי להדר את העץ (או הפרוייקט שלך) ולצרף פלט סטנדרטי ושגיאה. כדי להסיר יומני בנייה מפורטים, הפעל:

unset ANDROID_JACK_EXTRA_ARGS

מגבלות ג'ק

כברירת מחדל, שרת Jack יכול לשמש רק משתמש אחד במחשב. כדי לתמוך במשתמשים נוספים, בחר מספרי יציאה שונים עבור כל משתמש והתאם את SERVER_NB_COMPILE בהתאם. אתה יכול גם להשבית את שרת Jack על ידי הגדרת SERVER=false ב- $HOME/.jack . הידור CTS איטי עקב שילוב vm-tests-tf הנוכחי. כלי מניפולציה של קוד בייט (כגון JaCoCo) אינם נתמכים.

השתמש בג'ק

Jack תומך בשפת התכנות Java 1.7 ומשלב את התכונות הנוספות המתוארות להלן.

Pre-dex

בעת יצירת קובץ ספריית ג'ק, ה- .dex של הספרייה נוצר ומאוחסן בתוך קובץ ספריית .jack כ-Pre-dex. בעת הקומפילציה, ג'ק משתמש מחדש ב-Pre-dex מכל ספריה. כל הספריות מודפסות מראש.

ספריות ג'ק עם Pre-dex.

איור 4. ספריות ג'ק עם Pre-dex.

ג'ק אינו עושה שימוש חוזר ב-Pre-dex של הספרייה אם נעשה שימוש בהידור, כיווץ, ערפול או אריזה מחדש.

קומפילציה מצטברת

הידור מצטבר פירושו שרק הרכיבים שנגעו בהם מאז ההידור האחרון (והתלות שלהם) עוברים קומפילציה מחדש. קומפילציה מצטברת יכולה להיות מהירה משמעותית מהקומפילציה מלאה כאשר השינויים מוגבלים לקבוצת רכיבים.

קומפילציה מצטברת מושבתת כברירת מחדל (ומבוטלת אוטומטית כאשר מופעלים כיווץ, ערפול, אריזה מחדש או מורשת רב-דקס). כדי לאפשר בנייה מצטברת, הוסף את השורה הבאה לקובץ Android.mk של הפרויקט שברצונך לבנות בהדרגה:

LOCAL_JACK_ENABLED := incremental

כיווץ וערפול

ג'ק משתמש בקבצי תצורה של ProGuard כדי לאפשר כיווץ וערפול.

האפשרויות הנפוצות כוללות את הדברים הבאים:

  • @
  • -include
  • -basedirectory
  • -injars
  • -outjars (רק צנצנת פלט אחת נתמכת)
  • -libraryjars
  • -keep
  • -keepclassmembers
  • -keepclasseswithmembers
  • -keepnames
  • -keepclassmembernames
  • -keepclasseswithmembernames
  • -printseeds

אפשרויות הכיווץ כוללות את הדברים הבאים:

  • -dontshrink

אפשרויות הערפול כוללות את הדברים הבאים:

  • -dontobfuscate
  • -printmapping
  • -applymapping
  • -obfuscationdictionary
  • -classobfuscationdictionary
  • -packageobfuscationdictionary
  • -useuniqueclassmembernames
  • -dontusemixedcaseclassnames
  • -keeppackagenames
  • -flattenpackagehierarchy
  • -repackageclasses
  • -keepattributes
  • -adaptclassstrings

האפשרויות שמתעלמות מהן כוללות את הדברים הבאים:

  • -dontoptimize (ג'ק לא מבצע אופטימיזציה)
  • -dontpreverify (ג'ק לא מאמת מראש)
  • -skipnonpubliclibraryclasses
  • -dontskipnonpubliclibraryclasses
  • -dontskipnonpubliclibraryclassmembers
  • -keepdirectories
  • -target
  • -forceprocessing
  • -printusage
  • -whyareyoukeeping
  • -optimizations
  • -optimizationpasses
  • -assumenosideeffects
  • -allowaccessmodification
  • -mergeinterfacesaggressively
  • -overloadaggressively
  • -microedition
  • -verbose
  • -dontnote
  • -dontwarn
  • -ignorewarnings
  • -printconfiguration
  • -dump

אריזה מחדש

ג'ק משתמש בקובצי תצורה של jarjar כדי לבצע אריזה מחדש. בעוד שג'ק תואם לסוגי כללים של "כלל", הוא אינו תואם לסוגי כללים "זאפ" או "שמור".

תמיכת Multidex

ג'ק מציע תמיכה מובנית ומדור קודם. מכיוון שקובצי dex מוגבלים לשיטות 65K, יש לפצל אפליקציות עם יותר מ-65K למספר קובצי dex. לפרטים נוספים, ראה הפעל multidex עבור אפליקציות עם יותר מ-64K שיטות