פולת מת

מבוא

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

ProGuard הוא כלי בקוד פתוח שעוזר לבצע כיווץ, ערפול קוד (obfuscation) ו-mangle bytecode של Java. באופן אופציונלי, בהינתן צנצנת bytecode, ניתן להדפיס "שימוש" דוח המפרט את כל המחלקות והשיטות שבהן לא נעשה שימוש באפליקציה שלך. 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

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

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

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

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

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