Jack הוא שרשרת הכלים לבניית אנדרואיד המוגדרת כברירת מחדל עבור אנדרואיד 6.0 - 8.1
ג'ק הוא שרשרת כלים של אנדרואיד שהידור מקור ג'אווה לתוך קוד byte dex של אנדרואיד. אתה לא צריך לעשות שום דבר אחרת כדי להשתמש בג'ק - פשוט השתמש בפקודות makefile הסטנדרטיות שלך כדי להדר את העץ או הפרוייקט שלך. אנדרואיד 8.1 היא המהדורה האחרונה שמשתמשת בג'ק.
על ג'ק
ג'ק פועל כמוצג באיור 1.
איור 1. סקירה כללית של ג'ק.
פורמט ספריית ג'ק
ל-Jack יש פורמט קובץ .jack
משלו המכיל את קוד ה-dex שהורכב מראש עבור הספרייה, המאפשר הידור מהיר יותר (Pre-dex).
איור 2. תוכן קובץ ספריית ג'ק.
ג'יל
כפי שמוצג באיור הבא, הכלי Jill מתרגם את ספריות ה- .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 מכל ספריה. כל הספריות מודפסות מראש.
איור 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
הקיימות לפורמט הספרייה החדש.
איור 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 מכל ספריה. כל הספריות מודפסות מראש.
איור 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 שיטות