Eliminacja martwego kodu

Wstęp

Źródłowy plik jar Twojej aplikacji w Javie zawiera prawdopodobnie ogromną liczbę plików źródłowych, które są w pełni niewykorzystane lub uwzględnione tylko w kilku z nich. Przetłumaczenie tego martwego kodu na kod Objective-C spowoduje niepotrzebne rozładowanie aplikacji na iOS i zwiększy prawdopodobieństwo wystąpienia błędów tłumaczenia, zwłaszcza jeśli jedna z bibliotek Java korzysta z funkcji nieobsługiwanych przez tłumacza J2ObjC.

ProGuard to narzędzie typu open source, które pomaga zmniejszać i zaciemniać kod bajtowy Java. Opcjonalnie, jeśli jar z kodami bajtowymi może wydrukować raport o „użytkowaniu” z listą wszystkich nieużywanych klas i metod w aplikacji, J2ObjC może użyć takiego raportu, by pominąć te klasy i metody podczas tłumaczenia.

ProGuard możesz pobrać tutaj.

Konfigurowanie ProGuard

ProGuard akceptuje jako argument wiersza poleceń, który określa optymalizacje, które powinien wykonać, oraz raporty, które ma generować. Ponieważ J2ObjC potrzebuje tylko informacji o uszkodzonym kodzie, wyłącz wszystkie optymalizacje i niepotrzebne logowanie. Plik przekazany do J2ObjC powinien zawierać tylko tekst nagłówka ProGuard i raport o korzystaniu.

Najpierw sprawdź, czy istnieje plik jar z kodami bajtowymi dla aplikacji, który odpowiada źródłowy plik jar. Aby uzyskać dane wyjściowe wymagane przez J2ObjC, możesz jako szablonu użyć tego pliku konfiguracji skopiowanego z instrukcji obsługi ProGuard:

-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 *;
}

Zmodyfikuj ten plik konfiguracji, aby mieć pewność, że ProGuard nie usunie niczego, co nie powinno. Jeśli Twój plik jar jest aplikacją, a nie tylko biblioteką, określenie metody main(), tak jak w tym miejscu, powinno zachować wszystkie niezbędne elementy. W ramach kontroli poprawności możesz sprawdzić wynikowe wyniki z ProGuard.

Uruchamianie ProGuard

Gdy masz już plik jar z kodami bajtowymi aplikacji i dostosowany plik konfiguracyjny ProGuard (na przykład usage.pg), możesz utworzyć plik raportu wykorzystania za pomocą tego polecenia:

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

Spowoduje to utworzenie pliku o nazwie usage.log z listą nieużywanych klas i metod aplikacji.

Uruchomiono J2ObjC z eliminacją martwego kodu

Po wygenerowaniu raportu o korzystaniu z ProGuard możesz włączyć w J2ObjC etap eliminacji martwego kodu, używając flagi wiersza poleceń --dead-code-report <file>. Etap translacji DeadCodeEliminator wykorzysta raport o użyciu, aby usunąć martwy kod z każdego pliku źródłowego przed przekształceniem w Objective-C.