사실, 필자가 지금 서술하려는 내용은 [안드로이드 공식 홈페이지 프로가드 부분]에 모두 나온 내용이다. 하지만 빠른 앱개발을 위해선 개발 지식에 대한 메타인지를 쌓는 것이 무엇보다 중요하다. 정리겸 해당 글을 작성한다.
그럼 공식 홈페이지를 보면 되지 이 글을 볼 필요가 있을까?
라고 생각하시는 분들을 위해, 위 [안드로이드 공식 홈페이지 프로가드 부분]에 나온 내용들 중 '핵심'만 간략히 추려 작성해볼까 한다.
프로가드를 적용함에 있어서 기억해야할 부분은 4가지 요소이다.
- 코드 축소
- 리소스 축소
- 앱 난독화
- 코드 최적화
release버전으로 앱을 빌드할 때, '사용하지 않는 코드를 삭제하는 작업'을 의미한다. 이때의 코드는 다음을 의미한다.
- 의존성 라이브러리에 추가된 미사용 필드, 메서드, 클래스
- 패키징된 앱의 미사용 필드, 메서드, 클래스
(출처 : [안드로이드 공식 홈페이지 코드 축소 부분])
이는 위 1번 코드 축소와 내용이 상당히 유사하다.
- 의존성 라이브러리에 추가된 미사용 리소스 파일들
- 패키징된 앱의 미사용 필드, 메서드, 클래스의 리소스 파일들
1번의 코드 축소와 2번의 리소스 축소를 진행했다면, 이제 '우리가 앱 내에서 사용하는 필드, 메서드, 클래스에만 프로가드가 적용된다.
하지만 사용되는 필드, 메서드, 클래스라 하더라도 이들에게도 보안을 적용할 필요가 있다. 즉, 앱 난독화라는 작업은 다음과 같다.
- 패키징된 앱에 사용되는 필드, 메서드, 클래스(의존성 라이브러리 포함)의 네이밍을 줄이는 작업
[Android 공식 홈페이지의 난독화 사례]
[앱 난독화 전 예시]
[앱 난독화 완료 예시]
이는 1번의 코드 축소와 의미가 유사하다고 생각하면 된다. 코드 축소가 사용하지 않는 필드, 메서드, 클래스를 '삭제'하는 작업이었다. 물론, 의존성 라이브러리도 포함이었다.
하지만 코드 최적화는 R8컴파일러가 앱 내에서 사용하지 않는 코드를 삭제하기 위하여 소스 코드를 재작성하는 과정이다.
예를 들면 다음과 같은 과정을 거친다.
[코드 최적화 예시]
- 사용하지 않는 else문을 삭제
- 특정 호출 메서드가 한 곳에서만 호출될 경우, 이를 inline으로 처리 및 해당 메서드를 삭제
- 추상 클래스에 매핑되는 구현 클래스가 하나만 있을 경우 이를 결합해준다던지 하는 경우이다.
(출처 : 안드로이드 공식 홈페이지 코드 최적화 부분)
buildTypes {
release {
// 코드 축소, 앱 난독화, 코드 최적화 시행
minifyEnabled true
// 리소스 축소 시행
shrinkResources true
proguardFiles getDefaultProguardFile('proguard-android.txt'),
'proguard-rules.pro'
}
}
유종의 미라는 말이 있다. 중간에 앱을 아무리 잘 만들었다 하더라도, 프로가드를 잘못 적용하여 앱의 비정상 행동을 야기하면 안된다.
또한 사용자가 많은 앱의 경우는 언제나 리버스 엔지니어링의 가능성이 놓여 있다. 그러므로 마지막에 프로가드를 적용하는 일도 신중을 거듭해서 진행해야 할 것이다.
그러기 위해 프로가드에 대한 위에 대한 지식정도는 설명할 수 있도록 장착할 필요가 있어 보인다.