Dalvik虚拟机基础介绍

Dalvik虚拟机负责执行JAVA程序在Android应用程序框架。它也可以直接在桌面系统下作为虚拟机运行。

编写一个JAVA语言代码,然后编译成.class文件并转换到一个DEX文件,最后将它放置到设备上。这边有一个简单的例子:

% echo 'class Foo {'\
> 'public static void main(String[] args) {'\
> 'System.out.println("Hello, world"); }}' > Foo.java
% javac Foo.java
% dx --dex --output=foo.jar Foo.class
% adb push foo.jar /sdcard
% adb shell dalvikvm -cp /sdcard/foo.jar Foo
Hello, world


-cp 选项的做用是设置类文件路径。“adb shell”的初始化目录将不被使用,因此最好使用绝对路径名称。dx命令接受一组class文件,目录,或者Jar包。当使用“--output”参数指定输出文件名是必须以.jar,.zip,或者.apk作为输出。一个.dex文件将被创建并且被存储在由“--output”输出的包内。

运行“adb shell dalvikvm -help”来现实命令行参数列表。


使用调试器

可以使用任意支持“JDWP”兼容的调试器来调试单独的应用程序。这里有两种基础的方法。第一种是采用TCP直接链接的方式。使用以下的参数启动“dalvikvm”。

-agentlib:jdwp=transport=dt_socket,address=8000,server=y,suspend=y

这条命令将告诉虚拟机等待调试器链接自身的TCP协议8000端口。然后你虚拟机使用adb启用一个本机8000端口到设备8000端口的映射。这样链接本机的8000端口就相当于链接设备的8000端口。

% adb forward tcp:8000 tcp:8000

使用调试器来链接本机的8000端口(这里使用jdb作为例子)

% jdb -attach localhost:8000

当调试器附加,虚拟机将处于挂起状态。然后就可以对当前程序设置断点。

第二种方法是采用“DDMS”链接,使用以下参数启动“dalvikvm”

-agentlib:jdwp=transport=dt_android_adb,suspend=y,server=y

当transport被改变,并不需要再次指定一个TCP端口。当应用程序启动,它将出现在DDMS列表中,并且以"?"号作为应用程序的名称,选定它在DDMS,并且链接它使用以下类似命令:

% jdb -attach localhost:8700

因为命令行程序不包括客户端DDM设置,所以像线程监视与跟踪这样特性并不在DDMS中进行支持。它仅仅作为一个调试器在这个模式中作为支持。

可以查看“Dalvik调试器支持”以获得更多的信息。


在桌面系统编译并且运行Dalvik

Dalvik虚拟机可以直接运行在桌面系统。这需要重新设定新的环境以及一些本地代码库。

在android源码目录中使用命令

  . build/envsetup.sh  lunch sim-eng

你将看到以下的输出:

  ============================================  TARGET_PRODUCT=sim  TARGET_BUILD_VARIANT=eng  TARGET_SIMULATOR=true  TARGET_BUILD_TYPE=debug  TARGET_ARCH=x86  HOST_ARCH=x86  HOST_OS=linux  HOST_BUILD_TYPE=release  BUILD_ID=  ============================================

这个配置会使用glibc库链接并且建立dalvik虚拟机的桌面版。

使用make命令编译整个android。

编译完成后运行dalvikvm

  % dalvikvm  E/dalvikvm(19521): ERROR: must specify non-'.' bootclasspath  W/dalvikvm(19521): JNI_CreateJavaVM failed  Dalvik VM init failed (check log file)

发生这样的错误需要指定引导类路径并且给定一个jar文件解压dex数据的目录路径。可以编写一个以下这样的脚本:

#!/bin/sh# base directory, at top of source tree; replace with absolute pathbase=`pwd`# configure root dir of interesting stuffroot=$base/out/debug/host/linux-x86/product/sim/systemexport ANDROID_ROOT=$root# configure bootclasspathbootpath=$root/frameworkexport BOOTCLASSPATH=$bootpath/core.jar:$bootpath/ext.jar:$bootpath/framework.jar:$bootpath/android.policy.jar:$bootpath/services.jar# this is where we create the dalvik-cache directory; make sure it existsexport ANDROID_DATA=/tmp/dalvik_$USERmkdir -p $ANDROID_DATA/dalvik-cacheexec dalvikvm $@

然后使用以上那个测试程序:

  % cat > Foo.java  class Foo { public static void main(String[] args) {    System.out.println("Hello, world");  } }  (ctrl-D)  % javac Foo.java  % dx --dex --output=foo.jar Foo.class  % ./rund -cp foo.jar Foo  Hello, world

使用./rund -help来获取更多的帮助。

更多相关文章

  1. Mars视频笔记——Socket编程
  2. eclipse虚拟机adb启动失败
  3. 捕获TextView超链接
  4. bindService的注意事项
  5. Android(安卓)UI 之WaterFall瀑布流效果 [复制链接]
  6. 从Java到android:类的加载机制
  7. Android(安卓)Add外部library工程,总是链接失败的原因
  8. android 模拟器中做端口重定向
  9. Android(安卓)dalvik虚拟机内部机制详解(2)____内存管理原理

随机推荐

  1. android-详解Android中的屏幕方向
  2. Android(安卓)Notification的使用
  3. Android(安卓)字体颜色变化(点击)
  4. Android(安卓)渐变drawable背景
  5. ImageVIew 设置图片大小
  6. Android中蓝牙使用步骤小结
  7. Issues with db4o in latest versions of
  8. Android唯一标识
  9. Android(安卓)Studio(三):设置Android(安
  10. android 学习总结