2014-09-22 2 views
0

응용 프로그램의 동작을 정의하는 구성 클래스가 있습니다. 구성 클래스가 다른 클래스를 확장하지 않으면 사용되지 않은 구성 클래스가 Proguard에 의해 제거되고 코드가 효과적으로 최적화됩니다. 그러나 하나가 다른 하나를 확장하면 구성이 유지되고 코드가 최적화되지 않습니다.Proguard의 기본 클래스를 병합하는 방법

interface ConfInterface { 
    boolean method(); 
} 

class ConfNever implements ConfInterface { 
    public boolean method() { 
     return false; 
    } 
} 

final class Conf extends ConfNever { 
    public boolean method() { 
     return true; 
    } 
} 

public class Main { 
    public static void main(String[] args) { 
     new Test(new Conf()); 
    } 
} 

class Test { 
    Test(ConfInterface ci) { 
     if(ci.method()) { 
      System.out.println("Print"); 
     } else { 
      System.out.println("PrintNever"); 
     } 
    } 
} 

Proguard와 구성 :

-injars bin/ 
-outjars out/ 
-libraryjars <java.home>/lib/rt.jar 
-repackageclasses '' 
-allowaccessmodification 
-keep public class Main { 
    public static void main(java.lang.String[]); 
} 
-optimizationpasses 50 
가 가 컴파일 난독 및 디 컴파일 테스트 클래스

: 논문집 클래스 다음 ConfNever가 Proguard와 의해 제거 ConfNever을 연장하지 않으면

final class c { 
    c(final a a) { 
     super(); 
     if (a.a()) { 
      System.out.println("Print"); 
      return; 
     } 
     System.out.println("PrintNever"); 
    } 
} 

테스트 클래스는 최적화 됨 (참고 : 테스트 클래스를 유지하기 위해 '-optimization50을 통과하지 못했습니다') :

final class b { 
    b(final a a) { 
     super(); 
     System.out.println("Print"); 
    } 
} 

Conf 및 ConfNever를 병합하거나 테스트 클래스가 Conf 객체로만 초기화되고 이에 따라 최적화되도록 Proguard를 만드는 방법이 있습니까?

업데이트 : '-optimizations "클래스/병합/수직"'을 시도했지만 도움이되지 않았습니다.

답변

0

ProGuard는 현재이 클래스 계층을 병합하지 않습니다. 그것의 합병 기준은 현재 막는 ConfNever#method()을 제거해야 할 것입니다. 이 메소드가 서브 클래스 Conf에서 호출되지 않는다는 것을 확인하기 위해 기준을 세분화해야합니다.

관련 문제