불량 코드 제거

소개

자바 애플리케이션의 소스 jar에는 완전히 사용되지 않거나 몇 가지 메서드에만 포함된 소스 파일이 매우 많이 포함되어 있을 수 있습니다. 이 데드 코드를 Objective-C로 변환하면 iOS 애플리케이션이 불필요하게 팽창되고 번역 오류가 발생할 가능성이 커집니다. 특히 Java 라이브러리 중 하나에서 J2ObjC 번역기에서 지원하지 않는 기능을 사용하는 경우 더욱 그렇습니다.

ProGuard는 자바 바이트 코드를 축소, 난독화 또는 손상시키는 데 유용한 오픈소스 도구입니다. 필요한 경우 바이트 코드 jar가 제공되는 경우 애플리케이션에서 사용되지 않는 모든 클래스와 메서드를 모두 나열하는 '사용량' 보고서를 출력할 수 있습니다. J2ObjC는 이러한 보고서를 사용하여 변환 중에 이러한 클래스와 메서드를 건너뛸 수 있습니다.

ProGuard는 여기에서 다운로드할 수 있습니다.

ProGuard 구성

ProGuard는 구성 파일을 실행해야 하는 최적화와 생성해야 하는 보고서를 지정하는 명령줄 인수로 구성 파일을 허용합니다. J2ObjC는 데드 코드에 관해서만 알면 되므로 모든 최적화와 관련 없는 로깅을 사용 중지해야 합니다. J2ObjC로 전달되는 파일은 ProGuard 헤더 텍스트와 사용 보고서로만 구성되어야 합니다.

먼저 애플리케이션에 소스 jar에 해당하는 바이트 코드 jar가 있는지 확인합니다. 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에서 제거되지 않아야 하는 항목이 제거되지 않도록 이 구성 파일을 수정합니다. jar가 단순한 라이브러리가 아닌 애플리케이션인 경우 여기서 한 것처럼 main() 메서드를 지정하면 필요한 모든 것이 유지됩니다. ProGuard의 결과 출력을 상태 검사로 검사할 수 있습니다.

ProGuard 실행

애플리케이션의 바이트 코드 jar와 맞춤설정된 ProGuard 구성 파일 (예: usage.pg)이 있으면 다음 명령어로 사용량 보고서 파일을 만들 수 있습니다.

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

이렇게 하면 애플리케이션에서 사용하지 않는 클래스와 메서드를 나열하는 usage.log라는 파일이 생성됩니다.

데드 코드 제거로 J2ObjC 실행

이제 ProGuard 사용 보고서가 있으므로 J2ObjC에서 명령줄 플래그 --dead-code-report <file>를 사용하여 데드 코드 제거 단계를 사용 설정할 수 있습니다. DeadCodeEliminator 변환 단계에서는 Objective-C로 변환하기 전에 사용량 보고서를 사용하여 각 소스 파일에서 데드 코드를 삭제합니다.