티스토리 뷰
4차 데모데이 체크리스트 중 하나로 난독화 적용이 있었다.
난독화를 적용하면서 알아본 내용들과 팀원들에게 설명하기 위해 문서화해둔 것을 티스토리에도 올려본다.
난독화 관련 PR
https://github.com/woowacourse-teams/2024-ody/pull/415
R8 컴파일러
Android Gradle 플러그인 3.4.0 이상을 사용하여 프로젝트를 빌드하는 경우, ProGuard가 아닌 R8 컴파일러를 사용하여 코드 최적화 작업을 수행한다.
R8 컴파일러가 해주는 코드 최적화 작업은 아래와 같다.
- 코드 축소
- 사용하지 않는 클래스, 필드, 메서드, 속성을 감지하여 안전하게 삭제한다.
- 예를 들어 라이브러리 의존성 항목에서 몇 개의 API만 사용한다면 나머지 코드를 삭제한다.
- 리소스 축소
- 앱에서 사용하지 않는 리소스를 삭제한다. 코드 축소와 함께 사용하여 더 이상 참조되지 않는 리소스도 안전하게 삭제한다.
- 최적화
- 코드를 검사하고 다시 작성하여 런타임 성능을을 개선한다. 앱 DEX 파일의 크기를 더욱 줄일 수 있다.
- 예를 들어 if-else 구문에서 else {} 분기가 사용되고 있지 않다면, R8에서 이를 감지해 else {} 분기 코드를 삭제한다.
- 난독화
- 클래스명, 멤버명을 단축한다. DEX 파일 크기가 줄어든다.
- viewPager, button과 같은 네이밍을 a, b, c로 난독화하여 소스 코드를 분석하기 어렵게 만든다.
- 앱의 보안 수준을 높일 수 있다.
난독화 적용 방식
buildTypes {
release {
isMinifyEnabled = true
isShrinkResources = true
proguardFiles(
getDefaultProguardFile("proguard-android-optimize.txt"),
"proguard-rules.pro",
)
}
}
1. build.gradle.kts (module)
isMinifyEnabled = true
위 속성을 true로 두어 코드 난독화 및 최적화 설정을 적용한다.
2. build.gradle.kts (module)
isShrinkResources = true
위 속성을 true로 두어 사용하지 않는 리소스를 축소한다. (난독화에 포함되지는 않음)
3. proguard-rules.pro
proguardFiles(
getDefaultProguardFile("proguard-android-optimize.txt"),
"proguard-rules.pro",
)
난독화에 대한 사용자 규칙을 적용한다. 프로가드 규칙과 동일하게 사용한다.
난독화 예외 처리
난독화를 적용하면, 앱에 사용한 라이브러리도 난독화되어 라이브러리의 클래스, 메서드, 변수의 이름도 변경이 된다.
즉, 해당 라이브러리를 사용할 수 없는 상태로 변하게 되기 때문에 proguard-rules.pro에서 난독화를 적용하지 않을 코드를 명시해 주어야 한다.
-keep class 패키지명.** { *; }
난독화를 적용하지 않을 패키지명 또는 파일명을 작성한다.
# kakao sdk
-keep class com.kakao.sdk.**.model.* { <fields>; }
-keep class * extends com.google.gson.TypeAdapter
# https://github.com/square/okhttp/pull/6792
-dontwarn org.bouncycastle.jsse.**
-dontwarn org.conscrypt.*
-dontwarn org.openjsse.**
# retrofit
-keep class com.woowacourse.ody.data.retrofit.* { <fields>; }
-keep class com.woowacourse.ody.domain.apiresult.ApiResult
모든 코드에 난독화를 적용해서( = proguard-rules.pro에 아무것도 작성하지 않은 상태) 앱을 빌드해보고,
오류가 나는 부분을 하나씩 proguard-rules.pro에 추가하는 방식으로 예외 처리를 했다.
kakao sdk와 kakao sdk 내부에서 사용하는 gson, okhttp를 추가했다. 이 부분은 kakao developers 공식 문서를 참고했다.
또한 retrofit, retrofit service의 반환 타입으로 사용되는 ApiResult을 추가했다.
ApiResult를 난독화해 버리면, retrofit에서 반환 타입인 ApiResult을 찾을 수 없었기 때문에 해당 객체도 추가해주었다.
참고
'android' 카테고리의 다른 글
[안드로이드/코틀린] 특정 뷰가 화면에서 가려지는지 여부를 동적으로 확인하기 (1) | 2024.01.28 |
---|---|
[안드로이드/오류] Failed to compile values file. Resource compilation failed. Check logs for details. (1) | 2024.01.18 |
[안드로이드/코틀린] Dagger의 Hilt 라이브러리로 의존성 주입 (0) | 2023.12.03 |
[안드로이드/코틀린] BottomNavigationView 커스텀 (1) | 2023.10.25 |
[안드로이드/코틀린] Navigation 구현하기 (1) | 2023.10.25 |