/ PROGUARD, ANDROID

Proguard를 사용한 코드 난독화 - 라이브러리 프로젝트에 적용하기

관련 글

Proguard를 사용하여 코드를 난독화 할 때, 라이브러리 단위로 난독화에 사용할 규칙(Rules)을 지정하면 여러 개의 라이브러리를 사용하더라도 각 규칙들이 명확히 분리되어 관리하기 수월합니다.

라이브러리를 사용하는 형태는 크게 ‘프로젝트 내 모듈’로 사용하는 방식 (일명 라이브러리 프로젝트)와 이미 컴파일된 바이너리(jar, aar)를 사용하는 방식으로 나뉩니다.

프로젝트 내 모듈

하나의 프로젝트 내에서 공통으로 사용하는 라이브러리를 작성할 때 이 형식을 주로 사용합니다. 애플리케이션 코드와 모듈만 분리되어 있을 뿐, 개발시 필요한 부분을 자신이 직접 작성하는 형태입니다.

이 모듈에 난독화 규칙을 적용하려면 애플리케이션 프로젝트와 동일하게 proguardFile 혹은 proguardFiles를 사용하면 됩니다.

다음은 라이브러리 프로젝트에 proguard-rules.pro 파일에 정의된 규칙을 적용한 예를 보여줍니다.

apply plugin: 'com.android.library'

android {
    buildTypes {

        debug {
            ...
        }

        release {
            minifyEnabled true
            proguardFile 'proguard-rules.pro'
        }
    }
}

위와 같이 라이브러리 프로젝트 내에 적용하면 이를 사용하는 애플리케이션 프로젝트에서는 이 라이브러리에 필요한 난독화 규칙을 별도로 추가하지 않아도 됩니다.

컴파일 된 라이브러리 - jar

jar 패키지로 배포되는 라이브러리는 로컬(libs 디렉터리에 추가하여 사용하는 형태)과 리모트(maven central / jcenter 사용) 동일하게 해당 라이브러리에서 필요한 난독화 규칙을 라이브러리를 사용하는 프로젝트proguardFile 혹은 proguardFiles 로 추가해야 합니다.

일반적으로 각 라이브러리에 필요한 난독화 규칙은 해당 라이브러리 저장소에 포함되어 있습니다. 아래는 Gson의 난독화 규칙입니다.

##---------------Begin: proguard configuration for Gson  ----------
# Gson uses generic type information stored in a class file when working with fields. Proguard
# removes such information by default, so configure it to keep all of it.
-keepattributes Signature

# For using GSON @Expose annotation
-keepattributes *Annotation*

# Gson specific classes
-keep class sun.misc.Unsafe { *; }
#-keep class com.google.gson.stream.** { *; }

# Application classes that will be serialized/deserialized over Gson
-keep class com.google.gson.examples.android.model.** { *; }

##---------------End: proguard configuration for Gson  ----------

라이브러리에서 사용하는 규칙 외에 애플리케이션 자체에서 사용하는 난독화 규칙이 있거나, 별도의 난독화 규칙이 필요한 라이브러리가 여러 개일 경우 이를 각각 관리할 수 있습니다.

다음은 애플리케이션 프로젝트에서 자체적으로 필요한 난독화 규칙인 proguard-rules.pro와 Gson에서 사용하는 규칙인 proguard-gson.pro 를 함께 적용하는 예를 보여줍니다.

apply plugin: 'com.android.application'

android {
    buildTypes {

        debug {
            ...
        }

        release {
            minifyEnabled true

            // Gson에서 사용하는 난독화 규칙
            proguardFile 'proguard-gson.pro'

            // 애플리케이션 자체에서 사용하는 난독화 규칙
            proguardFile 'proguard-rules.pro'
        }
    }
}

proguardFiles 를 사용하면 한 번에 두 규칙을 추가할 수 있습니다.

apply plugin: 'com.android.application'

android {
    buildTypes {

        debug {
            ...
        }

        release {
            minifyEnabled true

            // 두 규칙을 한 번에 추가
            proguardFiles 'proguard-gson.pro', 'proguard-rules.pro'
        }
    }
}

컴파일 된 라이브러리 - aar

jar 형태로 구성된 라이브러리와 달리, aar로 배포되는 라이브러리는 난독화 규칙을 포함하여 배포할 수 있습니다.

proguardFile/proguardFiles 대신 consumerProguardFile/consumerProguardFiles를 사용하면 aar 패키지 내 난독화 규칙이 포함되며, 이 라이브러리를 사용하는 애플리케이션 측에서 별도로 난독화 규칙을 추가하지 않아도 됩니다.

다음은 consumerProguardFile을 사용하여 라이브러리에서 사용하는 난독화 규칙을 포함하도록 하는 예를 보여줍니다.

apply plugin: 'com.android.library'

android {
    buildTypes {

        debug {
            ...
        }

        release {
            minifyEnabled true
            // 라이브러리 패키지에 아래 규칙이 함께 포함됩니다.
            consumerProguardFile 'proguard-rules.pro'
        }
    }
}

consumerProguardFiles를 사용하면 여러 규칙을 한 번에 추가할 수 있습니다.

apply plugin: 'com.android.library'

android {
    buildTypes {

        debug {
            ...
        }

        release {
            minifyEnabled true
            // 여러 규칙을 한 번에 추가합니다.
            consumerProguardFiles 'proguard-gson.pro', 'proguard-rules.pro'
        }
    }
}

유의사항

  1. aar 패키지는 난독화 규칙을 포함할 수 있을 뿐, 라이브러리 제작자가 필요한 난독화 규칙을 함께 배포하지 않았다면 여전히 수동으로 규칙을 추가해야 합니다.
  2. aar 패키지 형태를 그대로 사용하는 경우에만 지정한 규칙이 자동으로 적용됩니다. 즉, 리모트(manven central / jcenter 등) 혹은 로컬에서 aar 파일을 직접 참조하는 경우 (libs 폴더에 넣거나 aar 파일을 별도의 모듈로 지정)에만 한정됩니다.
  3. 라이브러리 프로젝트에서 consumerProguardFile으로 난독화 규칙을 제공하는 경우, 이를 참조하는 애플리케이션 프로젝트에 자동으로 규칙이 적용됩니다.
kunny

커니

안드로이드와 오픈소스, 코틀린(Kotlin)에 관심이 많습니다. 한국 GDG 안드로이드 운영자 및 GDE 안드로이드로 활동했으며, 현재 구글에서 애드몹 기술 지원을 담당하고 있습니다.

Read More