Chinaunix首页 | 论坛 | 博客
  • 博客访问: 526391
  • 博文数量: 150
  • 博客积分: 5000
  • 博客等级: 大校
  • 技术积分: 1705
  • 用 户 组: 普通用户
  • 注册时间: 2008-11-11 23:29
文章分类

全部博文(150)

文章存档

2011年(9)

2010年(25)

2009年(94)

2008年(22)

我的朋友

分类: LINUX

2009-11-15 11:33:19

嵌入式虚拟机控制

    *概述
    *扩展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)

################################################
阅读(3121) | 评论(2) | 转发(1) |
给主人留下些什么吧!~~

okitamicuki14122010-04-28 11:02:51

这个是翻译的Android源码中的文档

chinomango2010-04-18 00:27:54

至少要说明出处吧?