dalvik debugger模块实现细节

来源:互联网 发布:apache tika 编辑:程序博客网 时间:2024/06/05 17:30

转自:http://littlejeffrey.blog.163.com/blog/static/1940146862012914105720807/

1.dalvik debugger模块设计与交互方式

   ddms/jdi->jdwp->debugger interface->vm
   虚拟机的debug功能是遵守jdwp协议的,dalvik在jdwp协议上进行扩展,定义了ddms协议。在工程模式下,虚拟机的ddm默认是打开的,虚拟机启动之后,就会启动一个jdwp线程,ddm通过jdwp协议发送和接收数据,当手机发现有ddms接入的时候,jdwp会建立连接,并进行数据交换。
   dalvik虚拟机debug和ddms功能模块化非常明显。debugger和ddms都是遵守jdwp协议的,debug数据交互完全就是jdwp协议的实现,而ddms协议就是利用jdwp协议中未使用的命令集(199/1)进行交互。
    由于jdwp是一个有完整定义的协议,因此具有可移植性,为了保持这个特性,dalvik将jdwp同虚拟机进行分离,具体分离方式是:jdwp不直接通虚拟机进行交互,而是通过Debugger.c中的接口进行交互(jdwp只调用Debugger.c中定义的函数,而虚拟机也不直接调用jdwp中的接口。当出现互调时,都在Debugger.c中进行封装)。
   ddms协议也被定位成了可移植的协议,因此整个ddms协议都是由java代码实现,ddms的数据通讯一般情况是ddms->jdwp->debugger.c->ddm.c->java代码->虚拟机native函数->虚拟机内部->debugger.c->jdwp->ddms。
   debugger同虚拟机建立通讯的方式有两种:主动方式和被动方式。
   1)主动方式中,程序使用debug as的方式启动,启动之后,jdi询问vm是否支持debugger,在支持debugger的情况下,虚拟机会一直等待debugger连接完成才会继续。
   2)被动方式中,进程使用普通的方式启动,启动之后,ddms和虚拟机建立连接。然后虚拟机运行在non-debugger的模式下,知道在ddms中点击debug,ddms会发送一个非ddms包,虚拟机的探测到从jdwp接收到的非ddms包,就认为有一个debugger连接产生了,因此切换到debug模式。
   jdwp自身会区分数据来源:从jdi/ddms发送来的数据被认为是请求(req),这种请求被JdwpHandle处理;从虚拟机内部发送的数据被认为是事件(event),由JdwpEvent处理。






其他:
经过统计,android应用大部分运算和内存分配都集中在一个主线程中,因此dalvik选择了偏向锁来实现线程间的同步,偏向锁在单个线程请求的情况下可以提高加锁的效率,当多线程竞争锁时,偏向锁会变重,从而退化成一个普通的锁。
原创粉丝点击