Proguard를 사용한 코드 난독화 - 라이브러리 프로젝트에 적용하기
관련 글
- Proguard를 사용한 코드 난독화 - 모듈별 규칙 적용시 유의사항
- Proguard를 사용한 코드 난독화 - 유닛 테스트에서 java.lang.VerifyError가 발생하는 경우
- 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'
}
}
}
유의사항
aar
패키지는 난독화 규칙을 포함할 수 있을 뿐, 라이브러리 제작자가 필요한 난독화 규칙을 함께 배포하지 않았다면 여전히 수동으로 규칙을 추가해야 합니다.aar
패키지 형태를 그대로 사용하는 경우에만 지정한 규칙이 자동으로 적용됩니다. 즉, 리모트(manven central / jcenter 등) 혹은 로컬에서 aar 파일을 직접 참조하는 경우 (libs 폴더에 넣거나 aar 파일을 별도의 모듈로 지정)에만 한정됩니다.- 라이브러리 프로젝트에서
consumerProguardFile
으로 난독화 규칙을 제공하는 경우, 이를 참조하는 애플리케이션 프로젝트에 자동으로 규칙이 적용됩니다.