mono android 开机启动,浅析 Android 平台 mono执行机制 by郡墙

在 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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值