안드로이드에 Proguard 적용 (이클립스)

  • 사용 목적
    • 코드 난독화 (보안 이슈)
    • 아울러 코드 최적화
  • Proguard 다운로드
  • Proguard 설치 경로
    • $ANDROID_SDK_HOME/tools/proguard (대개 $ANDROID_SDK_HOME = c:\progra~1\android\android-sdk\
  • 적용 과정
  • 주요 과정
    • 이클립스에서 생성한 안드로이드 프로젝트 루트에 project.properties 파일이 있다. 이 파일 맨 밑에 'proguard.config=proguard.cfg'를 추가한다.
    • 루트에 proguard.cfg 파일이 있다. 이 파일에 난독화 관련 설정 내용을 작성한다. (jni 네이티브 예외처리 등 기본적인 내용이 작성되어 있다)
    • 이후 프로젝트 루트 > (마우스 우측) > [Tools] > [Export signed Application Package]를 실행해 서명된 apk 파일을 생성한다.
    • apk 생성 후 프로젝트 폴더/proguard/ 아래에 만들어지는 텍스트 파일은 다음과 같다. (적용 유형에 따라 생성되지 않는 파일이 있다)
      • dump.txt :  어플리케이션에서 사용중인 클래스들의 내부 구조에 대한 대략적인 정보
      • mapping.txt :  난독화 과정에서 기존 클래스 혹은 메서드가 어떤 새로운 난독화된 이름으로 매핑되었는지 그 목록. 난독화된 애플리케이션에 발생하는 로그나, 스택 트레이스 들을 분석하기 위해 필요
      • seeds.txt : 난독화되지 않은 클래스와 멤버들의 목록
      • usage.txt : 사용되지 않아 apk 파일에서 제거된 코드들의 목록 (proguard.cfg 설정 내용에 따라 적용되지 않는 경우 있음)
    • 위 과정으로 진행되지 않거나 생성된 apk 파일이 제대로 작동하지 않으면 아래와 같이 진행
      • project.properties
        • target=android-8
        • -external.libs.dir=libs  //라이브러리 file 제외
        • proguard.config=proguard.cfg // Proguard 설정
      • proguard.cfg
        • -verbose //로그 봄
        • -dontoptimize // 압축 하지 않음 그냥 하지말자...
        • -dontshrink //사용하지 않는 메소드를 유지하라
        • -keep public class 별표 { public protected 별표; }
        • public class 와   protected class를 난독화하지 않는다.
  • 주의사항
    • 파일 경로, 안드로이드 SDK 경로 모두 공백이 들어가면 오류 발생 (파라미터 분할을 공백으로 하기 때문에 경로에 공백이 끼어 있으면 이를 분할된 파라미터로 인식하기 때문)
      • 소괄호 (, )가 들어가도 오류 발생
      • 프로젝트를 생성할 때부터 경로 설정에 신경써야 한다
    • 또한 jni가 직접 사용하는 클래스 예외 처리는 필수다.
    • 아울러 예외처리를 위한 * 연산자 사용시 하위 패키지를 일일이 지정해 예외처리를 해 줘야 한다.
      • com.mcenter 하위 모든 클래스에 대한 예외 처리는 다음과 같다.
        • -keep public class net.comple.* { public protected *; }
        • -keep public class net.comple.data.*{ public protected *; }
        • -keep public class net.comple.eventListener.* { public protected *; }
    • 안드로이드 SDK 업데이트시 Proguard가 구버전으로 돌아간다. 따라서 다시 Proguard 최신 버전을 받아 살포시 덮어 준다.
      • APK 생성시 'conversion to Dalvik format failed with error 1' 오류를 뱉어낸다.
  • 프로젝트 적용 내용
    • 기존 proguard.cfg 내용 따름
    • 단, jni에서 직접 다루는 클래스인 com.mcenter 하위 모든 클래스에 대해 예외 처리 적용
    • shrink, optimize 적용
신고
RSS :
Response
0 Trackback 0 Comment