hello-world.html
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来获取更多的帮助。
更多相关文章
- Mars视频笔记——Socket编程
- eclipse虚拟机adb启动失败
- 捕获TextView超链接
- bindService的注意事项
- Android(安卓)UI 之WaterFall瀑布流效果 [复制链接]
- 从Java到android:类的加载机制
- Android(安卓)Add外部library工程,总是链接失败的原因
- android 模拟器中做端口重定向
- Android(安卓)dalvik虚拟机内部机制详解(2)____内存管理原理