[Android] 코드 난독화 및 앱 축소

박주호·2022년 5월 5일
0

Hi, Android

목록 보기
3/7
post-thumbnail

코드 난독화 및 앱 축소

🙋‍♀️ 안드로이드 앱 보안이 중요한 이유

코드를 빌드하면 .aab 혹은 .apk 파일 형태로 생성이 된다.

이를 통해 플레이스토어에 게시하고 사용자들이 앱을 사용하는 형태이다.

단순히 봤을 때 해당 형식들은 일반적으로 볼 수 없다고 생각할 수 있지만 단순 압축에 불과하다.

따라서 생성된 파일은 디컴파일 과정을 통해 제3자가 앱의 구조와 코드를 확인할 수 있으며 리버스 엔지니어링 또한 가능하다는 이야기이다.

실제로 현재 진행중인 프로젝트의 앱을 안드로이 스튜디오에서 확인해보았을 때 다음과 같이 폴더 구성을 확인할 수 있다.

폴더명까지 자세하게 확인할 수 있다.

폴더명까지 자세하게 확인할 수 있다.

하지만 앱을 난독화한 경우 아래와 같다.

폴더 및 파일들이 난독화된 모습이다.

폴더 및 파일들이 난독화된 모습이다.

이처럼 난독화 과정을 거치면 3자가 앱의 구조 및 코드를 확인할 수 없게된다.

🙋앱 최적화를 해야하는 이유

앱을 만들다보면 사용하지 않는 이미지나 폰트 등의 리소스가 생기곤 한다.

이러한 리소스들을 최적화 하지 않고 빌드를하면 앱의 크기는 보다 커질 것이다.

이렇게 커진 앱들은 사용자 디바이스에 고스란히 담길 것이고 사용자들이 저장공간이 부족하거나 크다고 여겨지는 앱들 중 생각하게 된다면 서비스중인 앱을 제거할 가능성도 있다. 그렇기 때문에 앱의 크기는 최소한으로 만들어주는 것이 좋다고 생각한다.

따라서 출시하는 앱의 불필요한 리소스를 최적화 해주어야하는데 가장 좋은건 사용하지 않는 리소스를 프로젝트에 포함하지 않는 것이지만 규모가 커지면 하나하나 점검하기 어렵기 때문에 휴먼에러가 발생할 가능성이 존재하며 앱 최적화를 구현해주는 것이 좋다.

구현

R8을 통해 간단히 구현이 가능하다.

공식문서에 나온 R8 컴파일러의 역활은 다음과 같다.

  1. 코드 축소
  2. 리소스 축소
  3. 난독화
  4. 최적화
android{
	...

	buildTypes{
		release{
			minifyEnabled true
      shrinkResources true
      proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
		        signingConfig signingConfigs.release
		}
	}
	...
}

단 세줄이면 된다. 게다가 proguardFiles는 기본적으로 세팅이 되어있다.

  • minifyEnabled : 사용하지 않는 코드들을 제거해주고 코드를 난독화 해준다.
  • shrinkResources : 사용하지 않는 리소스들을 제거해준다.
  • proguardFiles : 난독화가 되면 안되는 파일들을 정의한다.

난독화 방지

  1. proguard-rules.pro 파일 이용

app 폴더에 존재하며 -keep문을 추가해줌으로써 난독화 항목에서 해당 클래스를 제외할 수 있다.

-keep class com.dynamicmedia.webviewbasic.* {*;}
  1. 어노테이션 이용

@Keep 어노테이션을 이용해 개별 클래스를 난독화에서 제외해 줄 수 있다.

@Keep
class test()

결과

소스코드 변경없이 R8을 이용해서 10.6MB → 6.9MB, 약 35% 감소한 결과를 볼 수 있었다.

참고

R8을 이용해 안드로이드 앱을 최적화하고 코드 유출 방지하기 : minifyEnabled, shrinkResource, proguard

profile
항상 배우려는 자세로

0개의 댓글