Android Proguard 설정법 libs 라이브러리 포함

android 2011. 12. 27. 20:31 Posted by jiddong
프로가드가 많이 바뀌었다..
요즘적용을 안하다보니... 최신기준으로 수정 작성함

기본 프로젝트 생성을 하면

proguard-project.txt  = 프로가드 세팅 파일
project.properties = 프로젝트 세팅파일

project.properties 프로젝트 세팅파일에  프로가드 사용 여부 주석을 해제 하자
#proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt
해제방법은 # 을 삭제

안드로이드 signkey 로 바이너리를 만들면  

자동으로  Proguard 설정되어짐 확인방법은

android proguard 폴더 아래 4개의 File 생성되야 적용된것임

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

  


문제가 생길시 파일 설정방법(라이브러리 추가나 메소드가 변경되어 메소드등이 없다고 나올때)

project.properties  File

#프로가드 사용여부

proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt

#프로젝트  지정 sdk 본인의 프로젝트에 알맞은 sdk 사용

target=android-17 


proguard-project.txt  File


-verbose //로그 봄
-dontoptimize // 압축 하지 않음 그냥 하지말자... 
-dontshrink  //사용하지 않는 메소드를 유지하라

-dontwarn org.apache.**  
-dontwarn (Warnig이 나온 클래스).** 
// 빌드시 can't find superclass or interface // can't find referenced class 등의  Warnig 이 나올경우
//클래스 Warnig 을 무시 한다 

-libraryjars libs/android-support-v4.jar // 라이브러리 추가
-libraryjars libs/json-simple-1.1.1 .jar

-keep public class * { public protected *; } 
//public class 와   protected class 의 경우 를 난독화 하지 않는다. 
//public class 를 난독화 할경우 메소드 호출중 문제가 될수 있음....

-keep class org.apache.http.** //org.apache.http.하위 클래스를 전부 난독화 하지 않음 
-keep interface org.apache.http.** //org.apache.http.  하위 인터페이스를 난독화 하지 않는다

-keep class  org.apache.http.** {

public *;

// org.apache.http.하위 클래스중 public method 만 난독화 하지 않음

난독화후 어플리케이션 실행하여 돌려보면서 난독화 범위를 적용해야함.













Android Java Script를 이용하여 Android APP을 만들때 script file과 html file을 asset 에 저장을 해서

java script 를 사용할경우 

바이너리 배포시에 APK 파일안의 assets 폴더를 볼수있기때문에 보안적 이슈가 생깁니다.

예를 들어 key 값이나 로직등등~

예방할 방법은 하드코딩으로으로 Html 이나 Java script file를 String 으로 java class 안에 가지고 있고
스크립트 사용시   Html 이나 Java script file 을 local 에 생성하여 사용하면 됩니다.

Progard 를 적용한다 하여도 String 객체는 안적용된다는 말이있는데 확인을 해봐야할듯;; 

디컴 파일 해서 그렇게 까지 보고싶으면 어쩔수 없뜸 ㅋㅋ


그런데! 제가 하루동안 헤매인 이유는 local에 저장을 했을 경우 그 위치가 어디인가 입니다.

그 위치는

file:///data/data/패키지 이름/files/파일명입니다~

그리구 만약 스크립트 안의  src='script.js'  요런 부분 도
  src='file:///data/data/패키지/files/script.js'  요리 바꿔줘야겠죠~ ㅋ

아래는  String 을 local file 로 저장하는 함수

 

  1. /**
  2.          * java script html file  을 <br>
  3.          *file:///data/data/패키지명/files/ 위치에 생성해준다.<br>
  4.          *
  5.          * @param oContext
  6.          * @return String HTML 파일 위치 값
  7.          */
  8.         private String copyHTML(Context oContext){
  9.                  String sResult = null;
  10.                  try {
  11.  //기존 HTML file 삭제 file 양이 크지 않아 삭제후 재 복사하여도 속도에 이슈가 없어서
  12.  //훗날 업데이트시 스팸메일 변경을 대비하여 삭제하고 재 생성
    // 파일의 크기가 클경우 생성후 있으면 재생성하지 않는 로직 필요
  13.                          deleteHTML(oContext);
  14.                          
  15.                         oContext.getFilesDir();
  16.                 File oDir = oContext.getFilesDir();
  17.                 oDir.mkdir();
  18.                 File oFile = new File(oDir.getAbsolutePath()+"/" + FILE_NAME);
  19.                 String sPath = oFile.getAbsolutePath();
  20.                
  21.                 //파일이 있을경우
  22.                 if(oFile.exists()){
  23.                         sResult =  "file://" + sPath;
  24.                         return sResult;
  25.                 }
  26.                                                
  27.                 FileOutputStream fo = new FileOutputStream(oFile);                    
  28.                 OutputStreamWriter osw = new OutputStreamWriter(fo);
  29.                 BufferedWriter bw = new BufferedWriter(osw);
  30.                
  31.                 bw.write(SPAM_HTML); // local 에 저장할 문서 
  32.                 bw.flush();
  33.                
  34.                 bw.close();
  35.                 osw.close();
  36.                 fo.close();
  37.  
  38.                 sResult =  "file://" + sPath;
  39.                
  40.         } catch (FileNotFoundException e) {
  41.                 sResult = null;
  42.                 deleteHTML(oContext);
  43.                         e.printStackTrace();
  44.          } catch (IOException e) {
  45.                  sResult = null;
  46.                  deleteHTML(oContext);
  47.                   e.printStackTrace();
  48.          }
  49.                
  50.                 return sResult;
  51.          }
  52.  
  53.  
  54.         /**
  55.          * 파일 유무확인해 HTML 파일이 있을경우 삭제
  56.          * @param oContext
  57.          */
  58.         private void deleteHTML(Context oContext) {
  59.                 oContext.getFilesDir();
  60.                 File oDir = oContext.getFilesDir();
  61.                 oDir.mkdir();
  62.                 File oFile = new File(oDir.getAbsolutePath() + "/" + FILE_NAME);
  63.  
  64.                 // 파일이 있을경우
  65.                 if (oFile.exists()) {
  66.                         oFile.delete();
  67.                 }
  68.         }

만약 Android Javascript WebView client 를 모른다! 

http://developer.android.com/guide/webapps/webview.html 

디벨로퍼에 가시면 자세히 나와있습니다~~