Unity Android IL2CPP 编译报错的一种可能原因

Unity 版本 5.6.6f2

在使用 Android 的 IL2CPP 时,发生编译报错,报错内容如下所示:

stdout:
IL2CPP error (no further information about what managed code was being converted is available)
Additional information: Build a development build for more information. δ�������������õ�������ʵ����
il2cpp.exe didn't catch exception: System.NullReferenceException: δ�������������õ�������ʵ����
   �� Unity.IL2CPP.Extensions.GetBaseType(TypeReference typeReference)
   �� Unity.IL2CPP.GenericSharing.GenericSharingVisitor.AddStaticUsageRecursiveIfNeeded(TypeReference genericType)
   �� Unity.IL2CPP.GenericSharing.GenericSharingVisitor.Process(Instruction instruction, MethodDefinition method)
   �� Unity.IL2CPP.GenericSharing.GenericSharingVisitor.ProcessType(TypeDefinition type)
   �� Unity.IL2CPP.GenericSharing.GenericSharingVisitor.Collect(AssemblyDefinition assembly)
   �� Unity.IL2CPP.AssemblyConverter.PreProcessStage(IInteropDataCollector interopDataCollector, ReadOnlyInflatedCollectionCollector& readOnlyGenericsCollectionCollector, TypeDefinition[]& allTypeDefinitions)
   �� Unity.IL2CPP.AssemblyConverter.Apply()
   �� Unity.IL2CPP.AssemblyConverter.ConvertAssemblies(NPath[] assemblies, NPath outputDir, NPath dataFolder, NPath symbolsFolder)
   �� Unity.IL2CPP.AssemblyConverter.ConvertAssemblies(IEnumerable`1 assemblyDirectories, IEnumerable`1 explicitAssemblies, NPath outputDir, NPath dataFolder, NPath symbolsFolder)
   �� il2cpp.Program.DoRun(String[] args)
   �� il2cpp.Program.Run(String[] args)
   �� il2cpp.Program.Main(String[] args)
stderr:

δ���������쳣:  System.NullReferenceException: δ�������������õ�������ʵ����
   �� Unity.IL2CPP.Extensions.GetBaseType(TypeReference typeReference)
   �� Unity.IL2CPP.GenericSharing.GenericSharingVisitor.AddStaticUsageRecursiveIfNeeded(TypeReference genericType)
   �� Unity.IL2CPP.GenericSharing.GenericSharingVisitor.Process(Instruction instruction, MethodDefinition method)
   �� Unity.IL2CPP.GenericSharing.GenericSharingVisitor.ProcessType(TypeDefinition type)
   �� Unity.IL2CPP.GenericSharing.GenericSharingVisitor.Collect(AssemblyDefinition assembly)
   �� Unity.IL2CPP.AssemblyConverter.PreProcessStage(IInteropDataCollector interopDataCollector, ReadOnlyInflatedCollectionCollector& readOnlyGenericsCollectionCollector, TypeDefinition[]& allTypeDefinitions)
   �� Unity.IL2CPP.AssemblyConverter.Apply()
   �� Unity.IL2CPP.AssemblyConverter.ConvertAssemblies(NPath[] assemblies, NPath outputDir, NPath dataFolder, NPath symbolsFolder)
   �� Unity.IL2CPP.AssemblyConverter.ConvertAssemblies(IEnumerable`1 assemblyDirectories, IEnumerable`1 explicitAssemblies, NPath outputDir, NPath dataFolder, NPath symbolsFolder)
   �� il2cpp.Program.DoRun(String[] args)
   �� il2cpp.Program.Run(String[] args)
   �� il2cpp.Program.Main(String[] args)

UnityEngine.Debug:LogError(Object)
UnityEditorInternal.Runner:RunManagedProgram(String, String, String, CompilerOutputParserBase, Action`1) (at C:/buildslave/unity/build/Editor/Mono/BuildPipeline/BuildUtils.cs:96)
UnityEditorInternal.IL2CPPBuilder:RunIl2CppWithArguments(List`1, Action`1, String) (at C:/buildslave/unity/build/Editor/Mono/BuildPipeline/Il2Cpp/IL2CPPUtils.cs:313)
UnityEditorInternal.IL2CPPBuilder:ConvertPlayerDlltoCpp(ICollection`1, String, String) (at C:/buildslave/unity/build/Editor/Mono/BuildPipeline/Il2Cpp/IL2CPPUtils.cs:304)
UnityEditorInternal.IL2CPPBuilder:Run() (at C:/buildslave/unity/build/Editor/Mono/BuildPipeline/Il2Cpp/IL2CPPUtils.cs:151)
UnityEditorInternal.IL2CPPUtils:RunIl2Cpp(String, String, IIl2CppPlatformProvider, Action`1, RuntimeClassRegistry, Boolean) (at C:/buildslave/unity/build/Editor/Mono/BuildPipeline/Il2Cpp/IL2CPPUtils.cs:34)
UnityEditor.HostView:OnGUI()

从报错信息来看,是空引用异常,但是却没有指明错误的具体位置。另外,通过其他工程测试 IL2CPP 编译是正常的,说明是当前工程的代码有问题。通过排除法来定位具体错误的位置,最终定位到代码里有一个方法,如下:

static bool IsIosDeviceHighEnd()
{
    string generation = UnityEngine.iOS.Device.generation.ToString().ToLower();
    return list.Contains(generation);
}


虽然在 Android 下不会调用这个方法,但还是进行编译了,而 UnityEngine.iOS.Device 是 iOS 系统的特殊功能接口,在 Android 的 IL2CPP 并没有对应的 C++ 实现,所以就编译错误了。

这里可以通过加宏来控制编译,如下

#if UNITY_IOS
static bool IsIosDeviceHighEnd()
{
    string generation = UnityEngine.iOS.Device.generation.ToString().ToLower();
    return list.Contains(generation);
}
#endif

之后如果再遇到 IL2CPP 编译错误,可以检查下是否包含了 Android 平台下没有实现的方法接口之类的。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Unity 中自动打包 Android Export Project 并执行 Il2Cpp 编译,可以使用 Unity 提供的命令行工具和脚本来完成。 首先,在 Unity 中构建 Android 项目时,需要使用命令行参数来指定平台和构建类型,例如: ``` Unity.exe -batchmode -quit -projectPath "path/to/project" -executeMethod BuildPlayer.Android -logFile "path/to/logfile.txt" -androidPlatform "android" -buildTarget "apk" -androidAPILevel "28" -androidKeystoreName "keystore" -androidKeyaliasName "alias" -androidKeystorePass "password" -androidKeyaliasPass "password" -androidPackage "com.example.app" -androidVersionCode "1" -androidVersionName "1.0" -outputPath "path/to/output.apk" ``` 在执行上述命令后,Unity 会自动打包 Android Export Project,并输出 APK 文件到指定的输出路径。 接下来,需要使用 Unity 提供的 il2cpp.exe 工具来执行 Il2Cpp 编译。在 Unity 安装目录下,可以找到 il2cpp.exe 工具的位置。例如: ``` C:\Program Files\Unity\Editor\Data\il2cpp\build\il2cpp.exe ``` 可以使用以下命令来执行 Il2Cpp 编译: ``` il2cpp.exe --convert-to-cpp -o "path/to/output/folder" "path/to/Android/export/project/so/library" ``` 在执行上述命令后,il2cpp.exe 工具会自动将 Android Export Project 中的 C++ 代码编译成可执行代码,并输出到指定的输出文件夹中。 最后,需要将生成的可执行文件和资源文件打包成 APK 文件。可以使用 Android Studio 或其他 APK 打包工具来完成此操作。 需要注意的是,自动打包 Android Export Project 并执行 Il2Cpp 编译需要一定的命令行和脚本编写经验,建议在实际操作前做好相关的测试和备份工作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值