음.. 내용이 길어질 것 같으니 결과부터 보자
빌드 시간 74% 단축, 앱 크기 67MB 증가 (릴리즈 모드 기준)
time flutter build ios —release 명령어로 실행했을 때
| 항목 | 개선 전 | 개선 후 |
|---|---|---|
| pod install | 16.6s | 8.5s |
| Compling, linking and signing | 5.1s | 4.5s |
| build done | 168.0s | 43.1.s |
| Runner.app | 80.1MB | 147.1MB |
time flutter run 명령어로 실행했을 때
| 항목 | 개선 전 | 개선 후 |
|---|---|---|
| pod install | 16.8s | 8.6s |
| Compling, linking and signing | 8.4s | 11.9s |
| build done | 269.3s | 92.8s |
| syncing file to device | 0 | 78ms |
| Runner.app | 80.1MB | 147.1MB |
디버그 모드가 좀 더 빠르다. 하지만 실제 성능을 보려면 릴리즈 모드로 테스트 해야 한다고 한다.
앱 크기가 아주 약간 늘어났지만 빌드 속도가 3분 → 1분 정도로 매우 빨라졌기 때문에 만족.
아래는 podfile 에 적용한 코드다.
(파일위치: 프로젝트명/ios/Podfile)
Firestore 외에 다른 Firebase 패키지 사용 여부에 따라 적용하는 코드가 약간 다르다.
pod 'FirebaseCore', '11.10.0'~ 저 부분 코드는 제외해도 된다.target 'Runner' do
use_frameworks!
use_modular_headers! # 추가
# 사전 컴파일된 Firestore (빌드 시간 단축)
pod 'FirebaseFirestore',
:git => 'https://github.com/invertase/firestore-ios-sdk-frameworks.git',
:tag => '11.10.0' # github 링크에서 확인한 버전으로 변경
# 나머지 Firebase 서비스 버전 고정
pod 'FirebaseCore', '11.10.0'
pod 'FirebaseAuth', '11.10.0'
pod 'FirebaseStorage', '11.10.0'
pod 'FirebaseMessaging', '11.10.0'
flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__))
target 'RunnerTests' do
inherit! :search_paths
end
end
빌드를 단축시키려면 단순히 버전만 고정하면 되는 게 아니다.
핵심은 ‘github 에 제공된 사전 컴파일된 파일을 쓰는 것’이다.
사실 ‘빌드가 느리다’는 문장은 너무 광범위하게 느껴졌다. 빌드에 포함된 게 한 두개가 아닐텐데 거기서 대체 어느 부분이 느린거지? 라는 생각에 빌드 과정에 대해 찾아보았고, 이를 이해하는 데에 이 블로그 글이 정말 많은 도움 됐다.
아무튼 컴파일이 느린건지.. Linking 이 느린건지를 파악하고자 xcode 에서 빌드 로그를 상세하게 보려면 어떻게 하는지 찾아봤다.
xcode build setting 에서 설정해주면 된다고 해서 뭔가 건드리기 시작했는데, 여기서 뭐가 잘못 됐는지 계속 빌드 실패가 나서 시뮬레이터 삭제 엔딩을 맞았다.
결국 xcode 자체 기능 말고 터미널 명령어를 쓰기로 했다.
time [실행할 명령어]
명령 실행에 걸린 실제 시간을 측정해주는 유닉스/리눅스/macOS 기본 내장 명령어다.
flutter 빌드 명령어는 찾아보면 꽤 다양하다. 여기에 time 을 붙여서 사용해주었다.
time flutter build ios --release
또는
time flutter build ios --verbose
단, verbose 로 빌드하면 모든 세부 로그를 출력하기 때문에 정말 길다. 그래서 보통 로그 파일로 저장해서 확인하는 것 같다. 로그가 진짜 진짜 진짜 너무 길고 순식간에 지나가기 때문에 정말 미세한 정보를 뜯어 봐야하는 게 아니라면 사용하지 않을 것 같다.
아무튼 나는 time flutter build ios --release 로 실행해서 측정했다. (빌드만)
만약 build 후 앱 실행까지 측정 하려면 time flutter run 를 사용하면 될 듯. (빌드+실행)
// 캐시 삭제
flutter clean
cd ios
rm -rf Pods Podfile.lock
// 재설치
flutter pub get
cd ios && pod install
// 빌드
time flutter build ios --release
굳이 안봐도 된다.
나중에 또 헤멜 일이 있으면.. 이걸 보고 해결 하겠지.
결과: 빌드 실패
원인: firestore 외 다른 패키지 버전 고정 x
ISO_SDK_VERSION 부분은 firebase_sdk_version.rb 에서 확인할 수 있다.10.29.0 으로 되어있길래 그렇게 해주었지만 에러가 났다… 주륵.# platform :ios, '12.0'
# ...중략
target 'Runner' do
use_frameworks!
# 추가
use_modular_headers!
pod 'FirebaseFirestore',
:git => 'https://github.com/invertase/firestore-ios-sdk-frameworks.git',
:tag => '10.29.0'
flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__))
target 'RunnerTests' do
inherit! :search_paths
end
end
# ...후략
호환되는 버전이 뭘까..
릴리즈 노트를 뒤져보러 출발.
FlutterFire 전체 릴리즈 노트는 여기에서 볼 수 있다.
현재 날짜(2025-06-26) 기준으로 iOS SDK Release Note 의
최신 버전이 11.15.0 인 걸 확인할 수 있다.

그럼 11.15.0 을 바로 적용해주면 될까? ㄴㄴ
해당 패키지가 의존하는 ‘안정화 된 버전’이 몇인지 확인이 필요하다.
pub_dev 에서 패키지마다 하나씩 검색해서 확인해야 하는건가 싶었는데, 다행히 firebase_core 만 체크해보면 되었다.
firebase_core는 Flutter에서 사용하는 모든 Firebase 패키지의 연결점 역할을 하기 때문이다.
Changelog 를 보니 최신 SDK 는 11.13.0 이었다. 하지만 너무 최신 걸 쓰기엔 어느 버그가 튀어나올지 모르니까? iOS SDK to 11.10.0 을 써주었다.

결과: 빌드 속도 차이 없음
원인: 버전 고정만 함. firestore 에 컴파일된 깃헙 링크 적용하는 걸 빼먹음
모두 호환되는 버전을 찾았으니, 이를 수기로 고정해주고 빌드해봤다. 근데 안타깝게도 빌드 시간이 단축되진 않았다……. 사전 컴파일 된 깃헙 링크를 적용해주지 않았기 때문에.
아, 참고로 버전 11.10.0 을 적용하려면 플랫폼이 14.0 이상이어야 한다는 빌드 에러가 떠서 platform :ios, '14.0' 이 코드를 추가해줬다.
에러문구는 아래와 같았음.
[!] Automatically assigning platform iOS with version 14.0 on target Runner because no platform was specified. Please specify a platform for this target in your Podfile. See https://guides.cocoapods.org/syntax/podfile.html#platform.
그리고 수정한 Podfile 내용
# 추가
platform :ios, '14.0'
# ...중략
target 'Runner' do
use_frameworks!
use_modular_headers!
# Firebase iOS SDK 버전 고정
pod 'FirebaseCore', '11.10.0'
pod 'FirebaseFirestore', '11.10.0'
pod 'FirebaseAuth', '11.10.0'
pod 'FirebaseStorage', '11.10.0'
pod 'FirebaseMessaging', '11.10.0'
flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__))
target 'RunnerTests' do
inherit! :search_paths
end
end
# ...후략
캐시 삭제 후 실행
flutter clean
flutter pub get
cd ios
pod install --repo-update
flutter run
변경 전
기존 캐시 지우고 재빌드 - 153.2 s

변경 후
기존 캐시 지우고 재빌드 - 153.5 s

5번 이상 해봐도 딱히 유의미한 차이가 없었다. 띠로리…
xcode 에 디버그 상세 플래그를 추가해서 왜 느린지 찾아보려고 했으나… 이 세팅 과정에서 자꾸 다음과 같은 에러가 발생했다.
결과: 빌드 실패
원인: 캐시를 계속 삭제하면서 빌드 파일이 잘못된 듯
에러 문구는 다음과 같았다.
Xcode build done. 16.7s
Failed to build iOS app
Uncategorized (Xcode): Command SwiftGeneratePch failed with a nonzero exit code
Could not build the application for the simulator.
Error launching application on iPhone 14.
GPT한테 물어봤더니 Swift PCH 생성 오류는 Xcode의 캐시가 깨졌을 때 자주 발생한다고 한다. 근데 캐시 삭제를 해도.. 새로운 시뮬레이터를 만들어서 돌려도 똑같이 발생..
30번 넘게 해도 안되길래 그냥 브랜치 버리고 다시 팠다. 다행히 됨..
디버그 상세하게 볼 수 있도록 xcode 설정에서 원하는 플래그 추가

추가하는 경로는 아래 참고

빌드 실패..
아까 맨 위에서 언급했듯이 그냥 xcode 안쓰는 엔딩이 됨
# Uncomment this line to define a global platform for your project
platform :ios, '14.0' // 1. 플랫폼 최소 버전
# CocoaPods analytics sends network stats synchronously affecting flutter build latency.
ENV['COCOAPODS_DISABLE_STATS'] = 'true'
project 'Runner', {
'Debug' => :debug,
'Profile' => :release,
'Release' => :release,
}
def flutter_root
generated_xcode_build_settings_path = File.expand_path(File.join('..', 'Flutter', 'Generated.xcconfig'), __FILE__)
unless File.exist?(generated_xcode_build_settings_path)
raise "#{generated_xcode_build_settings_path} must exist. If you're running pod install manually, make sure flutter pub get is executed first"
end
File.foreach(generated_xcode_build_settings_path) do |line|
matches = line.match(/FLUTTER_ROOT\=(.*)/)
return matches[1].strip if matches
end
raise "FLUTTER_ROOT not found in #{generated_xcode_build_settings_path}. Try deleting Generated.xcconfig, then run flutter pub get"
end
require File.expand_path(File.join('packages', 'flutter_tools', 'bin', 'podhelper'), flutter_root)
flutter_ios_podfile_setup
target 'Runner' do
use_frameworks!
use_modular_headers!
// 2. 사전 컴파일된 Firestore 적용 (빌드 시간 단축)
pod 'FirebaseFirestore',
:git => 'https://github.com/invertase/firestore-ios-sdk-frameworks.git',
:tag => '11.10.0' // 위에서 확인한 버전으로 변경
// 3. 나머지 Firebase 서비스 버전 고정
pod 'FirebaseCore', '11.10.0'
pod 'FirebaseAuth', '11.10.0'
pod 'FirebaseStorage', '11.10.0'
pod 'FirebaseMessaging', '11.10.0'
flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__))
target 'RunnerTests' do
inherit! :search_paths
end
end
post_install do |installer|
installer.pods_project.targets.each do |target|
flutter_additional_ios_build_settings(target)
end
end
cd ios
rm -rf Pods Podfile.lock
flutter pub get
cd ios && pod install
time flutter fun ios --release
변경 전 후 열 번씩은 해서 전부 캡처하진 못했고.. 하나씩만 사진 첨부.
변경 전

변경 후

10번 넘게 돌려도 대체로 비슷한 단위가 나왔다.
빌드 시간 단축 성공!
뭐든 처음이 어렵다. 공식 문서엔 예외 사항이 안 적혀있으니 꽤나 헤맸는데, 빌드 단축이 어렵긴 해도 필수인 듯. 이참에 빌드를 실행하면 어떤 일이 벌어지는지에 대해서도 조금 더 이해하는 시간이 되었고, 빌드 분석 도구 같은 것도 익혀놓으면 좋겠다는 생각이 들었다.
https://firebase.google.com/docs/firestore/quickstart?hl=ko
https://yoojin99.github.io/app/Build-Time-Analyze/
https://ggasoon2.tistory.com/53
https://cnoo.tistory.com/71
https://firebase.google.com/support/release-notes/ios?_gl=1*wozcla*_up*MQ..*_ga*MTg3NDI4MDI0MC4xNzUwOTIyOTAz*_ga_CW55HF8NVT*czE3NTA5MjI5MDMkbzEkZzAkdDE3NTA5MjI5MDMkajYwJGwwJGgw