Firestore iOS 빌드 시간 단축하기

순순·2025년 6월 26일

Flutter

목록 보기
16/16

개요


  • iOS 에서 빌드가 너무 오래 걸림
  • firestore 공식문서에 iOS 빌드 시간 단축 방법이 있어서 적용 해보았다
  • 그 과정에서 몇 가지 에러가 났고, 이를 해결했던 과정을 기록했다

결과


음.. 내용이 길어질 것 같으니 결과부터 보자
빌드 시간 74% 단축, 앱 크기 67MB 증가 (릴리즈 모드 기준)


(1) 릴리즈 모드 빌드 결과

time flutter build ios —release 명령어로 실행했을 때

항목개선 전개선 후
pod install16.6s8.5s
Compling, linking and signing5.1s4.5s
build done168.0s43.1.s
Runner.app80.1MB147.1MB

(2) 디버그 모드 빌드 결과

time flutter run 명령어로 실행했을 때

항목개선 전개선 후
pod install16.8s8.6s
Compling, linking and signing8.4s11.9s
build done269.3s92.8s
syncing file to device078ms
Runner.app80.1MB147.1MB

디버그 모드가 좀 더 빠르다. 하지만 실제 성능을 보려면 릴리즈 모드로 테스트 해야 한다고 한다.
앱 크기가 아주 약간 늘어났지만 빌드 속도가 3분 → 1분 정도로 매우 빨라졌기 때문에 만족.


적용 코드


아래는 podfile 에 적용한 코드다.
(파일위치: 프로젝트명/ios/Podfile)

주의사항

Firestore 외에 다른 Firebase 패키지 사용 여부에 따라 적용하는 코드가 약간 다르다.

  • Firestore 외에 다른 Firebase 패키지를 사용하지 않는다면, pod 'FirebaseCore', '11.10.0'~ 저 부분 코드는 제외해도 된다.
  • Firestroe 외에 다른 Firebase 패키지를 사용한다면, 모두 호환되는 버전을 찾아서 적용해줘야 한다. (버전 찾는 과정은 아래에 적어뒀다)

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 에 제공된 사전 컴파일된 파일을 쓰는 것’이다.

요약

  • Firestore 만 github 에 사전 컴파일된 파일을 쓰도록 지정
  • 사전 컴파일된 파일을 쓰려면 버전 명시 필요
  • Firestore 의 버전과 나머지 패키지들이 모두 호환될 수 있도록, 나머지 패키지들의 버전을 고정

빌드 시간 측정 명령어


사실 ‘빌드가 느리다’는 문장은 너무 광범위하게 느껴졌다. 빌드에 포함된 게 한 두개가 아닐텐데 거기서 대체 어느 부분이 느린거지? 라는 생각에 빌드 과정에 대해 찾아보았고, 이를 이해하는 데에 이 블로그 글이 정말 많은 도움 됐다.

아무튼 컴파일이 느린건지.. Linking 이 느린건지를 파악하고자 xcode 에서 빌드 로그를 상세하게 보려면 어떻게 하는지 찾아봤다.

xcode build setting 에서 설정해주면 된다고 해서 뭔가 건드리기 시작했는데, 여기서 뭐가 잘못 됐는지 계속 빌드 실패가 나서 시뮬레이터 삭제 엔딩을 맞았다.

결국 xcode 자체 기능 말고 터미널 명령어를 쓰기로 했다.


(1) 시간 측정

time [실행할 명령어]

명령 실행에 걸린 실제 시간을 측정해주는 유닉스/리눅스/macOS 기본 내장 명령어다.

(2) build

flutter 빌드 명령어는 찾아보면 꽤 다양하다. 여기에 time 을 붙여서 사용해주었다.

time flutter build ios --release

또는

time flutter build ios --verbose

단, verbose 로 빌드하면 모든 세부 로그를 출력하기 때문에 정말 길다. 그래서 보통 로그 파일로 저장해서 확인하는 것 같다. 로그가 진짜 진짜 진짜 너무 길고 순식간에 지나가기 때문에 정말 미세한 정보를 뜯어 봐야하는 게 아니라면 사용하지 않을 것 같다.

(3) 실제 적용한 명령어

아무튼 나는 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


여기서부터는 삽질 과정 기록


굳이 안봐도 된다.
나중에 또 헤멜 일이 있으면.. 이걸 보고 해결 하겠지.


(1) 빌드 실패 - Firestore 패키지만 버전 고정

결과: 빌드 실패
원인: firestore 외 다른 패키지 버전 고정 x

  • 위에서 설명했던, 공식문서에 기재된 Podfile 코드 부분을 보고 수정하자.
  • tag 에 ISO_SDK_VERSION 부분은 firebase_sdk_version.rb 에서 확인할 수 있다.
  • 현재 10.29.0 으로 되어있길래 그렇게 해주었지만 에러가 났다… 주륵.
  • 원인은 언급한 대로, firestore 뿐만 아니라 FCM, Auth 등 파이어베이스의 다른 패키지들도 사용하고 있었기 때문이었다. 이 패키지들이 모두 호환되는 버전을 적용해줘야 했다.

1) 수정 후 Podfile 코드

# 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

# ...후략

2) 호환되는 버전 찾는 법

호환되는 버전이 뭘까..
릴리즈 노트를 뒤져보러 출발.
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 을 써주었다.


(2) 빌드 차이 없음 - Firestore + 그 외 패키지 버전 고정

결과: 빌드 속도 차이 없음
원인: 버전 고정만 함. firestore 에 컴파일된 깃헙 링크 적용하는 걸 빼먹음


1) 수정한 Podfile

모두 호환되는 버전을 찾았으니, 이를 수기로 고정해주고 빌드해봤다. 근데 안타깝게도 빌드 시간이 단축되진 않았다……. 사전 컴파일 된 깃헙 링크를 적용해주지 않았기 때문에.

아, 참고로 버전 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

# ...후략

2) 빌드 차이 비교하기

캐시 삭제 후 실행

flutter clean
flutter pub get
cd ios
pod install --repo-update
flutter run

변경 전
기존 캐시 지우고 재빌드 - 153.2 s

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

5번 이상 해봐도 딱히 유의미한 차이가 없었다. 띠로리…



(3) 빌드 실패 - Command SwiftGeneratePch failed 에러

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번 넘게 해도 안되길래 그냥 브랜치 버리고 다시 팠다. 다행히 됨..


1) xcode build debug setting

디버그 상세하게 볼 수 있도록 xcode 설정에서 원하는 플래그 추가

추가하는 경로는 아래 참고

2) 기존 프로젝트 캐시 삭제

  1. Xcode > Settings (또는 Preferences) > Locations 탭
  2. Derived Data 옆 폴더 열기
  3. 해당 프로젝트 폴더 내 파일들 삭제

빌드 실패..
아까 맨 위에서 언급했듯이 그냥 xcode 안쓰는 엔딩이 됨



(4) 빌드 단축 성공

1) podfile 전체 코드

# 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

2) 실행 명령어

cd ios
rm -rf Pods Podfile.lock
flutter pub get
cd ios && pod install
time flutter fun ios --release

3) 실행결과

변경 전 후 열 번씩은 해서 전부 캡처하진 못했고.. 하나씩만 사진 첨부.


변경 전

변경 후

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

profile
플러터와 안드로이드를 공부합니다

0개의 댓글