본문 바로가기

개발관련

[Flutter] Flutter로 앱 개발 시에 앱 용량이 너무 크게 나오는 현상 해결방법

flutter build ios --analyze-size

크로스플랫폼 프레임워크인 Flutter로 개발을 하면 하나의 소스코드로 Android와 iOS, 심지어 웹까지 결과물을 만들 수 있기 때문에 최근 유용하게 사용하고 있다. 그런데 하나의 단점이 있었는데 app size (앱 용량)이 너무 크게 나오는 것이었다. 특히 iOS의 결과물이 너무 크게 나왔는데 해결방법을 찾아서 글을 남긴다.

 

나는 Android Studio를 사용해서 개발을 하는데 New Project를 하는 경우에 아래와 같이 Android language, iOS language 두개에 대해서 선택하는 화면이 나온다.

초기화 화면

여기서 iOS language를 Swift로 설정하는 경우 Swift 관련 라이브러리들이 포함되게 되어 용량이 크게 나온다. 한번 Swift와 Objective-C로 프로젝트를 만들어서 처음에 있는 템플릿 앱에 대해서 빌드된 결과물의 사이즈를 비교해보겠다. 참고로, 사용한 플러터의 버전은 3.7.6이다.

 

혹시 터미널에서 프로젝트를 생성하는 경우에는 아래와 같이 -i option에 objc 또는 swift를 줌으로써 iOS language 설정이 가능하다.

flutter create --org <com.company> -i objc -a kotlin <package_name>

 

 

아래 명령을 실행해서 빌드 결과물의 용량이 어떻게 차지되는지 확인을 할 수 있다.

flutter build ios --analyze-size

 

iOS language를 Swift로 설정해서 프로젝트를 생성한 경우에는 아래와 같이 53MB 정도를 차지하는 것을 볼 수 있다. 아주 간단한 기능만 있는 템플릿 앱인데도 53MB 정도 차지하는 것은 문제가 있어 보인다. 구성을 잘 보면 libswiftCore.dylib가 22MB, libswiftFoundation.dylib가 11MB나 차지하는 것을 확인할 수 있다. 해당 요소는 Swift 언어 지원을 위한 라이브러리로 보이는데, 내가 만드는 Flutter 앱은 거의 dart만 사용해서도 충분히 만들었기 때문에 해당 요소는 필요가 없어보인다. 

~/TutorialProjects/test1 ❯ flutter build ios --analyze-size                                                                                                                                                                    07:32:45
Building com.example.test1 for device (ios-release)...
Automatically signing iOS for device deployment using specified development team in Xcode project: 357ZP33ZM7
Running Xcode build...                                                  
 └─Compiling, linking and signing...                         3.2s
Xcode build done.                                           21.1s
▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
  Runner.app                                                               53 MB
  Runner.app/
    _CodeSignature/
      CodeResources                                                        17 KB
    Runner                                                                 94 KB
    Base.lproj/
      Main.storyboardc                                                      3 KB
      LaunchScreen.storyboardc                                              3 KB
    Assets.car                                                             73 KB
    AppIcon76x76@2x~ipad.png                                                1 KB
    Frameworks/
      libswiftCoreImage.dylib                                             327 KB
      libswiftObjectiveC.dylib                                            391 KB
      libswiftCore.dylib                                                   22 MB
      libswiftCoreGraphics.dylib                                          838 KB
      libswiftUIKit.dylib                                                 640 KB
      libswiftMetal.dylib                                                 386 KB
      libswiftDispatch.dylib                                                1 MB
      libswiftos.dylib                                                    388 KB
      libswiftCoreFoundation.dylib                                        327 KB
      Flutter.framework                                                    10 MB
      App.framework                                                         4 MB
      Dart AOT symbols accounted decompressed size                          3 MB
        package:flutter                                                     2 MB
        dart:core                                                         271 KB
        dart:ui                                                           228 KB
        dart:typed_data                                                   186 KB
        dart:collection                                                   102 KB
        dart:async                                                         84 KB
        dart:ffi                                                           57 KB
        dart:convert                                                       55 KB
        dart:io                                                            46 KB
        dart:isolate                                                       31 KB
        package:vector_math/
          vector_math_64.dart                                              25 KB
        dart:developer                                                      7 KB
        dart:math                                                           3 KB
        package:test1/
          main.dart                                                         2 KB
        dart:vmservice_io                                                  990 B
        package:collection/
          src/
            priority_queue.dart                                            854 B
        dart:mirrors                                                       601 B
        dart:nativewrappers                                                260 B
        Never                                                               60 B
        void/
          <optimized out>                                                   44 B
      libswiftDarwin.dylib                                                488 KB
      libswiftQuartzCore.dylib                                            330 KB
      libswiftCoreAudio.dylib                                             399 KB
      libswiftFoundation.dylib                                             11 MB
      libswiftCoreMedia.dylib                                             391 KB
    embedded.mobileprovision                                               12 KB
    Info.plist                                                              1 KB
▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
A summary of your iOS bundle analysis can be found at: /Users/seungwoo.jo/.flutter-devtools/ios-code-size-analysis_07.json

To analyze your app size in Dart DevTools, run the following command:
flutter pub global activate devtools; flutter pub global run devtools --appSizeBase=ios-code-size-analysis_07.json
Built /Users/seungwoo.jo/TutorialProjects/test1/build/ios/iphoneos/Runner.app.
~/TutorialProjects/test1 ❯

 

Objective-C로 설정하는 경우에는 아래와 같이 Swift 관련 라이브러리가 앱에서 빠지게 되어 앱 용량이 13MB로 현저히 줄어드는 것을 확인할 수 있다. Flutter를 사용하면서 Swift를 사용하지 않는다면 프로젝트 구성 시에 iOS language를 Objective-C로 설정하여 앱 용량을 최적화하면 좋을 것 같다.

~/TutorialProjects/test2 ❯ flutter build ios --analyze-size                                                                                                                                                                    07:39:56
Building com.example.test2 for device (ios-release)...
Automatically signing iOS for device deployment using specified development team in Xcode project: 357ZP33ZM7
Running Xcode build...                                                  
 └─Compiling, linking and signing...                         3.4s
Xcode build done.                                           22.3s
▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
  Runner.app                                                               13 MB
  Runner.app/
    _CodeSignature/
      CodeResources                                                        13 KB
    Runner                                                                 71 KB
    Base.lproj/
      Main.storyboardc                                                      3 KB
      LaunchScreen.storyboardc                                              3 KB
    Assets.car                                                             73 KB
    AppIcon76x76@2x~ipad.png                                                1 KB
    Frameworks/
      Flutter.framework                                                    10 MB
      App.framework                                                         4 MB
      Dart AOT symbols accounted decompressed size                          3 MB
        package:flutter                                                     2 MB
        dart:core                                                         271 KB
        dart:ui                                                           228 KB
        dart:typed_data                                                   186 KB
        dart:collection                                                   102 KB
        dart:async                                                         84 KB
        dart:ffi                                                           57 KB
        dart:convert                                                       55 KB
        dart:io                                                            46 KB
        dart:isolate                                                       31 KB
        package:vector_math/
          vector_math_64.dart                                              25 KB
        dart:developer                                                      7 KB
        dart:math                                                           3 KB
        package:test2/
          main.dart                                                         2 KB
        dart:vmservice_io                                                  990 B
        package:collection/
          src/
            priority_queue.dart                                            854 B
        dart:mirrors                                                       601 B
        dart:nativewrappers                                                260 B
        Never                                                               60 B
        void/
          <optimized out>                                                   44 B
    embedded.mobileprovision                                               12 KB
    Info.plist                                                              1 KB
▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
A summary of your iOS bundle analysis can be found at: /Users/seungwoo.jo/.flutter-devtools/ios-code-size-analysis_08.json

To analyze your app size in Dart DevTools, run the following command:
flutter pub global activate devtools; flutter pub global run devtools --appSizeBase=ios-code-size-analysis_08.json
Built /Users/seungwoo.jo/TutorialProjects/test2/build/ios/iphoneos/Runner.app.

 

Flutter로 만든 iOS 앱들의 용량이 너무 크게 나와서 최근 신경이 많이 쓰였는데 해결방법을 찾아서 다행이다. 참고로 Android 앱으로 Kotlin으로 생성한 경우와  Java로 생성한 경우 또한 비교를 해보았는데 Android 앱의 경우에는 두 가지 경우 모두 6MB의 빌드 결과물이 만들어졌다. Android의 경우에는 어떤 언어를 선택할지에 대해 크게 신경을 쓰지 않아도 괜찮을 것 같다.