[FLUTTER] 231031 TIL (xcode)
스토어에 올라간 안드로이드 앱은 네이티브 코드(cpp)가 잘 실행되는데,
스토어에 올라간 ios 앱은 네이티브 코드에서 오류가 나던 문제
debug나 release 모드에서는 ios에서도 문제없이 됬었음.
로그파일을 남기는 방식으로 디버깅하여 testflight에서
오류가 나던 원인을 찾아본 결과, native 코드의 symbol을 찾지 못한다는 에러 메시지를 뽑아냈음.
우선 뇌피셜 추측으로는, 네이티브 코드의 빌드가 제대로 안되었던게 아닌가? 싶었는데, 확실하지 않았고..
해결하기 가장 어려운 문제인 디버깅이 불가능한 영역으로 넘어간 상황
스토어&테스트 플라이트와, 로컬에서 debug&release 하는 것의 차이는 xcode의 archive 유무 였기 때문에,
에러메시지를 기반으로 xcode와 연관된 키워드를 구글링해봤다.
그랬더니 결과는,
xcode는 프로젝트를 archive 하면, 기본적으로 앱을 optimize하도록 되어 있고, 그 과정에서 native code의 symbol들을 hidden 시킨다는 것이었음. 그러니 네이티브코드에서 symbol을 찾을 수 없다고 뜬것
찾아낸 해결방법은 총 세가지였다
1) xcode의 최적화 기능을 꺼버리기.
xcode의 Runner - Build Settings 어딘가의 Optimization Level을 none으로 바까버리면 됨. 이러면 swift 코드들의 최적화가 이루어지지 않아 앱 용량이 좀 커질 수 있다는 문제. (크진 않음)
2) 네이티브코드 라이브러리를 안드로이드처럼 정적으로 떄려박기.
DynamicLibrary.process() 로 네이티브코드 라이브러리를 동적으로? (동적인진 잘 모름) 빌드하는게 아니라,
DynamicLibrary.open("storage.framework/storage"); 식으로 안드로이드처럼 그냥 고정적으로 라이브러리를 떄려넣는 방식을 쓰는 것 (아마 .process 는 빌드 시 최적화하며 동적으로 변동되는듯한 추측)
이것도 앱 용량이 좀 커질수 있따는 문제 (크진 않음)
3) xcode의 최적화 기능 중, symbol을 hidden 시키는 기능, 혹은 일부를 off 하기.
최적화는 유지 하면서, symbol hidden만 끄는 이 방법이 가장 합리적이라 생각되어 선택함.
xcode의 Runner - Build Settings의 Deployment 내부 Strip Style을
All Symbols -> Non-Global symbols로 바꿔주었다.