본문 바로가기

Programming/Android

android obfuscate(난독화) 사용하기.

[참고] : http://serlya.tistory.com/tag/android%20proguard


난독화? 또는 흐리게하다?


어떤 표현인지는 잘 모르겠으나, 자바 프로젝트에서는 많이 사용하고 있는 방법인듯 하다.

아마도 디컴파일을 이용한 소스코드를 보안을 목적으로 하는듯 하다. 


정확히 어떤 기능을 하는지는 아직 파악 못하고 있다.

나중에 자세히 알게 되면 추가적인 코멘트를 하리...

우선 환경 설정이 중요하다. 
아래와 같이 다음 3가지가 준비되어있어야 한다.
ant, java, android
이 3가지의 환경을 아래처럼 잘 설정해주면 된다.
ant, java, android 설치 및 환경설정은 알아서 잘 해주길 바란다.

0. 환경설정
    - ANT_HOME
    - ANDROID_HOME
      + /Users/erato/android-sdk-mac_x86
    - JAVA_HOME
      + Mac OsX에서의 JAVA_HOME은 /Library/Java/Home이다.
    - PATH
      + export=
$ANDROID_HOME/tools:$ANDROID_HOME/platforms/android-8/tools:$PATH

1. pro_guard 설치

    - 다운로드

    - 압축 해제후 %JAVA_HOME%/lib 에 proguard.jar 파일 복사 

2.android update project 
    - 아래 명령어를 command line에서 실행한다.
    android update project --path 'project_name'
    $ android update project --path ./MediaPlayerTest/ 
       Updated local.properties
       Added file ./MediaPlayerTest/build.xml
       Updated file ./MediaPlayerTest/proguard.cfg
   - build.xml을 추가하면 성공한 것임. 

3. ant release

   - command line에서 다음을 실행한다.
   $ ant release 

4. key 생성 
    - 여기를 참고하여 key를 생성.

5. local.properties에 생성한 key를 설정 및 proguard 경로 지정.
    - key.store=/workspace/android_keystore/MediaPlayerTest.keystore
    - key.alias=MediaPlayerTestKey
    - proguard.dir=/workspace/proguard4.6 

6. default.properties에 다음을 추가.
    - external.libs.dir=libs
    < 밑에  proguard.config는 추가하지 말자. > 

    - proguard.config=proguard.cfg

7. 빌드 도우미 파일들 이동

    - 아래에 첨부된 파일을 build.xml이 있는 폴더(프로젝트 폴더)로 복사.
    - 
add-proguard-release.xml  

    - procfg.txt


8. build.xml 수정

    - build.xml 파일을 열어서 맨 윗라인에 아래 내용을 추가.

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE project [<!ENTITY add-proguard-release SYSTEM "add-proguard-release.xml">]>

<project name="프로젝트이름" default="help">

&add-proguard-release;
</project>
 

9.  난독화 제외
    - procfg.txt 파일을 수정
    - 
keep public class * [my classname]

 

10. 빌드 시작.
    - command line에서 다음 명령으로 실행
    $ ant release 

    - 빌드하면서 keystore 비밀번호와 alias 비밀번호를 물어보는데 입력해 넣으면 빌드가 완료됩니다.

11. 빌드가 성공적으로 되면?
    - <project folder> 밑에 obf라는 폴더가 생기며 다음의 파일이 추가된다. 

  • dump.txt : 여러분의 어플리케이션에서 사용중인 클래스들의 내부 구조에 대한 대략적인 정보를 나타냅니다. 말그대로 난독화 하기 위해 소스를 분석하는 과정에서 나오는 덤프값들이겠조. 뭐. 
  • mapping.txt : 이 파일은 중요합니다. 난독화 과정에서 기존 클래스 혹은 메서드가 어떤 새로운 난독화된 이름으로 매핑되었는지 그 목록을 표시해 줍니다. 난독화 된 어플리케이션에 발생하는 로그나, 스택 트레이스 들을 분석하기 위해서 꼭 챙겨 두셔야 합니다.
  • seeds.txt : 난독화 되지 않은 클래스와 멤버들의 목록입니다.
  • usage.txt : 사용되지 않기 때문에, apk 파일에서 제거된 코드들의 목록입니다. 혹시 제거되서는 안되는 메서드나 클래스가 제거되었는지 꼭 확인해 봐야 합니다.
 

**  주의 사항  **
난독화 도구를 사용하는 경우 빌드후 앱이 정상적으로 동작하지 않을 수있다. 이는 난독화를 하지 않아야 하는 부분들까지도 난독화가 이루어져서 코드가 동작하지 못하는 경우가 발생하는 경우이다. 예를 들어 AndroidManifest나 class name, jni or reflection등을 통해 실제 메소드의 이름을 참조하고 있는 메소드들까지도 난독화를 통해서 작업이 이루어질 수 있다.
첨부된 procfg.txt에는 이런 룰을 지정할수가 있습니다. 이는 proguard 인자들중 keep인자 파라메터를 지정하는 방법에 따름인데 아래와 같은 명령을 추가하면 클래스이름을 찾지 못하는 문제는 방지 가능하다.

-keep public class * [my classname] 

Tip1>

참고) 안드로이드 블로그(http://android-developers.blogspot.com/2010/09/proguard-android-and-licensing-server.html)에서 배포한 add-proguard-release.xml로 적용시켜 해보니 빌드가 제대로 안되더군요. local.properties의 프로가드 path를 재설정해도 실패해서 add-proguard-release.xml를 수정하였습니다.(보통의 경우 프로가드 다운로드 받아 압축을 풀 경우 lib 폴더 안에 proguard.jar가 있습니다.)

add-proguard-release.xml 수정내용

19 line : <property name="proguard-jar" value="${proguard.dir}/lib/proguard.jar" />

Tip2>
또한 빌드중에 아래와 같은 에러가 발생한다면 아래처럼 해결하면 된당~~
그래도 혹시나 또 문제가 발생할까봐 mac에서 빌드에 성공했던 build.xml과 add-proguard-release.xml, default.properties, local.properties를 첨부한다. FIY~
 



add-proguard-release.xml:35: Expecting class path separator ':' before '{' in argument number 1 

Expecting class path separator ':' before '{' in argument number 1

12
BUILD FAILED/path/to/add-proguard-release.xml:35: Expecting class path separator ':' before '{' in argument number 1

How to fix (method #1)

add following line to your default.properties file:

1
external.libs.dir=libs

How to fix (method #2)

edit add-proguard-release.xml and replace

1
<pathelement path="${external.libs.dir}"/>

with

1
<!--pathelement path="${external.libs.dir}"/-->
  • Posted on December 22, 2010
  • 1 comment
  • Tagged bugandroidproguardhowto
  •  

    Tip3>
    혹시 빌드중에 이런 에러가 발생하면 링크할 라이브러리를 넣어달라는거다
     [proguard] Warning: com.sigma.android.tv.scan.TVChannelScannerUpnp: can't find referenced class com.sigma.android.tuner.Tuner
     [proguard] Note: the configuration refers to the unknown class 'com.android.vending.licensing.ILicensingService'
     [proguard] Note: there were 1 references to unknown classes.
     [proguard]       You should check your configuration for typos.
     [proguard] Warning: there were 47 unresolved references to classes or interfaces.
     [proguard]          You may need to specify additional library jars (using '-libraryjars').

    문제 해결은 /Users/erato/Documents/workspace/OfuTVManager/add-proguard-release.xml:35: Please correct the above warnings first.를 참고해보면 간단하다.

     add-proguard-release.xml을 열어서 35번째 라인에 다음처럼 라이브러리를 추가해준다.
    -libraryjars ${libraryjarpath} : /TVCommon/libs/com.sigma.android.jar


    수정한 add-proguard-release.xml를 첨부하니 참고하면 되겠다. 


    Tip4>
    혹시 proguard가 동작하지 않는것처럼 보이면
    AndroidManifest.xml를 열어서 다음을 확인해보자.

     
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
            package="com.sigma.android.tv.launcher"
            android:versionCode="145"
            android:versionName="1.4.5">
            <application
                    android:icon="@drawable/icon"
                    android:label="@string/app_name"
                    android:theme="@android:style/Theme.NoTitleBar.Fullscreen"
                    android:debuggable="true"
            >
    위에서 android:debuggable="true" <-- 이녀석때문에 ant release가 안먹었던것이다.
    삭제하던가 아니면 ant debug로 실행하던가..
    근데 release할거니까 삭제가 맞겠지? ^^