Dalvik虚拟机杂记

Dalvik虚拟机主要完成对象生命周期的管理、堆栈的管理、线程管理、安全和异常的管理,以及垃圾回收等重要功能。

其架构为:.class->Dx Tools->.dex->Class Loader->解释器、内存管理、线程管理(Dalvik VM)->Host OS(Linux)

一个.dex文件,通常需要由类加载器加载原生类和Java类,然后通过解释器根据指令集对Dalvik字节码进行解释和执行。在加载具体的类之前,需要先读取出.dex文件的内容,这与普通的文件读取不一样,它不会使用read()来读取,而是使用mmap函数,该函数会将.dex文件映射到内存中,通过普通的内存读取操作即可访问.dex文件,然后解析.dex文件内容并加载到其中的类到哈希表中。

在mterp目录中有一个重要的部分,即cstubs目录,它负责解释器的工作流程。解释器通常是循环执行的,需要一个入口函数来调用处理程序的第一条指令,而后每条指令执行时就会引出下一条指令,通过函数指针调用处理程序。每个处理程序都有一个黏和参数,它包含了各种有用的参数类型。

解释器的入口代码位于interp目录下Interp.c文件中的dvmInterpret函数,可以分别选择C语言和汇编语言来执行dvmInterpretStd和dvmMterpStd。如果是执行汇编实现,就绪要在进入解释器代码钱定义一个C代码跳转到解释器的glue(胶合)结构InterpState,该结构体定义于interp目录下的InterpDefs.h。

JIT技术主要是对多次运行的代码进行编译,当再次调用时使用编译之后的机器码,而不是每次都解释,这样可以节约时间。

Android应用程序框架层中的API大部分调用native方法,这些方法也都由本地代码来实现,然后注册到系统中。注册过程需要使用Dalvik中的一个工具库nativehelper,该库主要用于注册Java本地调用的函数(即通过JNI方式向上层提供接口)。实现nativehelper库的源码位于“dalvik\libnativehelper'\”目录中,最终将被编译成libnativehelper.so动态链接库。通常在使用JNI方式时需使用该库。

Android中每个应用程序在底层都会对应一个Dalvik实例,即一个进程。

Zygote是一个虚拟机进程,同时也是一个虚拟机实例的孵化器。它通过init进程来启动,首先会孵化出System_Server,这是Android绝大多数系统服务的守护进程,之后的所有Android应用程序进程也都是由它孵化而来。Zygote首先孵化出SystemServer,并且监听Socket等待请求命令,当有一个应用程序启动时,就会向SystemServer发出申请,Zygote会跟据SystemServer的命令FORK出一个新的应用程序的进程。这是,Zygote就负责管理各个进程。

Zygote进行FORK时有三种不同的方式:

fork(),FORK一个普通的进程,该进程属于Zygote进程

forkAndSpecialize(),FORK一个特殊的进程,该进程不再是Zygote进程

forkSystemServer(),FORK一个系统服务进程。


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值