내일배움캠프 TIL - Flutter build- Tree Shaking과 코드 난독화

Jaden Lee·2025년 3월 31일
0

내일배움캠프

목록 보기
10/15

Flutter iOS & Android 앱 최적화: Tree Shaking과 코드 난독화

Flutter는 iOS와 Android에서 앱을 최적화하는 방식이 다릅니다. 특히, 앱의 성능과 크기를 최적화하기 위한 Tree Shaking과 코드 난독화는 중요한 요소입니다. 이번 글에서는 Flutter에서 iOS와 Android 각각의 빌드 최적화 과정과 난독화 방법을 정리해보겠습니다.

1. Flutter의 Release 빌드 최적화

Flutter의 Release 빌드는 앱을 최적화하는 중요한 단계입니다. 주요 목표는 다음과 같습니다:

  • 빠른 시작 (Fast Startup)
  • 빠른 실행 (Fast Execution)
  • 작은 패키지 크기 (Small Package Size)

앱 크기 최적화의 핵심은 불필요한 코드를 제거하는 것입니다. 이 과정에서 Tree ShakingDead-Code Elimination이 중요한 역할을 합니다.

2. Tree Shaking 및 Dead-Code Elimination

Android에서의 Tree Shaking

Android에서는 R8을 사용하여 Tree Shaking을 자동으로 수행합니다.

  • R8은 Java/Kotlin 코드에 대해 Tree Shaking을 수행하고, 불필요한 코드를 제거하여 앱 크기를 줄입니다.
  • R8은 코드 난독화(Obfuscation) 및 추가적인 최적화도 지원합니다.
  • 하지만 Dart 코드의 난독화는 R8이 수행하지 않으며, 별도의 명령어를 사용해야 합니다.

✅ Android에서 Dart 코드 난독화 적용 방법

flutter build apk --release --obfuscate --split-debug-info=<path>
  • --obfuscate: Dart 코드의 메서드명과 변수명을 난독화합니다.
  • --split-debug-info: 디버그 심볼을 분리하여 앱 크기를 최소화합니다.

iOS에서의 Tree Shaking

iOS에서는 R8을 사용하지 않으며, 대신 Dart의 AOT(Ahead-Of-Time) 컴파일러가 최적화를 담당합니다.

  • Dart는 Release 빌드 시 Dead-Code Elimination을 수행하여 사용되지 않는 코드를 자동으로 제거합니다.
  • AOT 컴파일을 통해 불필요한 코드를 제거하고 앱 실행 속도를 최적화합니다.
  • Android와 달리 iOS에서는 Dart 코드의 난독화를 수동으로 적용해야 합니다.

3. Web 앱과의 비교

Flutter의 웹 앱에서는 Dart2js 컴파일러를 통해 자동으로 Tree Shaking과 minification(최적화)이 수행됩니다.

  • 웹에서는 JavaScript 코드로 변환되기 때문에 Dart2js가 사용됩니다.
  • 불필요한 코드를 자동으로 제거하여 앱 크기를 줄입니다.

4. iOS에서의 코드 난독화

Dart 코드 난독화

iOS에서는 기본적으로 Dart 코드 난독화 도구가 제공되지 않지만, 아래 명령어를 사용하여 적용할 수 있습니다.

flutter build ios --release --obfuscate --split-debug-info=<path>
  • --obfuscate: Dart 코드의 변수명, 클래스명, 메서드명을 난독화합니다.
  • --split-debug-info: 디버그 심볼을 분리하여 앱 크기를 최소화합니다.

iOS 네이티브 코드 난독화

iOS의 Swift 및 Objective-C 코드는 기본적으로 자동 난독화되지 않습니다.

  • Xcode에서는 Bitcode를 활용한 최적화가 가능했지만, iOS 16부터 Bitcode 지원이 중단되었습니다.
  • Swift 및 Objective-C 코드를 난독화하려면 타사 도구(ex: obfuscator-llvm)를 사용해야 합니다.

5. Android vs iOS 난독화 차이점

플랫폼Dart 코드 난독화네이티브 코드 난독화Tree Shaking
Androidflutter build apk --release --obfuscateR8이 Java/Kotlin 코드 난독화 수행R8이 Java/Kotlin 코드 최적화 수행
iOSflutter build ios --release --obfuscate자동 지원 X (타사 도구 필요)Dart AOT 컴파일러가 최적화 수행

빌드 단계 차이점

단계AndroidiOS
1. AOT 컴파일Dart → 네이티브 변환 & Tree ShakingDart → 네이티브 변환 & Tree Shaking
2. 네이티브 빌드Gradle을 사용하여 APK/AAB 빌드Clang/Swift Compiler를 사용하여 IPA 빌드
3. 코드 난독화R8이 Java/Kotlin 난독화 (Dart는 별도 적용)Swift/Objective-C 난독화는 타사 도구 필요
4. 최종 결과물APK/AABIPA

✅ Android에서 R8을 활용한 난독화 설정

android/app/build.gradle 파일에서 R8을 활성화할 수 있습니다.

android {
    buildTypes {
        release {
            minifyEnabled true // R8 활성화
            shrinkResources true // 리소스 최적화
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }
}
  • minifyEnabled true: R8을 활성화하여 코드 난독화 및 최적화 수행
  • shrinkResources true: 불필요한 리소스를 제거하여 앱 크기 최적화

6. 결론

Android에서는 R8이 Java/Kotlin 코드의 Tree Shaking과 난독화를 자동으로 수행하지만, Dart 코드 난독화는 flutter build apk --release --obfuscate 명령어를 사용해야 합니다.

iOS에서는 Dart의 AOT 컴파일러가 최적화를 수행하며, Dart 코드 난독화는 --obfuscate 옵션으로 수동 적용해야 합니다. Swift 및 Objective-C 코드는 타사 도구를 사용해야 합니다.

Bitcode는 난독화와 관련이 없으며, Apple이 iOS 16부터 지원을 중단했습니다.

Flutter 앱을 최적화할 때 Android와 iOS의 차이를 이해하고, 적절한 최적화 방법을 적용하면 앱의 성능을 더욱 향상시킬 수 있습니다. 🚀

0개의 댓글