嵌入式虚拟机控制
*概述
*扩展JNI检查
*断言
*字节码验证和优化
*执行模式
*死锁预测
*堆栈转储
#############################################
概览
Dalvik虚拟机支持各种命令行参数(通过adb shell dalvikvm - help来获取帮助手册),但它不可能通过Android应用程序运行环境传递任意参数。此外,可以通过设置某些系统属影响虚拟机的行为。
对于下面描述的所有功能,均可以通过setprop命令设置系统属性,例如:
adb shell setprop
这些命令需要重启Android运行环境才能生效。(adb shell stop;adb shell start). 这是因为所有的设置均在"zygote"守护进程中处理。
你还可以通过在/data/local.prop中增加:
=
来设置系统属性。
这些改动需要在系统重启后生效,但是会被wipe data(清除Data分区)命令删除。
(提示: 可以在本地创建local.prop,并且通过adb push local.pro /data传入)
################################################
扩展JNI检查
JNI, 即Java本地接口,提供用Java编程语言编写的代码与C/C++代码交互的一种方式。扩展的JNI检查会导致系统运行变慢,但是他们可以在很多Bug导致严重问题前发现这些Bug.
可以通过-Xcheck:jni命令行参数启用扩展JNI检查。
有两个系统属性影响这项功能:
首先是ro.kernel.android.checkjni,这个在Android编译系统中编译开发版本时设置。(在Android模拟器上,除非启动模拟器时设置了模拟器命令行参数-nojni,否则该功能都默认被启用)。因为这是一个"ro."属性,一旦设备启动,该属性便不能被改变。
译者添加:
PS: Android编译系统里设置ro.kernel.android.checkjni 位于 build/core/main.mk 中。
为了允许切换该CheckJNI标志,第二个属性即dalvik.vm.checkjni,也会被检查。
这个属性值会覆盖ro.kernel.android.checkjni.
如果这两个系统属性值均没有被定义,或者dalvik.vm.checkjni被设置为false.
-Xcheck:jni 设置的参数也不会被传入,并且也不会启用JNI检查。
打开JNI检查:
adb shell setprop dalvik.vm.checkjni true
也可以通过 -Xjniopts 参数设置dalvik.vm.jniopts值,打开虚机的JNI-checking选项。
了解更多 JNI checks信息,请看 JNI tips.
################################################
断言
Dalvik虚拟机支持Java编程语言“断言”.默认情况下该支持是关闭的,但是提供通过 -ea参数设置dalvik.vm.enableassertion值。
该参数与在其他VM中的作用相同。你可以传入一个类名,包名,或者特殊值"all".
例如:
adb shell setprop dalvik.vm.enableassertions all
在所有非系统类里,可以进行断言。
该系统属性比起full command line有很多限制。 这是因为不能指定多个-ea入口,并且也无法指定一个-da入口。目前没有提供与-esa/-dsa等价的功能。
################################################
字节码验证与优化
系统试图预先验证dex文件中的所有类,以减少类加载开销,并进行一系列优化来提高运行性能。无论是在编译还是安装,预验证与优化均通过调用dexopt命令执行。在开发版本中,dexopt将会在dex文件第一次被使用以及该文件或其依赖的文件被更新时执行(“just-in-time”实时优化和验证)。
有两个命令标志来控制实时验证和优化,即-Xverify以及-Xdexopt.Android framework会基于dalvik vm.dexopt标志来配置这些属性。
如果设置:
adb shell setprop dalvik.vm.dexopt-flags v=a,o=v
framework则会传递 -Xverify:all -Xdexopt:verified 参数到vm.打开验证,并且验证成功后进行类的优化。这是最安全的,也是默认的设置。
也可以设置dalvik.vm.dexopt-flags为v=n,framwork则会传递 -Xvreify:none -Xdexopt:verified参数来禁止验证。(我们可以传递 -Xdexopt:all 来允许优化,但是不一定会优化更多的代码,因为类验证失败很可能会导致跳过类的优化)。没有经过dexopt验证的类,将会作为未经核实的代码加载并执行。
启用验证将会似的dexopt命令执行时间大大延长,因为验证过程是非常耗时的。一旦dex文件已经经过验证和优化,除非之前的验证失败,再次验证则不会花费额外的开销。
如果一开始禁用了验证,而之后又将验证打开,加在应用程序的速度将会显著下降(大约40%或更多),因为在第一次使用时会进行类的验证。
为了获得最佳效果,应当在该属性改变时就对所有dex文件强制执行re-dexopt。
adb shell "rm /data/dalvik-cache/*"
这会清除dex文件的缓存版本。记住要停止并且重启运行环境。
(adb shell stop;adb shell start)
################################################
阅读(3156) | 评论(2) | 转发(1) |