Dalvik——如何支配vmjava虚拟机和Dalvik虚拟机的分别。

by admin on 2018年9月25日

 一、简介

Google于2007年的正式颁布了Android SDK, 作为
Android系统的要特征,Dalvik虚拟机也首先不善上了人们的视野。它对内存的快使用,和于低速CPU上表现有的赛性能,确实让人侧重。
依赖于底层Posix兼容的操作系统,它好略的姣好经过隔离和线程管理。每一个Android应用在底层都见面相应一个独的Dalvik虚拟机实例,
其代码在虚拟机的分解下可以实施。

         Dalvik虚拟机支持一多元的下令执行参数(使用adbshell dalvikvm
–help获取列表),但是未可能由此android应用运行时来传递任意参数,但是足以经过特定的网参数来影响虚拟机行为。

大抵人数以为Dalvik虚拟机是一个Java虚拟机,因为Android的编程语言恰恰就是是Java语言。但是这种说法并无纯粹,因为Dalvik虚拟机并无是依照Java虚拟机的专业来兑现之,两者并无配合;同时还要简单个明白的异:

         对于下述所有参数,你还好由此setprop来设置系统特性,shell命令如下:

java虚拟机运作的是Java字节码,而Dalvik虚拟机运行的尽管是那专有的文件格式DEX(Dalvik
Executable)。

adbshell setprop <name> <value>

以Java
SE次中之Java类会被编译成一个或多个字节码文件(.class)然后装进到JAR文件,而后Java虚拟机会从相应的CLASS文件以及JAR文
件中收获相应的字节码;Android应用则为是下Java语言进行编程,但是在编译成CLASS文件后,还会见透过一个家伙(dx)将利用拥有的
CLASS文件转换成一个DEX文件,而后Dalvik虚拟机会从内读取指令和数据。

         必须重启android运行时用让改生效(adb shell stop:adb
shell
start)。这是为,这些设定在zygote进程中处理,而zygote最早启动以永远存活。

Dalvik及Android系统Android作为新一代之基于Linux的开源手机操作系统,其系架构由下而上可以分成以下几有:

         你不得以以无特权用户的身份设定dalvik.*参数与重新开系统。你可以当用户调试版本的shell上以adb
root还是运行su一声令下来博取root权限,如发生问号,

Linux内核

**adbshell getprop <name>**

本地库

         可以告诉你setprop是否来。

Android运行库

         如果你莫思量当装备又开之后特性消失,在/data/local.prop上加一行:

利用框架

<name>= <value>

应用

         重开之后这样的更改为会见直接是,但是要是data分区被错除了就消灭了。(提示:在工作台上创造一个local.prop,然后adb
push local.prop /data/,或者,使用类于adb shell “echo name =value
>> /data/local.prop”的命令——注意,引号很重大)

java虚拟机和Dalvik虚拟机的别:

 

Dalvik虚拟机java虚拟机

二、扩展的JNI检测

dalvik虚拟机是基于寄存器的java虚拟机基于栈。
基于栈的机要使用指令来载入和操作栈上数,所需要指令更多还多

         JNI(Java Native
Interface),java本地接口,提供了java语言程序调用本地(C/C++)代码的方。扩展的JNI检测会招系统运作更缓慢,但是好发现相同文山会海的讨厌的bug,防止他们发问题。

Dalvik运行的是起定义的.dex字节码格式。(java类为编译成.class文件后,会经过一个dx工具将有所的.class文件转换成一个.dex文件,然后dalvik虚拟机会从里头读取指令和数量java虚拟机运行的是java字节码。(java类会被编译成一个或多只字节码.class文件,打包到.jar文件中,java虚拟机从相应的.class文件以及.jar文件中获得相应的配节码)

         有有限只网参数影响是职能,这个职能可以经-Xcheck:jni令执行参数来激活。第一单参数是ro.kernel.android.checkjni,这是经android编译系统对development的编译来安装的(也可以透过android模拟器设置,除非通过模拟器命令行置了-nojni标志位)。因为马上是一个”ro.”特性,设备启动以后参数就未克转换了。

常量池已被改为单使用32个之目,以
简化解释器。dalvik的积聚和仓库的参数可以经过-Xms和-Xmx更改

         为了能够触发CheckJNI标志位,第二栽特色是dalvik.vm.checkjni,它的价值覆盖了ro.kernel.android.checkjni的价。

一个采用,一个虚拟机实例,一个过程(所有android应用的线程都是指向承诺一个linux线程,都运作在自己的沙盒中,不同之采取在不同之经过被运行。每个android
dalvik应用程序都于予以了一个独的linux PID(app_*))

         如果是特点没有被定义,dalvik.vm.checkjni也绝非设置成false,那么-Xcheck:jni标志位就无传到,JNI检测为就算不曾使能。

Dalvik同标准Java虚拟机(JVM)之间的首要差别之一,就是Dalvik基于寄存器,而JVM基于栈。

         要打开JNI检测,使用以下命令:

Dalvik与Java之间的另外一深分别就是运行环境——Dalvik经过优化,允许以点滴的内存中又运转多独虚拟机的实例,并且每一个
Dalvik应用作为一个独的Linux进程执行。

adbshell setprop dalvik.vm.checkjni true

(1)虚拟机很粗,使用的半空中吗稍微;

         也得以经系统特性将JNI检测选项传递给虚拟机,dalvik.vm.jniopts的价值好由此-Xjniopts参数传入,例如:

(2)Dalvik没有JIT编译器;

adb shellsetprop dalvik.vm.jniopts forcecopy

(3)常量池已受修改为单使用32各之目,以简化解释器;

         更多信息见JNI建议。

(4)它用好的配节码,而非Java字节码。

 

Dalvik虚拟机架构:

三、断言

当android源码中,Dalvik虚拟机的落实在“dalvik/”目录下,其中“dalvik/vm”是虚拟机的兑现有,用会见编译成libdvm.so;

         dalvik虚拟机支持java编程语言的断言表达式,默认它是关闭的,但是可以通过-ea参数的法门(dalvikvm
–ea …..
)设置dalvik.vm.enableassertions特性。

假设”dalvik/libdex”将见面编译成libdex.a静态库作为dex工具;“dalvik/dexdump”是.dex文件的反编译工具;

         在外桌面虚拟机中这个参数同样生效,通过提供class名、package名(后及“…”),或者新鲜值“all”。例如:

虚拟机的可执行程序位于“dalvik/dalvikvm”中,将会编译成dalvikvm可执行文件。

adbshell setprop dalvik.vm.enableassertion all

dalvik虚拟机架构:

不畏好以装有非系统class中只要能断言。

betway必威 1

         这个体系特性比全命令行更叫限制,不可以透过-ea入口设置双重多,而且无点名-da入口的计,而且未来为尚无-esa/-dsa等价格的东西。

Android应用编译和运行流程:

 

Dalvik进程管理:

季、字节码校验和优化

dalvik进程管理是凭借让linux的经过体系布局的,如要吗应用程序创建一个历程,它会采取linux的fork机制来复制一个过程(复制进程往往比较创进程效率又胜)。

         系统尝试预校验dex文件被的所有类,从而降低class的负,从而得以利用同一多级的优化来提升运行性能。这些都是透过dexopt命令来实现的,不论是以编译系统中尚是在设置上。在开发设备及,dexopt可能于dex文件首先浅给运用时运行,而随便其要它们的因是否更新了(Just-in-time优化和校验,JIT)。

Zygote是一个虚拟机进程,同时为是一个虚拟机实例的孵化器,它经过init进程启动。首先会见孵出System_Server(android绝大多网服务的护理进程,它见面监听socket等待请求命令,当有一个应用程序启动时,就会见于它们发出请求,zygote就会FORK出一个初的应用程序进程).每当系统要求实行一个android应用程序时,Zygote就会见采取linux的FORK进制产生一个子经过来实行该应用程序。

         有零星单命行标志位控制JIT优化和校验,-Xverify和-Xdexopt。andorid框架基于dalvik.vm.dexopt-flags特性来配置这俩参数,如果您设定:

JVM和Dalvik进程管理:

adbshell setprop dalvik.vm.dexopt-flags v=a o=v

inux中经过中通信的不二法门有成百上千,但是dalvik使用的是信号方式来完成过程中通信。

         那么android框架会将-Xverify:all-Xdexopt:verified传递给虚拟机,这将设能校验并且只是优化校验成功之class。这是极端安全的设定,也是默认的。

Android的初始化流程:

         你吧足以设定dalvik.vm.dexopt-flags
v=n
叫框架传输-Xverify:none
–Xdexopt:verified从如无若能校验(我们好传-Xdexopt:all从而允许优化,但是这并无可知优化更多代码,因为没通过校验的class可能为优化器以同等的说辞跳过)。这时class不会被dexopt校验,而从不被校验的代码很老难以实施。

betway必威 2

         使能校验会叫dexopt命令明显花费还多日,因为校验过程相对较迟缓,一旦校验和优化了的dex文件准备妥当,校验就非会见占据额外的出除非在加载预校验失败的class。

末段推荐一个Dalvik的

         如果你的dex文件之校验关闭了,而后来还要开辟了校验器,应用加载会明确变慢(大概40%以上)因为class会在首先潮给调用的当儿校验。

Dalvik虚拟机的周转过程分析:

         为了最佳效果,当特性变化的下你当也dex文件强制重新调用dexopt,即:

http://blog.csdn.net/luoshengyang/article/details/8914953

adbshell “rm /data/dalvik-cache/*”

若是您当此文对您拥有助,欢迎入群 QQ交流群 :232203809
微信公众号:终端研发部

         它去了暂存的dex文件,记住要刹车再打开运行时(adb shell
stop:adb shell start
)。

betway必威 3

(老的运转时本支持布尔型的dalvik.vm.verify-bytecode特性,但是给dalvik.vm.dexopt-flags替代了)

(欢迎关注学习及交流)

 

五、运行模式

即dalvik
vm的落实包括三单独立的解释根本:“快速”(fast)、“可移栽”(portable)、“调试”(debug)。快速解释器是也即平台优化的,可能包括手动优化的汇编文件;相对的,可移栽解释器是用C写的,可当科普的平台达成采用;调试解释器是不过移栽解释器的变种,包括了支撑程序分析(profiling)和单步。

vm可能啊支撑just-in-time编译,严格的游说它并无是其它一个解释器,JIT编译器也堪被同样的标志位而能/不使能(查看dalvik
–help
的输出信息来查看JIT编译器是否当公的虚拟机里面如能)。

vm允许你在快捷、可移栽和jit中摘,通过使用-Xint参数的扩充来促成,该参数的值好通过dalvik.vm.execution-mode系统特性来设置。为了挑选而移栽解释器,你该据此:
adb shell setpropdalvik.vm.execution-mode int:portable

如若该参数没有点名,系统会活动选择最好适合的编译器,有时候机器可能允许选择外模式,例如jit编译器。

切莫是有的阳台还发生优化的落实,有时候,快速编译器是出于同名目繁多的c实现的,这个结果碰头比较不过移栽编译器还慢(当我们对所有流行平台都有优化版本的时,这个命名“快速”就再次规范了)。

设程序分析如果能要调试器连接了,vm会变为调试解释器。当次分析了或者调试器中断连接,就见面回复原先的解释器。(用调试解释器会肯定变慢,这是在评估数据经常如果记住的)

JIT编译器可以经以应用程序AndroidManifest.xml中在android:vmSafeMode=”true”来不使能,你怀疑JIT编译器会使你的动运行无正规的时候可以利用。

 

六、死锁预测

         如果虚拟机以WITH_DEADLOCK_PREDICTION参数编译,那么死锁预测器会于-Xdeadlockpredict参数中设能。(dalvikvm
–help会告诉您虚拟机是否编译正确——在Configured中仍行查找deadlock_prediction)这个特性会为虚拟机一直跟对象的缉得的逐一,如果程序试图以同之前看来不同的各个获取有沿,虚拟机会log一个warning并起取舍的废除来很。

         命令行参数是依据dalvik.vm.deadlock-predict特性设置的,正确的价是off代表不若能它(默认),warn表示log问题可继续执行,err代表于monitor-enter指令中引发一个dalvik.system.PotentialDeadlockError异常,abort意味着已整个虚拟机。

         你平凡可以这么使用:

adbshell setprop dalvik.vm.deadlock-predict err

         除非公可以以log信息滚动的时一直关心在。

         注意是特点是死锁预测,不是死锁检测——在眼前兑现着,在沿被抱之后才见面展开测算(这减轻了代码,降低了互斥信息外的冗余)。在挂起的过程中推行kill
-3时可以发现一个死锁,并且可以当log信息被检测及。

         这无非考虑了监督程序,本地的互斥量和另外资源为会惹死锁,而且免会见为它检测到。

 

七、dump堆栈追踪

         和其他桌面虚拟机一样,dalvik虚拟机收到SIGQUIT(Ctrl-\ 或者kill
-3)时,会呢具的现成dump所有的库房追踪。它默认写入Android 的log,但是也得描绘副一个文书。

         dalvik.vm.stack-trace-file特点允许你指定要拿线程堆栈追踪写副的公文称,如果不设有,将开创,新的信息以增多至文件尾,文件称通过-Xstacktracefile参数写副虚拟机。例如:

adbshell setprop dalvik.vm.stack-trace-file /tmp/stack-traces.txt

         如果这个特点没有于定义,虚拟机会以收此信号时拿仓库追踪信息写入android
log。

 

八、dex文件和校验

         出于性能考虑,优化了之dex文件之同校验被撤回了,这便给安全,因为文件是于配备及有的,并且产生禁止修改的权位。

         但是要是设备的存储器不可靠,就会有数损坏,这一般表现为再次的虚拟机崩溃。为了快速诊断这种失败,虚拟机提供了-Xcheckdexsum参数,如果设置了,在情节让以前所有的dex文件还见面进行和校验。

         如果dalvik.vm.check-dex-sum特点深受设能,那么以框架会当虚拟机创建时供者参数。

         为了要能额外的dex和校验,可以:

adbshell setprop dalvik.vm.check-dex-sum true

         不得法的及校验会组织dex数据的应用,产生错误并写副log文件,如果设备都产生了这么的问题,那么将此特点写入/data/local.prop很有因此。

         注意dexdump工具每次都见面进行dex和校验,它吗得以用来检测大量之文本。

 

九、产生标志位

         在“Honeycomb”版本被引入了一致多元之汇编,它们经标志位写副虚拟机:

adb shell setprop dalvik.vm.extra-opts “flag1flag2 … flagN”

         这些标志位之间用空格隔开。你可指定任意多之表明位如它在系统特性值的长度限制外(目前凡92只字符)。

         这些额外的标志位会叫加至命令行的底端,意味着其会盖前的设定。这些可用来例如测试不同的-Xmx的值就是android框架层已经设定了了。

 ———————————————–

jni check的法子,可以对私的jni调用做check, 

每当/data/local.prop里丰富dalvik.vm.checkjni=true, 然后再次开

而没/data/local.prop文件则温馨创造一个放进去

从未root的可试行下面的,重开你的浏览器就推行了

adb shell setprop debug.checkjni 1

为此adb shell getprop dalvik.vm.checkjni看看打印的是免是true

相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图