본문 바로가기

모바일프로그래밍/Android

Proguard 적용하기


Proguard는 소스를 난독화하여 디컴파일에 의해 소스코드가 노출되는 것을 방지하기 위해 사용됩니다. Proguard를 적용하면 보안 향상 뿐 아니라 약간의 최적화가 이루어진다고 하니 앱 개발을 완료한 후 꼭 적용하는 것이 좋을 거 같습니다.



최신 ADT에서는 Progaurd를 기본 지원하여 Proguard 적용이 보다 간편해 졌습니다. 최신 ADT가 설치된 Eclipse에서 안드로이드 프로젝트를 생성하면 프로젝트의 루트 폴더에 proguard.cfg와 project.properties 파일이 생성되어있는 것을 확인할 수 있습니다. Progaurd 적용을 위해서는 project.properties 파일안에 아래의 코드 한줄만 추가하면 됩니다. 

proguard.config=proguard.cfg 



Proguard의 적용은 일반 컴파일에서는 안되고 Export signed Application Package를 실행해 서명된 apk 파일을 생성할 때만 적용됩니다. Proguard가 정상적으로 적용되게 되면 apk 생성 후 프로젝트안에 proguard 폴더가 만들어지며 그 안에 dump.txt, mapping.txt, seeds.txt, usage.txt 파일들이 생성됩니다.

- dump.txt : 애플리케이션에서 사용중인 클래스들의 내부 구조에 대한 대략적인 정보
- mapping.txt : 난독화 과정에서 기존 클래스 혹은 메서드가 어떤 새로운 난독화된 이름으로 매핑되었는지 그 목록. 난독화된 애플리케이션에 발생하는 로그나, 스택 트레이스 들을 분석하기 위해 필요
- seeds.txt : 난독화되지 않은 클래스와 멤버들의 목록
- usage.txt : 사용되지 않아 apk 파일에서 제거된 코드들의 목록 (proguard.cfg 설정 내용에 따라 적용되지 않는 경우 있음)

여기서 mapping.txt 파일은 난독화된 애플리케이션에서 발생하는 로그, 스택트레이스 등을 분석하기 위해 반드시 필요하므로 잘 보관해 두어야 합니다. 버전 업 후 Proguard 재적용시 새로운 mapping.txt가 덮어쓰여지게 되므로 버전 별로 mapping.txt를 잘 보관해 두어야 할 듯 합니다. 

 
proguard.cfg에는 Proguard와 관련된 옵션을 설정해주는데 자세한 설정 방법은 Proguard 설명서를 참조하시면 됩니다. (사실 저도 잘 몰라요..^^;)



여기까지는 일반적인 Proguard 적용법이구요.. 외부 라이브러리를 사용한 경우에는 Proguard를 적용하는 과정에서 에러가 발생됩니다. 저도 이 에러 때문에 애를 좀 먹었는데 이러한 경우 에러를 해결하기 위해서는 외부라이브러리를 제외하는 옵션을 지정해 주어야 합니다. 구글에서 찾아본 결과 project.properties 파일에 -external.libs.dir=libs 를 추가하면 된다는 말도 있던데 저는 이렇게 해도 에러가 사라지지 않더군요. 그래서 저는 progaurd.cfg 파일 안에 -dontwarn 옵션을 추가하여 외부라이브러리를 난독화에서 제외하도록 했습니다. 그랬더니 에러없이 잘 되더군요.

-dontwarn 클래스명(같은 패키지에 속한 다수의 클래스를 지정하려면 패키지명.** 로 지정)

 
 
그리고 ADT에 포함되어 있는 Proguard는 구형 버전이라고 하더군요. 기왕이면 최신 Proguard를 다운로드 받아 설치하는 것이 좋겠죠.^^ 최신 Proguard 의 다운로드는 아래의 링크에서 하면 됩니다.


zip파일을 다운로드 후 압축을 풀어 나오는 폴더 중 lib, bin 폴더를 Android SDK가 설치된 폴더의 tools/proguard 경로에 덮어쓰기 하면 됩니다.


또한 Android SDK 나 프로젝트의 경로에 공백이 포함되어 있는 경우 Proguard 적용시 에러가 발생한다는 말도 있으니 혹시나 알 수 없는 에러가 계속 발생한다면 경로를 확인해 보는게 좋을거 같습니다.




참고 : 모든 것은 나의 뜻대로 - 안드로이드에 Proguard 적용 (이클립스)
         지똥이 - Android Proguard 설정법 libs 라이브러리 포함
         휴휴휴 - 안드로이드 이클립스에서 Proguard(프로가드) 사용하기