読者です 読者をやめる 読者になる 読者になる

all green

プログラム、アプリ作成、Web等備忘録が中心です

UnityのiOS版ビルドでエラー「Fatal error in Mono CIL Linker」

Unity5.2.2 ⇒ 5.3へのアップデートの際におきた問題の対応メモ


既存のプロジェクト(広告やらのpluginがてんこ盛り)を
Unity 5.3で開き、ビルドを行ったときに発生。

エラー内容

Failed running /Applications/Unity/Unity.app/Contents/Frameworks/Tools/UnusedByteCodeStripper2/UnusedBytecodeStripper2.exe -out "{プロジェクトのパス}/Temp/StagingArea/Data/Managed/tempStrip" -l none -c link -b False -x "/Applications/Unity/PlaybackEngines/iOSSupport/Whitelists/Core.xml" -f "/Applications/Unity/Unity.app/Contents/Frameworks/il2cpp/LinkerDescriptors" -x "{プロジェクトのパス}/Temp/StagingArea/Data/Managed/../platform_native_link.xml" -x "{プロジェクトのパス}/Temp/StagingArea/Data/methods_pointedto_by_uievents.xml" -x "{プロジェクトのパス}/Assets/link.xml" -d "{プロジェクトのパス}/Temp/StagingArea/Data/Managed" -a  "{プロジェクトのパス}/Temp/StagingArea/Data/Managed/Assembly-CSharp-firstpass.dll" -a  "{プロジェクトのパス}/Temp/StagingArea/Data/Managed/Assembly-CSharp.dll" -a  "{プロジェクトのパス}/Temp/StagingArea/Data/Managed/UnityEngine.UI.dll" -a  "{プロジェクトのパス}/Temp/StagingArea/Data/Managed/DOTween.dll" -a  "{プロジェクトのパス}/Temp/StagingArea/Data/Managed/Opencoding.Console.dll"

stdout:
Fatal error in Mono CIL Linker
System.Exception: Error processing method: 'System.Void Opencoding.Console.KeyboardInputField::set_Input(System.String)' in assembly: 'Opencoding.Console.dll' ---> Mono.Cecil.ResolutionException: Failed to resolve UnityEngine.GUIContent UnityEngine.TextEditor::content
  at Mono.Linker.Steps.MarkStep.MarkField (Mono.Cecil.FieldReference reference) [0x00000] in <filename unknown>:0 
  at Mono.Linker.Steps.MarkStep.MarkInstruction (Mono.Cecil.Cil.Instruction instruction) [0x00000] in <filename unknown>:0 
  at Mono.Linker.Steps.MarkStep.MarkMethodBody (Mono.Cecil.Cil.MethodBody body) [0x00000] in <filename unknown>:0 
  at Mono.Linker.Steps.MarkStep.ProcessMethod (Mono.Cecil.MethodDefinition method) [0x00000] in <filename unknown>:0 
  at Mono.Linker.Steps.MarkStep.ProcessQueue () [0x00000] in <filename unknown>:0 
  --- End of inner exception stack trace ---
  at Mono.Linker.Steps.MarkStep.ProcessQueue () [0x00000] in <filename unknown>:0 
  at Mono.Linker.Steps.MarkStep.Process () [0x00000] in <filename unknown>:0 
  at Mono.Linker.Steps.MarkStep.Process (Mono.Linker.LinkContext context) [0x00000] in <filename unknown>:0 
  at Mono.Linker.Pipeline.Process (Mono.Linker.LinkContext context) [0x00000] in <filename unknown>:0 
  at Mono.Linker.Driver.Run () [0x00000] in <filename unknown>:0 
  at Mono.Linker.Driver.RunDriverWithErrorHandling (Mono.Linker.Driver driver) [0x00000] in <filename unknown>:0 
  at Mono.Linker.Driver.RunDriver (Mono.Linker.Driver driver) [0x00000] in <filename unknown>:0 
stderr:

UnityEngine.Debug:LogError(Object)
UnityEditorInternal.Runner:RunManagedProgram(String, String, String, CompilerOutputParserBase) (at /Users/builduser/buildslave/unity/build/Editor/Mono/BuildPipeline/Il2Cpp/IL2CPPUtils.cs:94)
UnityEditorInternal.AssemblyStripper:RunAssemblyLinker(IEnumerable`1, String&, String&, String, String) (at /Users/builduser/buildslave/unity/build/Editor/Mono/BuildPipeline/AssemblyStripper.cs:107)
UnityEditorInternal.AssemblyStripper:StripAssembliesTo(String[], String[], String, String, String&, String&, String, IIl2CppPlatformProvider, IEnumerable`1, Boolean) (at /Users/builduser/buildslave/unity/build/Editor/Mono/BuildPipeline/AssemblyStripper.cs:100)
UnityEditorInternal.AssemblyStripper:RunAssemblyStripper(String, IEnumerable, String, String[], String[], String, IIl2CppPlatformProvider, RuntimeClassRegistry, Boolean) (at /Users/builduser/buildslave/unity/build/Editor/Mono/BuildPipeline/AssemblyStripper.cs:201)
UnityEditorInternal.AssemblyStripper:StripAssemblies(String, IIl2CppPlatformProvider, RuntimeClassRegistry, Boolean) (at /Users/builduser/buildslave/unity/build/Editor/Mono/BuildPipeline/AssemblyStripper.cs:131)
UnityEditorInternal.IL2CPPBuilder:Run() (at /Users/builduser/buildslave/unity/build/Editor/Mono/BuildPipeline/Il2Cpp/IL2CPPUtils.cs:201)
UnityEditorInternal.IL2CPPUtils:RunIl2Cpp(String, String, IIl2CppPlatformProvider, Action`1, RuntimeClassRegistry, Boolean) (at /Users/builduser/buildslave/unity/build/Editor/Mono/BuildPipeline/Il2Cpp/IL2CPPUtils.cs:128)
UnityEditor.HostView:OnGUI()


IL2CPP のストリッピング周りの問題だと思って色々ぐぐってみたら
link.xmlに無視するものを記載すれば解決できそうな感じ。

Unity公式「Unity - マニュアル: ビルドした iOS プレイヤーのサイズ最適化
⇒※「iOS Stripping Level」の設定は5.1くらいから消えた。

ふーんと思いつつ何のAssetで起きているのか確認してみる。
(今回の場合は'Opencoding.Console.dll')

https://www.assetstore.unity3d.com/jp/#!/content/25559

ストアからファイル一覧を確認してみたら
パッケージの中にlink.xmlが入っている・・・。

パッケージを落としなおしてlink.xmlをマージ。
iOS版のビルドをしてみたら無事XCodeのプロジェクトが作成されました。

今回のケースは5.2.2だとビルドが通って5.3だとエラーになるというだけで
「link.xmlのマージしていない」が問題でした。