안드로이드 소스코드 난독화, 최적화 / Android Proguard rules(optimization, Obfuscated)
안드로이드(자바)는 Managed Code 특성상 기본적인 디컴파일 툴로 디컴파일이 쉽게 된다
그러므로 외부로 나가는 라이브러리(.aar) 혹은 앱(.apk, .abb)는 난독화가 필수라고 볼 수 있다
(난독화 테스트를 위해 JD-Gui를 받아놓자 다운로드 링크)
그러므로 난독화 방법을 알아보자
안드로이드 프로젝트에서 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 등으로 접근하더라도 변수가 난독화 되어있다면 접근하지 못한다 이게 참 애매하긴하다;;
위 조건을 잘 정의해서 최대한 난독화 시키도록 설정하자
가독성을 위해 반말로 적고있습니다
틀린내용이나 질문은 댓글로 남겨주세요