본문 바로가기
Android

[Android] 안드로이드 난독화 및 최적화하기

by Echung 2023. 12. 14.

안드로이드 난독화란 


안드로이드 난독화란, 간단하게 말해 소스 코드를 읽기 어렵게 만드는 과정입니다. 이는 주로 보안을 강화하기 위한 목적으로 사용되며, 소스 코드를 이해하거나 복사하는 것을 어렵게 만들어, 소프트웨어의 보안을 높이는 역할을 합니다. 

난독화를 통해 소스 코드의 구조와 로직이 외부에 노출되는 것을 막을  있습니다. 이를 통해 악성 사용자가 우리의 소프트웨어를 공격하거나, 소스 코드를 부정하게 이용하는 것을 방지할  있죠. 이는 개발자로서, 우리의 소프트웨어를 안전하게 보호하는  있어 중요한 작업입니다.

난독화의 장점


  • 코드 축소(또는 Tree Shaking): 앱 및 라이브러리 종속 항목에서 미사용 클래스, 필드, 메서드, 속성을 감지하여 안전하게 삭제합니다(64k 참조 제한을 해결하기 위한 유용한 도구). 
  • 리소스 축소: 앱 라이브러리 종속 항목의 미사용 리소스를 포함하여 패키징 된 앱에서 사용하지 않는 리소스를 삭제합니다. 리소스 축소는 코드 축소와 함께 사용하여 미사용 코드를 삭제하고 마찬가지로 더 이상 참조되지 않는 리소스도 안전하게 삭제할 수 있습니다. 
  • 난독화: 클래스와 멤버 이름을 줄여 DEX 파일 크기를 줄입니다. 자세히 알아보려면 코드 난독화 방법에 관한 섹션을 참조하세요.
  • 최적화: 코드를 검사하고 다시 작성하여 앱 DEX 파일의 크기를 더 줄입니다. 예를 들어 주어진 if/else 구문의 else {} 분기가 전혀 사용되지 않음을 R8에서 감지한 경우 R8이 else {} 분기 코드를 삭제합니다. 자세히 알아보려면 코드 최적화 섹션을 참조하세요.

난독화 하는 방법


안드로이드 난독화는 ProGuard와 같은 도구를 통해 진행합니다. 이 도구는 안드로이드 스튜디오에 기본적으로 포함되어 있기 때문에, 별도로 설치할 필요는 없습니다. 

적용 방법

Android build.gradle에 아래와 같은 코드를 넣어주면 됩니다.

    buildTypes {
        release {
        	// Enables code shrinking, obfuscation, and optimization for only
            // your project's release build type.
            minifyEnabled true

            // Enables resource shrinking, which is performed by the
            // Android Gradle plugin.
            shrinkResources true

            // Includes the default ProGuard rules files that are packaged with
            // the Android Gradle plugin. To learn more, go to the section about
            // R8 configuration files.
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }

난독화 적용 후 예외처리


안드로이드 난독화를 하면 디버그(Debug)에서는 잘 되는데 릴리즈(Release) 버전에서는 잘 안 되는 현상이 생길 수 있습니다. 저도 이번에 앱을 배포하면서 난독화를 진행하다 보니 data model 부분에서 SerializedName이 난독화되면서 데이터 매칭이 되지 않아서 데이터를 제대로 가져오지 못하는 현상이 생겼었습니다.

예외 처리 방법

Gradle에서 proguard-rules.pro에 다음과 같은 코드를 추가해주면 됩니다.

ex)

# Add project specific ProGuard rules here.
# You can control the set of applied configuration files using the
# proguardFiles setting in build.gradle.
#
# For more details, see
#   http://developer.android.com/guide/developing/tools/proguard.html

# If your project uses WebView with JS, uncomment the following
# and specify the fully qualified class name to the JavaScript interface
# class:
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
#   public *;
#}

# Uncomment this to preserve the line number information for
# debugging stack traces.
#-keepattributes SourceFile,LineNumberTable

# If you keep the line number information, uncomment this to
# hide the original source file name.
#-renamesourcefileattribute SourceFile

-dontwarn 패키지명.** : 지정해서 경고 무시

-keep class 패키지명.** : 난독화가 필요하지 않은 경우

-ignorewarnings : 경고 무시

-dontoptimize : 최적화 하지 않기

-dontshrink : 사용하지 않는 메소드 유지

-keepclassmembers : 특정 클래스 멤버 원상태 유지

-keepattributes : 내부 클래스 원상태 유지 적용

 

이렇게 자신에게 맞는 난독화 예외처리를 해주시면 됩니다. 다른 개발자들도 저와 같은 현상을 마주치지 않고 해결하길 바랍니다. 난독화는 하기는 쉽지만 예외처리가 어려운 것 같습니다.

Reference


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

반응형