본문 바로가기

IT

proguard 설정 후 정상적으로 작동하지 않는 경우 type parameter 가 자꾸 없다고 나올때

반응형

 이번에 안드로이드 프로젝트를 진행하면서 Netty 라이브러리를 사용하였습니다. Netty 로그를 보니 4.1 베타버전부터는 안드로이드 4.0 이상의 버전을 정식으로 지원한다고 하네요.


 그래서 기존에 4.0버전에서 4.1 베타버전으로 변경 후 프로가드 설정에서 Netty 에 대한 설정을 다음과 같이 하고 진행하였습니다.


# ignore netty lib warning
-dontwarn io.netty.**

# netty 4.0
-keep class io.netty.** {
    *;
}
-keep interface io.netty.** {
    *;
}

# Slf4j for android
-keep class org.slf4j.** {
    *;
}
-keep interface org.slf4j.** {
    *;
}

# Jzlib
-keep class com.jcraft.jzlib.** {
    *;
}
-keep interface com.jcraft.jzlib.** {
    *;
}


순서대로 warning 메시지 무시하도록 하고, io.netty. 로 시작하는 패키지의 class와 interface의 모든 메소드에 대해 난독화하지 않도록 설정하고, 이하 2개의 라이브러리도 Netty 를 안드로이드에서 사용하는데 필요한 라이브러리로 동일한 설정을 해주었습니다.


하지만 signed apk 파일을 생성하고 나면 통신과정에서 Netty 라이브러리가 정상적으로 작동하지 않고 Exception이 발생하더군요. 저의 경우는 Unknown type parameter 'I' 라는 메시지가 떴습니다.


proguard 설정하지 않은 debug apk 은 정상적으로 작동하는데 배포작업하여 proguard가 적용된 apk 는 정상작동하지 않는 것으로 보아 proguard 설정이 문제라 생각되었지만, 이유를 찾지 못하고 1시간을 해맸습니다.


하지만 우리의 구글링, 스택오버플로 사이트는 정말 신이 내린 사이트입니다.;;


URL : http://stackoverflow.com/questions/12924425/how-do-you-stop-proguard-from-removing-type-parameters?answertab=active#tab-top


위 사이트에 제시되어 있는 답변을 적용하였습니다. 바로 정상적으로 작동하였습니다.


위에 적혀있는 설정과 더불어, 다음 한줄을 추가해주었습니다.


-keepattributes Signature


위 설정을 하는 이유는 아래와 같다고 합니다.


The "Signature" attribute is required to be able to access generic types when compiling in JDK 5.0 and higher.


잠들기 전까지 고민하던 것이 한줄로 해결되니 기쁘기도 하고 씁슬하기도 하고 하더군요. 끝.

반응형