본문 바로가기

운동하는 개발자/Android

안드로이드 소스코드 난독화, 최적화 / Android Proguard rules(optimization, Obfuscated)

728x90

안드로이드(자바)는 Managed Code 특성상 기본적인 디컴파일 툴로 디컴파일이 쉽게 된다

그러므로 외부로 나가는 라이브러리(.aar) 혹은 앱(.apk, .abb)는 난독화가 필수라고 볼 수 있다
(난독화 테스트를 위해 JD-Gui를 받아놓자 다운로드 링크)

그러므로 난독화 방법을 알아보자


기본으로 생성되어있는 build.gradle

안드로이드 프로젝트에서 build.gradle을 열어주면 위와 같이 화면에 보이는데

중간쯤 "androud {"  경로 하위에 "buildTypes {" 하위 "releases {"를 보게 되면
minifyEnabled 값이 false로 되어있는데 이것만 true로 바꿔주면 된다

해당 값은 난독화 뿐만 아니라 최적화 작업도 자동으로 진행된다

만약 디버그앱도 난독화가 필요하다면 아래와 같이 buildTypes 하위에 넣어준다

debug {

minifyEnabled true

proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'

}

빌드해서 위에서 언급했던 디컴파일 툴로 디컴파일하여 각 클래스 함수,변수 명이 a,b,c등으로 변경된것을 확인해 보자


※ 여기서 주의할점으로 라이브러리(.aar)파일을 만들거나 하여 해당 프로젝트에 접근이 필요할 경우
난독화 시키면 해당 함수를 찾기못해서 접근하지 못한다 public 조건이라도!

그래서 난독화를 예외하는 작업이 필요하다

프로젝트에서 proguard-rules.pro를 열어 본 모습
가장 하단에 예외 할 내용을 추가해 주면되는데 조건은 다음과 같다 

keep class [패키지명]** {public *;} 
: 해당패키지명 포함 하위경로 클래스에 public 타입은 예외

-keep class [패키지명]** {*;} 
: 해당패키지명 포함 하위경로 클래스에 모든타입은 예외

-keep class [패키지명] {*;} 
: 해당패키지명 클래스에 모든타입은 예외

-keep interface [패키지명] {*;} 
: 해당 인터페이스에 모든 타입은 예외

추가로 참고할 점으로 private된 변수값에 난독화 예외처리 된 생성자 혹은 getter, setter 등으로 접근하더라도 변수가 난독화 되어있다면 접근하지 못한다 이게 참 애매하긴하다;;

위 조건을 잘 정의해서 최대한 난독화 시키도록 설정하자


가독성을 위해 반말로 적고있습니다

틀린내용이나 질문은 댓글로 남겨주세요

참고 페이지 : developer.android.com/studio/build/shrink-code

728x90