안드로이드 Proguard적용 시, 반드시 알아야할 4가지

SSY·2023년 3월 17일
0

Decompile

목록 보기
2/2

시작하며

사실, 필자가 지금 서술하려는 내용은 [안드로이드 공식 홈페이지 프로가드 부분]에 모두 나온 내용이다. 하지만 빠른 앱개발을 위해선 개발 지식에 대한 메타인지를 쌓는 것이 무엇보다 중요하다. 정리겸 해당 글을 작성한다.

그럼 공식 홈페이지를 보면 되지 이 글을 볼 필요가 있을까?
라고 생각하시는 분들을 위해, 위 [안드로이드 공식 홈페이지 프로가드 부분]에 나온 내용들 중 '핵심'만 간략히 추려 작성해볼까 한다.

프로가드를 적용함에 있어서 기억해야할 부분은 4가지 요소이다.

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

1. 코드 축소

release버전으로 앱을 빌드할 때, '사용하지 않는 코드를 삭제하는 작업'을 의미한다. 이때의 코드는 다음을 의미한다.

  1. 의존성 라이브러리에 추가된 미사용 필드, 메서드, 클래스
  2. 패키징된 앱의 미사용 필드, 메서드, 클래스

    (출처 : [안드로이드 공식 홈페이지 코드 축소 부분])

2. 리소스 축소

이는 위 1번 코드 축소와 내용이 상당히 유사하다.

  1. 의존성 라이브러리에 추가된 미사용 리소스 파일들
  2. 패키징된 앱의 미사용 필드, 메서드, 클래스의 리소스 파일들

3. 앱 난독화

1번의 코드 축소와 2번의 리소스 축소를 진행했다면, 이제 '우리가 앱 내에서 사용하는 필드, 메서드, 클래스에만 프로가드가 적용된다.

하지만 사용되는 필드, 메서드, 클래스라 하더라도 이들에게도 보안을 적용할 필요가 있다. 즉, 앱 난독화라는 작업은 다음과 같다.

  • 패키징된 앱에 사용되는 필드, 메서드, 클래스(의존성 라이브러리 포함)의 네이밍을 줄이는 작업
    [Android 공식 홈페이지의 난독화 사례]

    [필자의 앱 난독화 사례]

4. 코드 최적화

이는 1번의 코드 축소와 의미가 유사하다고 생각하면 된다. 코드 축소가 사용하지 않는 필드, 메서드, 클래스를 '삭제'하는 작업이었다. 물론, 의존성 라이브러리도 포함이었다.

하지만 코드 최적화는 R8컴파일러가 앱 내에서 사용하지 않는 코드를 삭제하기 위하여 소스 코드를 재작성하는 과정이다.

예를 들면 다음과 같은 과정을 거친다.

[코드 최적화 예시]

  • 사용하지 않는 else문을 삭제
  • 특정 호출 메서드가 한 곳에서만 호출될 경우, 이를 inline으로 처리 및 해당 메서드를 삭제
  • 추상 클래스에 매핑되는 구현 클래스가 하나만 있을 경우 이를 결합해준다던지 하는 경우이다.
    (출처 : 안드로이드 공식 홈페이지 코드 최적화 부분)

5. 위 4가지를 적용하는 방법?

buildTypes {
       release {
       		
           // 코드 축소, 앱 난독화, 코드 최적화 시행
           minifyEnabled true

			// 리소스 축소 시행
           shrinkResources true
           proguardFiles getDefaultProguardFile('proguard-android.txt'), 
           'proguard-rules.pro'
       }
   }

마치며

유종의 미라는 말이 있다. 중간에 앱을 아무리 잘 만들었다 하더라도, 프로가드를 잘못 적용하여 앱의 비정상 행동을 야기하면 안된다.

또한 사용자가 많은 앱의 경우는 언제나 리버스 엔지니어링의 가능성이 놓여 있다. 그러므로 마지막에 프로가드를 적용하는 일도 신중을 거듭해서 진행해야 할 것이다.

그러기 위해 프로가드에 대한 위에 대한 지식정도는 설명할 수 있도록 장착할 필요가 있어 보인다.

profile
불가능보다 가능함에 몰입할 수 있는 개발자가 되기 위해 노력합니다.

0개의 댓글