View
[Flutter] iOS 아카이빙 Distribution 중 The archive did not include a dSYM for the Flutter.framework 에러 발생 해결하기
sm_amoled 2025. 3. 20. 23:44이번에 출시한 앱의 버전 업데이트를 위해 iOS 아카이빙을 진행하면서 Distribution 옵션을 선택했는데, 아래와 같은 경고 메시지를 맞닥뜨렸다.
ㅤ

ㅤ
Upload Symbols Failed
The archive did not include a dSYM for the Flutter.framework with the UUIDs [0000-0000]. Ensure that the archive's dSYM folder includes a DWARF file for Flutter.framework with the expected UUIDs.
근데 Appstore Connect 앱에서는 해당 앱이 정상적으로 Distribute 되었다고 알림이 와서, 위 경고가 어떤 내용인지 조금 더 찾아보고자 한다. 혹시 앱 크래시가 발생하는 원인이 될 수 있다면 심사에서 리젝을 받을 수도 있으니깐!
ㅤ
dSYM
dSYM은 Debug Symbols File 을 말한다. 이 파일은 빌드한 앱이 크래시가 나거나 문제가 발생했을 때 원인을 찾기 위해서 사용하는 파일로, 문제가 발생한 바이너리 코드 → 소스코드 매핑을 도와주어 어떤 부분에서 문제가 발생했는지를 파악하는 도구이다.
ㅤ
Xcode에서 빌드 세팅 쪽을 살펴보면, DWARF 파일 (디버깅 정보를 저장하는 파일)과 함께 dSYM 파일을 생성해달라고 옵션이 설정되어있는 것을 확인할 수 있다.

ㅤ
그런데, 빌드 과정에서 이 dSYM 파일이 누락되어서 경고가 발생한 것으로 파악된다.
ㅤ
Xcode의 Archive 들을 관리하는 폴더 (Preference > Location > Archive 저장 위치를 확인하면 된다) 에서 내가 아카이빙 한 프로젝트의 패키지를 열어보니, 이렇게 dSYM 폴더가 있는 것을 볼 수 있다.

이 폴더를 열어보니 다양한 dSYM 파일들이 있었다. 다들 외부에서 가져온 패키지들에 대한 dSYM 파일들이 생성되어 있었다. 여기 부분은 약간 궁예이긴 한데, 외부 패키지를 합쳐서 XCode에서 빌드해주는게 아니라 각각을 하나의 모듈(프러덕트?) 으로 취급하면서 각자 별도로 디버깅 정보를 확인하고자 이렇게 관리하고 생성하는 것 같다.
→ 여기에 대해서 조금 더 찾아봤더니 정적 프레임워크(static framework)에 대해서는 분리된 dSYM 파일이 생성되지 않으니 고려하지 않아도 괜찮다는 구글 다큐먼트가 있다는 것으로 미루어보아, dSYM 파일은 동적 프레임워크(dynamic framework) 에 대해서 별도로 생성이 되는 것으로 보인다. 흠,, 굿.
ㅤ

이전에 앱스토어에 업로드했던 아카이브 패키지를 열어서 dSYMs 파일들을 비교해봤더니, 경고 메시지에서 나온 것처럼 Flutter.framework.dSYM 파일이 누락되어있는 것을 확인했다.
ㅤ
다른 파일들은 잘 남아있는데 Flutter의 dSYM 파일만 누락된 것은 빌드 과정에서의 문제라고 생각돼서, 우선 클린 빌드를 다시 한 번 시도해보았다.
flutter clean
flutter build ios --release
ㅤ
그래도 동일한 문제가 발생했다! ㅜㅜㅜ
ㅤ
단순히 클린 빌드로 해결할 수 있는 문제가 아니였나보다.
문제 해결하기
열심히 검색을 시도하고 있는데, 가장 많이 거론되는 이야기는 flutter upgrade 를 사용해서 그냥 플러터 버전을 올리면 해결된다는 내용이였다. 현재 FVM을 사용하고 있기 때문에 비교적 간편하게 플러터 버전을 오르내릴 수는 있는 상황이지만, 여러가지 환경값들 (gradle 이라든가,,, 코틀린 이라든가,,, 여러 패키지들의 dependency가 깨지면 또 골치아픈 상황쓰,,,) 을 일일이 수정해주는 수고를 덜기 위해 몇 시간동안 구글링을 했다.
ㅤ
그리고 마침내, 뭔가 문제 해결의 실마리를 가지고 있는 듯 보이는 어떤 일본 아티클을 발견했다!! 👀👀
링크는 여기 -> [iOS] Flutter engineのクラッシュをCrashlyticsで解析する
ㅤ
플러터 빌드 시에 Flutter.framework.dSYM 파일이 자동으로 생성되지 않는, 나와 같은 문제를 겪고 있는 듯 하였고, 직접 Flutter dSYM 파일을 구해서 아카이브에 넣어주거나 관리 콘솔에 업로드 하는 등의 방식으로 문제 해결이 가능하다고 해석된다.
ㅤ
위 글과 링크되어있는 깃허브 문서에 따르면, 플러터 버전을 올릴 때 마다 Flutter dSYM 파일을 구글 클라우드에 함께 업로드를 하고있다고 한다. 어차피 내가 직접 작성한 소스코드가 아닌 Flutter 코드 (엔진 코드)의 dSYM 파일이 필요한 거니깐, 여기에서 dSYM 파일을 구해 아카이브에 넣어주더라도 문제가 없을 거라고 생각하고 시도해보았다.
ㅤ
플러터 버전에 따라서 적용해줄 수 있는 방식이 다르기 때문에, 이를 참고해서 진행해주면 될 것 같다.
iOS
Since Flutter 3.24, symbols can be found in the Flutter framework's artifact cache, within the xcframework bundle atbin/cache/artifacts/engine/ios-release/Flutter.xcframework.
- Symbols for device builds are in the ios-arm64/dSYMs/Flutter.framework.dSYM bundle.
- Symbols for simulator builds are in the ios-arm64_x86_64-simulator/dSYMs/Flutter.framework.dSYM bundle.
For versions prior to Flutter 3.24, the dSYM bundle can downloaded from Google Cloud Storage. Follow the steps from the Android section in this guide, but in the last step use a download url following this schema:https://storage.cloud.google.com/flutter_infra_release/flutter/38a646e14cc25f5a56a989c6a5787bf74e0ea386/ios-release/Flutter.dSYM.zip (replace the engine hash with your hash).
For release since Flutter 3.24, these symbols are no longer uploaded as a separate archive and should be obtained from the artifact cache as described above. The artifact cache can be downloaded direcly using a URL following this schema:https://storage.googleapis.com/flutter_infra_release/flutter/c11fe483947c95553610ab59210af643f031f5f4/ios-release/artifacts.zip (replace the engine hash with your hash).
ㅤ
나는 현재 플러터 버전을 3.24.1 을 사용해주고 있기 때문에, 마지막 방식으로 dSYM 파일을 구해주고자 했다. 현재 내가 사용중인 플러터 3.24.1 의 엔진 해쉬값을 구해주기 위해 아래와 같이 터미널에서 찾아주었다.
// 사용중인 플러터 폴더를 찾아준다
where flutter
> /Users/sungmin/fvm/default/bin/flutter
// 플러터 폴더 내 bin/internal 폴더로 들어와준다
cd /Users/sungmin/fvm/default/bin
cd internal
// 엔진 해쉬를 출력한다.
cat engine.version
> c9b9d5780da342eb3f0f5e439a7db06f7d112575
// 이 값이 나의 플러터의 엔진 해쉬값이다!
ㅤ
이렇게 구해준 앤진 해쉬값을 URL 중간에 넣어서 해당 파일을 다운로드 해줬다.
ㅤ
그러면 다운로드 받은 artifacts 의 구석에 Flutter.framework.dSYM 파일이 있는 것을 확인할 수 있다!

ㅤ
// 또는 가장 상단에 나와있는 것 처럼, 어차피 3.24 버전부터 플러터 cache 내에 이 dSYM 파일을 포함하고 있기 때문에, 이걸 그대로 사용해줘도 될 것 같다 ㅎㅎ 머쓱타드~
경로는 `flutter-디렉토리-경로/artifacts/engine/ios-release/Flutter.xcframework/ios-arm64/dSYMs` 를 찾아가면 된다.

ㅤ
이렇게 찾은 플러터 dSYM 파일을 내가 아카이빙 한 xcarchive 패키지 내의 dSYMs 안에 넣어주면 된다.
ㅤ
아카이브 파일은 Xcode > Preference > Locations > Archives의 경로를 확인해주면 되고, 여기에서 내가 만든 아카이브 파일인 xcarchive를 우클릭 > 패키지 내용 보기 로 까주면 dSYMs 를 확인할 수 있다.


ㅤ
여기에다가 Flutter.framework.dSYM 파일을 쇽 복붙해준다!
그 다음 다시 Archives 탭으로 돌아와서 AppStore Connect로 수정한 아카이브 파일을 Distribute App 해주면 경고 메시지 없이 성공적으로 배포할 수 있다! ㅤ

기존의 아카이빙에서 발생하지 않던 문제가 왜 하필 이번 업데이트에서 발생했는지는 파악하지 못했지만, 아카이브 패키지 내 Flutter.framework.dSYM 파일의 누락으로 발생하는 경고이며 이를 해결하는 방법에 대해서 정리해봤다.
ㅤ
우선 이번 버전에서는 이러한 방식으로 문제를 회피했지만, 언제까지나 버전업을 할 때 마다 이런 수고로운 작업을 해줄 수는 없으니, 또 한 번 더 문제가 발생하면 Flutter 버전 업을 심각하게 고려해봐야겠다.
ㅤ
'Develop > Flutter 개발' 카테고리의 다른 글
[Flutter] Equatable 패키지는 값 비교를 해주지 않는다. (0) | 2025.01.14 |
---|---|
[Flutter] FutureProvider의 캐싱 (0) | 2025.01.14 |
[Flutter] 같은 열거 값 이름을 가진 서로 다른 두 Enum 간의 변환에는 findWhere을 사용하자! (0) | 2024.09.28 |
[Flutter] 3.24 버전부터 Swift Package Manager를 지원! (3) | 2024.09.28 |
[Flutter] Dart의 void 타입은 null이 아니다 / this function has a return type of void and cannot be used (0) | 2024.09.20 |