IT_Programming/Android_Java

[펌] Android project에 proguard 적용하기

JJun ™ 2011. 2. 14. 12:53

------------------------------------------------------------------------------------------------

              출처: http://samse.tistory.com/entry/usage-of-proguard-on-androidproject

------------------------------------------------------------------------------------------------

 

상용이던 개인용이던 안드로이드는 자바 코드를 사용하기 때문에 dex tool과 jad tool 등을 이용하면 decompile을 통한 reverse engineering이 가능하다.

이를 해결하기 위해 코드난독화툴을 이용하여 reverse를 어렵게 하는 방법을 사용하게 된다.

 

proguard는 코딩을 어떻게 하느냐에 따라 난독이 아니라 불독(?)하게도 가능하다.

즉, 전혀 해독이 불가하게 할 수도 있다는 것이다.


proguard툴은 stand-alone형태로 사용해도 되나 android project에 포함시켜서 구동시키면

좀 더 쉽게 사용이 가능해진다. 이 포스트는 그 방법에 대해 설명한다.

 


[요구사항]

 

1. Android SDK version 7이상을 사용해야 함
   → ANT 빌드규칙에 컴파일 이전과 이후 단계에서 일정한 작업을 추가할 수 있는 구조를 지원한다.

 

2. Proguard 설치

 


[절차]

 

커맨드라인에서 수행함.

 

1. 특정 프로젝트에 대한 build.xml을 만듦
    android update project --path ./MyAndroidProject
    build.xml파일이 생성됨. 실제 빌드를 아래와 같이 수행.
    ant release
    빌드가 되고 서명되지 않은 앱이 생성됨. 이 후 서명툴을 이용하여 서명된 앱을 만들수 있음.

 

2. 서명된 앱 빌드하기
    ant release명령으로 빌드하면 빌드과정에서 생성된 local.properties파일을 수정
    key.store=/Path/to/my/keystore/MyKeystore.ks
    key.alias=myalias
    ant release

 

3. 코드 난독화과정 
  add-proguard-release.xml, procfg.txt파일을 build.xml파일 위치에 복사
  local.properties에 proguard설치 경로 지정
  proguard.dir=/Directory/Proguard/proguard4.5.1/lib
  build.xml에(최상단에 위치) 아래 내용 추가
    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE project [
      <!ENTITY add-proguard-release SYSTEM "add-proguard-release.xml">
    ]>
  build.xml의 project tag안에 위에서 선언한 XML entity를 포함시킴
    <project name="MyProjectName" default="help">
    &add-proguard-release;

 

  위의 모든과정이 완료되었으면 빌드
    ant release

 

**  주의 사항  **
난독화 도구를 사용하는 경우 빌드후 앱이 정상적으로 동작하지 않을 수있다. 이는 난독화를 하지 않아야

하는 부분들까지도 난독화가 이루어져서 코드가 동작하지 못하는 경우가 발생하는 경우이다.

예를 들어 AndroidManifest나 class name, jni or reflection등을 통해 실제 메소드의 이름을 참조하고 있는 메소드들까지도 난독화를 통해서 작업이 이루어질 수 있다. 첨부된 procfg.txt에는 이런 룰을 지정할수가

있습니다. 이는 proguard 인자들중 keep인자 파라메터를 지정하는 방법에 따름인데 아래와 같은 명령을

추가하면 클래스이름을 찾지 못하는 문제는 방지 가능하다.


-keep public class * [my classname]

** 빌드중 obj directory가 생성되는데 여기에는 디버깅을 위한 다양한 출력 파일들이 저장된다.  

    디버깅시 이용 가능하다.

 

** mapping.txt 은 클래스가 어떤식으로 난독화 되었는지 기록한다.

 

** mac에서만 발생하는지 확인되지 않았으나 위 과정 진행중.. 아래와 같은 에러 메세지가 나올 수 있다.
    add-proguard-release.xml:31: Expecting class path separator ':' before ';' in argument number 1
    이 경우 add-proguard-release.xml파일의 line35을 아래와 같이 수정하면 된다.
    -libraryjars ${external.libs.dir};${libraryjarpath} -> -libraryjars ${external.libs.dir}:${libraryjarpath}

 

참고 할 만한 사이트

: http://adwithpark.blogspot.com/2010/11/how-to-protect-your-source-code-of.html

  http://v.daum.net/link/12412211

  http://blog.naver.com/PostView.nhn?blogId=huewu&logNo=110095467968&viewDate=¤tPage=1&listtype=0

 

build.xml

 

config.txt


procfg.txt
0.0MB
config.txt
0.0MB
build.xml
0.03MB
add-proguard-release.xml.html
0.0MB