당신은 시뮬레이터 빌드 속도를 올리기 위해 Crashlytics나 HockeyApp와같은 써드파티 크레쉬 리포팅 서비스를 사용하는가? 오늘 나는 이것이 그냥 이상한 속임수가 아님을 알려주겠다(원문: I've got just the right not-so-weird trick for you today).
이론
지난 몇년동안 빌드 시간을 단축시키는 것에 대한 많은 조언들이 있었다. 많은 글쓴이들은 Debug 구성에서 Debug Information Format을 DWARF로 바꾸어라고 제안했다. 오늘날의 Xcode는 이것이 디폴트로 한다. 이 설정으로 디버그 심볼(생각: 클래스와 메소드 이름)은 바이너리에 직접 들어간다.
- 바이너리를 난독화 시킨다
- 바이너리 크기가 작아진다
그리고 커다란 단점에는
- 따로 분리된 dSYM 파일은 각 빌드마다 생성되기 때문에 긴 빌드시간이 걸린다.
이것은 release 구성에서 디폴트이며, 이 경우는 이해해줄 수 있다.
문제점
위에서 말한 설정은 많은 경우에 완벽하게 괜찮다. 그러나 디버거에 붙이지 않고 DWARF 구성으로 앱을 빌드하면 실패한다. 시도해보면 아래처럼 심볼화되지않은 크래쉬 리포트를 보게 될 것이다.
0 YourApp 0x00000001001e1594 0x100058000 + 1611156
1 YourApp 0x00000001000ed74c 0x100058000 + 612172
2 UIKit 0x000000018f2b67b0 -[UIApplication sendAction:to:from:forEvent:] + 96
3 UIKit 0x000000018f42a5ec -[UIBarButtonItem(UIInternal) _sendAction:withEvent:] + 168
우리는 이것은 symbolicatecrash 툴을 이용해서 손수 심볼화시켜주어야한다.
symbolicatecrash YourApp\ \ 17-10-16\ 23-15.crash YourApp.app/YourApp > symbolicated.crash
크러쉬 난 빌드를 위해서는 .ipa(혹은 .app) 파일에 접근해야할 때가 있음을 인지해라. .ipa 파일은 아카이브 하지 않고는 자동으로 생성되지 않는다.이것은 이 크래쉬 상황의 심볼화 프로세스를 만든다. 그래서 왜 Crashlytics가 각 빌드마다 dSYM 파일을 생성하도록 지향하는지의 이유이다.
(우리가 코드를 수정했다면) 디폴트 설정은 매 빌드마다 앱의 dSYM 파일을 생성하는 것을 보장하는 프로세스이다. 이것이 더 손호하는 구성이므로 개발중이나 내부 테스팅 중에 크레쉬가 나면 그 크레쉬가 난 정확한 라인을 짚어줄 것이다.
내 생각엔 기기에 직접 크레쉬를 심볼화시킬 수 있을지도 모르지만, 더이상 그렇게 할 수 없을 것 같다. 그 이유는 다음과 같다.
- Cocoa SDK 메소드들이 결국 바뀌었다.
- Bitcode를 활성화하면 그 서버에서 애플이 앱을 다시 컴파일한다.
왜 써드파티 크레쉬 리포터들이 매 케이스마다 dSYM 파일을 필요로하는지에대한 이유일 것이다. 따라서 이제 왜 dSYM 파일이 필요한지 알았으므로 귀중한 빌드 시간을 어떻게 절약할 수 있는지 보자.
비결
dSYM 파일을 생성하든 말든 그 선택은 확실해 보인다. 모든 희망을 잃었다...
타겟 SDK에따라 Debug Information Format 값을 다르게 설정할 수 있게 되었다!
이 설정이 우리에게 주는 것은:
- 시뮬레이터 빌드 속도가 더 빨라진다(우리는 거의 항상 연결되있는 디버거를 쓰므로 이제 크레쉬 리포트는 필요하지 않다)
- 기기 빌드에대해 모든 크레쉬 리포트(디버거 외부에서 동작할 확율이 높은)
요약
우리는 매우 쉬운 방법으로 시뮬레이터 빌드 시간을 단축시켰다. 내 경우는 점점 증가하는 빌드(incremental build)에서 1.5초정도 떨어졌다(전체 빌드 시간의 15%). 큰 차이가 아닌것 같아 보여도, 몰입의 순간에는 매 초가 중요할 것이다.
'Swift와 iOS > 기술' 카테고리의 다른 글
[번역] iOS에서의 이벤트 전달: Part1 (0) | 2016.12.30 |
---|---|
[번역] Buffer iOS 앱에서 부드러운 스크롤링 : 어떻게 (그리고 왜) 우리가 AsynDisplayKit로 구현했는지 (0) | 2016.12.30 |
[번역] 어떻게하면 크레쉬가 나지 않을까 #1 (0) | 2016.12.30 |
[번역] 백그라운드 다운로드 (0) | 2016.12.29 |
[번역] 큰 파일 다운로드 시스템을 탄탄하게 설계하기 (0) | 2016.12.29 |
WRITTEN BY
- tucan.dev
개인 iOS 개발, tucan9389
,