פולת מת

מבוא

סביר להניח שמאגר המקור של אפליקציית Java שלכם מכיל מספר עצום של קובצי מקור שכבר לא בשימוש או שהם כלולים בכמה שיטות בלבד. תרגום הקוד המת הזה ל-Objective-C יגרום לנפח גדול של האפליקציה ל-iOS, שלא לצורך, ולהגביר את הסיכוי לשגיאות תרגום, במיוחד אם אחת מספריות Java משתמשת בתכונות שלא נתמכות על ידי מתרגם J2ObjC.

ProGuard הוא כלי בקוד פתוח שעוזר לכווץ, לבצע ערפול קוד (obfuscation) או לשנות את קוד הבייט של Java בדרכים אחרות. לחלופין, בהינתן מאגר של קוד בייט, תוכלו להדפיס דוח "שימוש" שיכלול את כל המחלקות והשיטות שאינן בשימוש באפליקציה. J2ObjC יכול להשתמש בדוח כזה כדי לדלג על המחלקות והשיטות האלה במהלך התרגום.

ניתן להוריד את ProGuard כאן.

הגדרת ProGuard

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

קודם כל, חשוב לוודא שיש לאפליקציה שלכם מאגר של קוד בייט שתואם לצנצנת המקור. אפשר להשתמש בקובץ התצורה הבא, שהועתק מהמדריך של ProGuard, כתבנית ליצירת הפלט ש-J2ObjC מצפה לו:

-injars app-bin.jar
-libraryjars /lib/rt.jar

-dontoptimize
-dontobfuscate
-dontpreverify
-printusage
-dontnote

-keep public class com.foo.app.Main {
    public static void main(java.lang.String[]);
}

-keepclassmembers class * {
    static final % *;
    static final java.lang.String *;
}

שנה את קובץ התצורה הזה כדי להבטיח ש-ProGuard לא יסיר משהו שהוא לא צריך. אם הצנצנת היא אפליקציה ולא רק ספרייה, צריך לציין את השיטה main() כפי שעשינו כאן, כדי לשמור את כל מה שצריך. אפשר לבדוק את הפלט שמתקבל מ-ProGuard כבדיקת שפיות.

הפעלת ProGuard

אחרי יצירת מאגר התגים הבייטים של האפליקציה וקובץ תצורה מותאם אישית של ProGuard (שנקרא, למשל usage.pg), תוכלו ליצור קובץ דוח שימוש באמצעות הפקודה הבאה:

java -jar proguard.jar @usage.pg > usage.log

הפעולה הזו תיצור קובץ בשם usage.log שמפורטות בו המחלקות והשיטות של האפליקציה שלא נמצאות בשימוש.

הרצת J2ObjC עם ביטול קוד מת

עכשיו, אחרי יצירת דוח השימוש ב-ProGuard, אפשר להפעיל את שלב ביטול הקוד ללא (J2ObjC) ב-J2ObjC באמצעות התכונה הניסיונית --dead-code-report <file> של שורת הפקודה. בשלב התרגום של DeadCodeEliminator, ייעשה שימוש בדוח השימוש כדי להסיר קוד מת מכל קובץ מקור, לפני התרגום ל-Objective-C.