admin管理员组文章数量:1582722
在 Android平台中采用Mono机制编译、处理C#语言编写的逻辑代码,编译之后本地存储IL指令。在游戏运行阶段存在代码动态编译的过程,原理为:利用 Unity3D引擎的 Mono jit机制将IL指令编译为机器可识别的汇编指令。
Mono 是什么?
Sponsored by Microsoft, Mono is an open source implementation of Microsoft's .NET Framework based on the ECMA standards for C# and the Common Language Runtime. A growing family of solutions and an active and enthusiastic contributing community is helping position Mono to become the leading choice for development of cross platform applications.
引用官方的介绍,这部分不是本文的重点,有兴趣的读者可以自行前往官网了解。
Mono 的执行流程
首先我们从 mono的入口函数开始分析
大致运行流程如下
Main() => mono_main_with_optinos() => mono_main() => mini_init() => mono_assembly_open() => main_thread_handler() => mini_cleanup()
其中 main_thread_handler 函数主要负责编译 & 处理 IL 指令,执行流程如下
main_thread_handler()
=> mono_jit_exec()
=> mono_assembly_get_image() 得倒 image 信息
=> mono_runtime_run_main()
=> mono_thread_set_main()
=> mono_assembly_set_main()
=> mono_runtime_exec_main()
....
mono_runtime_invoke 处理将要调用的方法,例如 ClassName::Main()。default_mono_runtime_invoke 函数实际调用 mono_jit_runtime_invoke 函数。mono_jit_runtime_invoke 函数调用来 mono_jit_compile_method_with_opt 实现编译目标函数的代码,调用mono_jit_compile_method 编译目标函数的 runtime wrapper (运行时的上层封装调用)。 runtime_invoke 函数调用编译之后的目标函数,其中 info->compiled_method 参数为编译之后目标函数代码在内存中的地址信息。
通过以上分析,mono_jit_compile_method_with_opt 函数为C#函数代码编译为目标机器指令的关键函数,我们来分析以下这部分的执行流程
mono_jit_compile_method_with_opt()
mono_jit_compile_method_inner()
mini_method_compile()
....
其中 mini_method_compile 函数在内部通过 Mono的 JIT 机制实现动态编译过程。
C#函数的执行过程
mono_runtime_invoke 函数实现与 mono \ object.c中,而实际调用 mono_jit_runtime_invoke 函数代码则在 mini.c 文件中。mono_run
版权声明:本文标题:mono android 开机启动,浅析 Android 平台 mono执行机制 by郡墙 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://www.elefans.com/dianzi/1727896111a1136810.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论