티스토리 뷰

728x90

 

4차 데모데이 체크리스트 중 하나로 난독화 적용이 있었다.

난독화를 적용하면서 알아본 내용들과 팀원들에게 설명하기 위해 문서화해둔 것을 티스토리에도 올려본다.

 

 

 

난독화 관련 PR

https://github.com/woowacourse-teams/2024-ody/pull/415

 

config: 난독화 적용 by kimhm0728 · Pull Request #415 · woowacourse-teams/2024-ody

🚩 연관 이슈 close #414 📝 작업 내용 난독화 적용 외부 라이브러리 난독화 예외 처리 추가 🏞️ 스크린샷 (선택) 🗣️ 리뷰 요구사항 (선택) 난독화 관련 간단히 정리했는데 참고만 부탁드려여

github.com

 

 

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을 찾을 수 없었기 때문에 해당 객체도 추가해주었다.

 

 

 

참고

https://developer.android.com/build/shrink-code?hl=ko

728x90
250x250
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2025/02   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28
글 보관함