[개념]
ProGuard는 Java 및 Android 앱의 코드를 난독화(obfuscate)하고 최적화하는 도구이다. 앱의 크기를 줄이고 실행 속도를 향상시켜주며 동시에 리버스 엔지니어링을 어렵게 만들어 소스코드를 보호해준다. Unity의 빌드 타겟 플랫폼이 안드로이드일 경우 유니티 내부적으로 안드로이드 프로젝트를 생성하고 빌드하기 때문에 Proguard 사용이 가능하다.
참고로, Unity에서는 이제 ProGuard 대신 R8이라는 새로운 코드 난독화 및 최적화 도구를 사용하는 것이 권장된다. R8은 ProGuard와 호환되며 보다 향상된 성능 및 최적화 기능을 제공해준다.
R8은 Google에서 개발되었으며 proguard와 호환되지만 보다 더 높은 성능의 난독화, 축소, 최적화를 지원해준다.사용되지 않는 코드와 리소스를 제거하여 저장 공간이 절약되면서 메모리 사용량을 줄여준다. 또한 불필요한 변수를 제거해주면서 최적화 작업을 수행해준다.
[옵션]
ProGuard의 사용법은 아래와 같다.
- Unity 에디터에서 File > Build Settings을 열고 Android 플랫폼을 선택한 다음, Player Settings을 열어준다.
- Player 설정에서 Publishing Settings 섹션으로 이동한다.
- Build 옵션에서 Custom ProGuard File를 선택해준다
R8은 위 Publishing Setting에서 Minify 영역 내에 Use R8을 선택해준다.
위 세팅에서 사용하고있지는 않지만 만약에 위 R8을 활성화 시켜놨지만 Custom Main Gradle Template을 사용하고 있따면 아래 코드 부분을 체크해줘야한다.
[코드]
[Gradle] |
android { ... buildTypes { ... release { ... useR8 true <- R8을 사용하나?에 대한 부분 ... } } } |
※ 만약 Minify의 Use R8이 활성화 되어있지만 위에서 false가 되어있다면, 'mainTemplate.gralde' 파일이 Unity의 Player Settings에서 설정한 값보다 우선 순위가 높기 때문에 R8을 사용하지 않게 된다.
Proguard에서 주석은 '#'로 사용되어진다. 아래는 공부하면서 알게된 문법들을 정리해봤다.
[Proguard] |
# 난독화/축소 과정에서 제외한다. -keep public class com.example.MyClass -keepclassmemebers class.com.example.MyClass { *; } # 모든 Annotation관련 Attribute를 유지하도록 지시한다. -keepattributes *Annotation* # 난독화 및 최적화 옵션 설정 -optimizationpasses 5 -optimizationpasses n 은 최적화 통과 수를 뜻한다. (R8 에서는 무시함) -dontoptimize -dontoptimize 은 최적화를 안하겠다는 뜻이다. (R8 에서는 무시함) -dontpreverify -dontpreverify 은 사전 검증기능을 사용하지 않겠다는 뜻이다. -dontshrink -dontshrink 은 사용하지 않는 메소드를 유지하는 코드다. -dontwarn com.example.* -dontwarn 패키지명.* 은 지정한 경고를 무시해 주는 코드이다. -dontusemixedcaseclassnames -dontusemixedcaseclassnames 은 대소문자가 혼합된 클래스명을 허용하지 않겠다는 코드다. |
위에서 'R8에서는 무시한다'라는 뜻은 기본적으로 R8은 임의의 최적화를 사용 중지 또는 최적화 동작을 수정하는 것에 대해 허용하지 않는다. 그렇기 때문에 -optimizations 및 -optimizationpasses와 같이 기본 최적화를 수정하려고 시도하는 행위는 R8에서 모두 무시해버린다.
(참고 문서 : https://developer.android.com/studio/build/shrink-code?hl=ko -> 코드 난독화 부분)
그리고 Proguard 난독화를 이용하면서 주의해야할 점이 있다. 외부 라이브러리 및 프레임워크를 -keep을 통해 난독화에서 제외해줘야한다.
예를들어 본인이 만들고 있는 게임이 GoogleSigning을 사용하고있다면
[GoogleSignin 난독화 제외] |
-keep class com.google.googlesignin.**{ *; } |
등의 코드를 추가해줘야한다. 이것을 몰라서 매우 고생한적이 있었다.
추가로 위 코드에서 -keepattributes가 사용되어지는데 Proguard는 기본적으로 최적화, 난독화 및 축소 과정에서 클래스 파일의 애트리뷰트 중 일부를 제거한다. 이 제거 과정 중에서 본인이 유지하고싶은 Attribute를 추가해주주면된다.
Attribute 리스트는 아래 링크에서 확인할 수 있다.
(Proguard Manual : https://www.guardsquare.com/manual/configuration/attributes )
[릴리즈]
위에서 R8을 사용하면 빌드 시 mapping.txt가 나온다. 이 mapping.txt를 구글 플레이 콘솔에 올릴 때 아래 ReTrace 매핑 파일에 등록을 해줘야한다.
'개발 (Game) > Unity' 카테고리의 다른 글
[Unity] 메모리 최적화를 위한 에셋 관리 (2) | 2024.09.29 |
---|---|
[Unity] UGUI 성능 최적화 (0) | 2024.09.17 |
[Shader] 쉐이더를 처음으로 직접 작성해보다. (0) | 2021.09.01 |
[Shader] Rendering Pipeline - 래스터라이저 & 프래그먼트 쉐이더 (0) | 2021.09.01 |
[Shader] Rendering PipeLine - 버텍스 셰이더 (0) | 2021.09.01 |