2013년 2월 17일 일요일

android - proguard

코드 난독화 및 최적화를 위한 툴로 Android 2.3인 진저브레드부터 Android SDK에 내장되었습니다.
소스코드에 공개될 경우 문제가 되는 정보가 담겨 있는 경우 반드시 proguard를 적용해야 합니다.


설정방법

1. proguard 설정 파일 지정
project.properties파일에 proguard.config=[프로가드설정파일] 형태로 명시합니다.
 예) proguard.config=proguard-android.txt


2. proguard 설정 파일 생성
Android SDK 홈 디렉토리 밑에 /tools/proguard 디렉토리가 존재합니다.
해당 디렉토리에는 proguard-android.txt 파일과 proguard-android-optimize.txt 파일이 있습니다.
이는 최적화 적용 여부에 따라 두개의 파일로 구분해 놓은 것 입니다.
처음 proguard를 적용하는 개발자라면 proguard-android.txt 파일을 사용하여 적용하길 권장합니다.


3. proguard 설정
proguard-android.txt 파일을 프로젝트 홈디렉토리에 복사하였다면 기본적인 proguard 옵션이 적용이 된 것입니다.

기본 적용된 옵션은 다음과 같습니다.
-dontusemixedcaseclassnames : 대/소문자 섞인 클래스 이름을 허용하지 않음
-dontskipnonpubliclibraryclasses : public library가 아닌것을 무시하지 않게 함
-verbose : 로그를 표시함
-dontoptimize : 최적화를 사용하지 않음
-dontpreverify : 사전 검증기능을 사용하지 않음

기본 적용된 설정은 다음과 같습니다.
- Annotation 유지
- 네이티브 메소드 유지
- android.view.View에서 상속받은 public class의 getter/setter 메소드 유지
- android.app.Activity에서 상속받은 public class의 메소드중 android.view.View 인자를 갖는 메소드 유지
- enumeration class의 일부 static 메소드 유지
- android.os.Parcelable interface를 구현한 class 및 Parcelable$Creator를 리턴하는 메소드 유지
- R 리소스 클래스의 static 필드 유지
- android support 라이브러리 유지

이외 자신이 개발한 프로젝트에 다음과 같은 항목을 사용중이라면 추가적인 적용을 해야 합니다.

 1) 미사용 코드를 제거하는 기능이 있는데 혹 잘못 판단되어 사용되는 코드가 제거 될 수 있습니다. (Injection 패턴과 같이 참조 방식을 사용하지 않은 코드라면 가능성이 높습니다.)
 적용 예)
 -dontshrink

 2) WebView의 addJavascriptInterface() 메소드를 사용하여 Javascript 연동 코드를 사용하신다면 등록되는 Object class의 메소드는 유지되어야 합니다.
 -keepclassmembers class [클래스 풀네임] {
    <methods>;
}

 3) Class.forName과 같이 동적로드를 사용하는 코드에서 로드되는 class는 유지되어야 합니다.
 적용 예)
 -keep public class [클래스 풀네임]

 4) 외부 라이브러리 proguard 적용시 경고 무시
  -dontwarn 명령으로 패키지 명을 지정하여 지정 가능하며 해당 패키지로 시작하는 모든 패키지를 적용할 경우 뒤에 **로 지정
  적용 예)
  -dontwarn [시작 패키지명].**

 5) 외부 라이브러리 사용 설정
  - 사용된 외부 라이브러리를 proguard가 찾지 못할 경우 -libraryjars 명령으로 라이브러리를 지정한다. (APK에 포함되는 라이브러리는 설정 할 필요없음)
  적용 예)
  -libraryjars [라이브러리파일경로]/[라이브러리파일명].jar


참고)
proguard 설정 대상을 지정하는 방법들
 1) 단일 클래스 지정
  [클래스 풀네임]
  예) com.test.main.TestClass
 2) 패키지명 필터링
  [시작패키지명].**
  예) com.test.**
 3) interface 구현 클래스 모두
  class implements [인터페이스 풀네임]
  예) class implements com.test.define.TestInterface
 4) 상속받은 subclass 모두
  class extends [클래스 풀네임]
  예) class extends com.test.AbstractClass


참고 URL
http://developer.android.com/tools/help/proguard.html

http://proguard.sourceforge.net


댓글 없음:

댓글 쓰기