유니티 IOS 빌드시 발생하는 Stripping의 방지

2018. 1. 22. 19:26Programming/Unity3d

유니티 IOS 빌드 XCode프로젝트 생성 + XCode에서 앱 빌드  후
실기기에서 플레이 했을 때 발생한 오류에 대한 정리

1.
MissingMethodException: Method not found: ‘Default constructor not found…ctor() of System.ComponentModel.EnumConverter’
… 중략
System.Reflection.MonoCMethod:Invoke(…)

EnumExtensions의 TryParse 내부에서 System.ComponentModel.EnumConverter가 호출되는데 이 부분이 Stripping 되어 문제가 생김.

http://docs.unity3d.com/kr/current/Manual/iphone-playerSizeOptimization.html
링크 내용을 보면 빌드시 정적분석을 통해 사용되지 않는 기능을 제거하는데 Reflection처럼 동적인 기능은 분석에 어려움이 있으므로 블랙(화이트?)리스트를 제공하면 된다고.

Assets폴더에 link.xml 파일을 생성하여 위 오류 발생한 컴포넌트를 선언하면 됨.


2.

오류라 추정되는 코드에서는 리플렉션을 이용하여 ProtoBuf에 있는 메서드를 생성하는데

코드별로 로그를 남기고 및 null체크 결과

MethodInfo method = parser.GetType().GetMethod(“ParseFrom”, new Type[] { typeof(CodedInputStream) });

ParseFrom을 찾지 못해서 nullreference가 생기고 있었음.
이 부분도 1번 문제와 동일하게 유니티가 라이브러리를 stripping한 것으로 추정하고
link.xml에
<assembly fullname=”Google.Protobuf” preserve=”all”> 삽입하여 이 어셈블리를 통으로
최적화 하지 못하도록 하였더니 문제가 해결되었음.