介绍

Dalvik虚拟机支持多个命令行参数(使用adb shell dalvikvm -help来获取一个摘要),但是这些参数不能传递给任意参数给Android应用程序运行时。但是可以通过系统属性来影响虚拟机的行为。

使用以下命令来设置系统属性:

adb shell setprop <name> <value>

在重新设置了系统属性后,需要重新启动Android运行时才会生效(利用指令adb shell stop; adb shell start)。这是因为这些系统属性将在“zygote”进程进行处理,这条进程是系统启动后的第一条进程并且一直存在在系统运行期间。


你不能设置dalvik.*属性或者重启系统作为一个普通用户。必须使用adb root 或者从设备运行su命令去获取root权限。

adb shell getprop <name>

以上命令将获取并显示系统属性的值。

但是这样的设置在重新启动系统后,不再会起作用,可以修改/data/local/prop文件并且添加类似:

<name> = <value>

这样的语句到文件中,来设置系统属性。这样的改变将影响重启后的设定。


扩展JNI检查

JNI是JAVA原生接口,它提供一种在JAVA程序里运行(C/C++)代码的能力。这个扩展JNI检测将导致系统运行非常慢。当时它可以在程序崩溃前立刻确定一些错误。

这里提供了两个系统属性来影响这个特性,并通过启用-Xcheck:jni命令行参数进行修改。第一个属性是"ro.kernel.android.checkjni"。这个属性将被设置在编译Android系统时。(它直接作用于Android虚拟机,除非在虚拟机启动时指定-nojni参数)因为这是一个“ro.”属性,所以这个值在设备启动之后将不能改变。

开关CheckJNI标志,第二个系统属性是dalvik.vm.checkjni。这个值会重写“ro.kernel.android.checkjni”系统属性。如果两个属性都没有被定义,或者dalvik.vm.checkjni被设置为false,-Xcheck:jni标志没有被指定,那么JNI检查将会被禁止。

启动JNI检查采用以下命令:

adb shell setprop dalvik.vm.checkjni true

也可以通过修改系统属性来通知虚拟机。dalvik.vm.jniopts将作为一组值的集合被传递做为 -Xjniopts的参数。例如:

adb shell setprop dalvik.vm.jniopts forcecopy

断言

Dalvik虚拟机支持JAVA语言“assert”语句。默认它们是关闭的,可以通过修改“dalvik.vm.enableassertions”属性或者通过-ea参数来启用它。

可以指定单独的类名称或者使用值"all"来对所有类启用断言。

以下是一个例子:

adb shell setprop dalvik.vm.enableassertions all

以上命令将启动断言在所有的非系统类中。

字节码验证与优化

虚拟机系统尝试每次加载DEX文件时验证所有的类以减少重复加载类的开销。并且通过优化DEX字节码来提高运行时性能。它们两者的设置都是通过dexopt命令,两者的设置都是在编译系统或者安装时。


“On a developmentdevice, dexopt may be run the first time a DEX file is usedand whenever it or one of its dependencies is updated ("just-in-time"optimization and verification).”

以上这段没有看明白。


有两个命令行标志控制及时验证与优化,-Xverify 与 -Xdexopt。这两个参数是基于dalvik.vm.dexopt-flags系统属性。

以下命令

adb shell setprop dalvik.vm.dexopt-flags v=a,o=v

与虚拟机参数-Xverify:all -Xdexopt:verified的作用是一样的。这将启用验证功能与仅优化验证成功的类。这是一个安全的设定,并且这个设置是默认的。

也可以设置系统属性dalvik.vm.dexopt-flags v=n,这相当于设置虚拟机参数为-Xverify:none -Xdexopt:verified 去禁止验证。(也可以使用-Xdexopt:all去开启优化全部代码,但是这不会优化更多的代码。那些验证失败的代码将会被跳过优化。)那些被dexopt优化的代码与没有验证的代码都会被加载与执行。

开启验证将会使dexopt命令签名时间花费过长,因为验证进程相当的慢。一旦验证与优化DEX文件完准备完成。除了那些每次验证失败的类验证过程将不产生其余附加的开销。

如果DEX文件验证失败,并且在之后将验证开启,当应用程序第一次使用加载时会非常的慢(可能会慢40%以上)。

可以通过以下命令强行开启re-dexopt系统属性对所有的DEX文件。

adb shell "rm /data/dalvik-cache/*"

这条命令将清空所有DEX版本的缓冲。然后重新关闭重启运行(adb shell stop;adb shell start)。

(上一个版本的运行时支持一个布尔值的系统属性dalvik.vm.verify-bytecode,现在被替换到dalvik.vm.dexopt-flags系统属性上)

执行模式

Dalvik虚拟机支持三种类型的解释器类型,“fast”,“portable”,与“debug”三种模式。“fast”模式是针对于特定硬件平台的解释器。有些解释器代码是通过特定硬件平台的汇编语言进行编写的。“portable”类型解释器是采用C语言进行编写的,移植性比较强,适用于更广泛的平台。“debug”是”portable“的一个特定版本,包含了“剖析”与“单步执行”功能。

虚拟机也支持“just-in-time”编译技术。所以它不是一个严格意义上的解释器。JIT编译技术的开启与关闭都是通过同一个标志项。(可以通过dalvikvm -help命令查看如何开启JIT编译技术在你的虚拟机上。)

虚拟机允许在“fast”,“portable”与“jit”之间通过-Xint参数进行扩展。这个命令参数也可以通过系统属性dalvik.vm.execution-mode进行设置。

选择“portable”解释器,可以使用以下命令:

adb shell setprop dalvik.vm.execution-mode int:portable

如果系统属性没有被指定,系统会自动的选择合适的解释器。一些像JIT编译技术这种特性也会自动启动。

不是所有的硬件平台都会被优化。在这种情况下,“fast”解释器将会产生一系列的C函数头,并且这种版本的运行结果将比“portable”版本的解释器要慢。

如果profiling被启动或者调试器被附加,虚拟机将切换到“debug”解释器,当profiling结束或者调试器被断开,原始的解释器会被唤醒。(当profiling数据时,“debug”模式的解释器将会运行的非常慢)

可以在APK应用程序的AndroidManifest.xml中添加android:vmSafeMode="true"来禁止JIT编译技术。这对你确认你的应用程序错误是有用的。

栈DUMPS

在桌面的运行的Dalvik虚拟机可以接收一个SIGQUIT(Ctrl-\或者kill -3)dump出所有线程的栈信息。并且输出到Android的日志文件。

dalvik.vm.stack-trace-file系统属性设定dump栈信息到哪个文件。也可以通过虚拟机参数-Xstacktracefile参数进行设定。

例如:

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

如果系统属性没有被定义,则虚拟机会将这些信息写入到Android的日志文件。

DEX文件校验

因为一些性能上的原因,在被优化的DEX文件上校验和是被忽略的。其实这是安全的,因为这些文件在设备上都是禁止修改的。

如果设备的存储设备有些问题,数据的读写将会发生错误。这通常会导致虚拟机的崩溃。为了快速诊断这样的故障,虚拟机提供了-Xcheckdexsum参数。这会导致所有的DEX文件在使用之前验证它的校验和。

也可以通过以下命令来开启验证DEX的校验和系统属性来开启这个特性。

adb shell setprop dalvik.vm.check-dex-sum true

如果DEX文件校验失败,则不会被虚拟机夹在,并且会将这个错误记录到日志文件。如果设备要保存错误日志,可以直接添加这个系统属性到/data/local.prop。

也可以使用dexdump工具去验证DEX文件校验和。

通用标志

在“Gingerbread”发布后,传递标志到虚拟机的通用机制如下所示:

adb shell setprop dalvik.vm.extra-opts "flag1 flag2 ... flagN"

标志使用空格被分割。这些标志组合的长度限定在92个字符内。

extra-opts标志的指将会被附加到命令行的末尾。这将会覆盖之前的一些设定。尝试使用-Xmx不同的值通过Android框架明确的指定。


PS:我翻译的太烂了。

更多相关文章

  1. Android 使用反射机制获取或设置系统属性(SystemProperties)
  2. ImageView的android:scaleType各属性含义(zz)
  3. SONY 系列手机 Android 5.1 系统 Root 方法
  4. Android布局中的android:onClick=“...”属性
  5. android gridview几个重要属性
  6. Android-TextView属性ellipsize多行失效的解决思路

随机推荐

  1. Android(安卓)Studio离线配置
  2. Android培训班(51)
  3. android内存泄漏分析的一种方式
  4. Android(安卓)电子签名/手写签名 保存到
  5. Android开发规范:Java命名规范
  6. Android实现ViewPager滑动播放视频,ViewPa
  7. Android沙盘原理与实现
  8. Android(安卓)在子线程中更新UI的几种方
  9. android:scrollbar的一些属性
  10. Android每隔几秒做一个动作实现方法