设为首页 加入收藏

TOP

Dalvik在x86下的编译及调试(一)
2014-11-24 07:48:41 来源: 作者: 【 】 浏览:2
Tags:Dalvik x86 编译 调试

1、如果使用Ubunut的话,把gcc版本换成4.3的。


gcc -v可以查看当前版本。


sudo apt-get install gcc-4.3 g++-4.3


sudo ln -s /usr/bin/gcc-4.3 /usr/bin/gcc


sudo ln -s /usr/bin/g++-4.3 /usr/bin/g++


默认的4.4 compile时要求更严格,会出现error: invalid conversion from


‘const char*’ to ‘char*’的提示。



2、在源代码跟目录下,运行:


. build/envsetup.sh


lunch 2


这主要设置编译的目标平台。



注:


默认的平台信息如下:


PLATFORM_VERSION_CODENAME=AOSP


PLATFORM_VERSION=AOSP


TARGET_PRODUCT=generic


TARGET_BUILD_VARIANT=eng


TARGET_SIMULATOR=


TARGET_BUILD_TYPE=release


TARGET_BUILD_APPS=


TARGET_ARCH=arm


HOST_ARCH=x86


HOST_OS=linux


HOST_BUILD_TYPE=release


BUILD_ID=OPENMASTER



选用上述平台后的信息如下:


PLATFORM_VERSION_CODENAME=AOSP


PLATFORM_VERSION=AOSP


TARGET_PRODUCT=sim


TARGET_BUILD_VARIANT=eng


TARGET_SIMULATOR=true


TARGET_BUILD_TYPE=debug


TARGET_BUILD_APPS=


TARGET_ARCH=x86


HOST_ARCH=x86


HOST_OS=linux


HOST_BUILD_TYPE=release


BUILD_ID=OPENMASTER



具体需要什么平台可以根据envsetup.sh文件内容进行选择。我这边是x86.




3、编译相对应的模块:


make dalvikvm core ext dexopt framework android.policy services


dalvikvm后面的几个模块是VM本身需要的一些library,比如ext.jar。如果make所有模块也可以,不过耗时就长多了,而且出现编译错误的可能性就大多了。如果只是为了研究dalvik的移植或者调试,上述模块基本够了。需要注意的是,在我参考的一篇文章中没有dexopt项,在运行时会出现该错误“E/dalvikvm(1540):execv 'mnt/hd/Android/out/debug/host/linux-x86/pr/sim/system/bin/dexopt' failed: No such file or directory”,dexopt是对dex文件进行优化的一个模块,一定需要生成。



生成的文件在源码目录下的out文件夹内。可用find . -name dalvikvm查找dalvikvm文件



4、测试hello程序:


hello.java代码:



public class hello{


public static void main(String args[])


{


System.out.println("hello world");


}


}




注意:我是将hello.java和makefile文件放在了Android源码的根目录下,且我的源码是挂载在第二硬盘的下/mnt/hd/Android,因此得


到:ANDROID_SRC_DIR := /mnt/hd/Android,只需对文件目录相应改变即可。又因为Android目录下已有一个Makefile,因此避免冲突


将hello程序的makefile命名为HelloMakefile。



HelloMakefile:


ANDROID_SRC_DIR := /mnt/hd/Android


android_dir_dx = $(ANDROID_SRC_DIR)/out/host/linux-x86/bin/dx


all:


javac hello.java


$(android_dir_dx) --dex --output=hello.jar hello.class


clean:


@rm *.jar *.class



完成上述步骤后,会生成hello.jar、hello.class


Android目录下所有文件如下图所示:



5、如果直接运行/mnt/hd/Android/out/debug/host/linux-x86/pr/sim/system/bin/dalvikvm -cp hello.jar hello则会出现以下错误:


E/dalvikvm( 4668): ERROR: must specify non-'.' bootclasspath


W/dalvikvm( 4668): JNI_CreateJavaVM failed


Dalvik VM init failed (check log file)



原因是虚拟机运行的一些相关文件没有加载。因此需要一个脚本文件,命名为


rund.sh:



#!/bin/sh



base=`pwd`



# configure root dir of interesting stuff


root=$base/out/debug/host/linux-x86/pr/sim/system


export ANDROID_ROOT=$root



# configure bootclasspath


bootpath=$root/framework


export 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 exists


export ANDROID_DATA=/tmp/dalvik_$USER


mkdir -p $ANDROID_DATA/dalvik-cache



exec gdb $root/bin/dalvikvm



而后输入以下命令即可运行gdb程序,调试dalvik的运行了:


./rund.sh


然后在gdb调试下输入运行参数:


set args -cp hello.jar hello


设置断点


b main


以下就可以单步调试dalvik了。


以下是我的运行结果:



zhutou@zhutou-desktop:/mnt/hd/Android$ ./rund.sh


Copyright (C) 2010 Free Software Foundation, Inc.


License GPLv3+: GNU GPL version 3 or later


This is free software: you are free to change and redistribute it.


There is NO WARRANTY, to the extent permitted by law. Type "show copying"


and "show warranty" for details.


This GDB was configured

首页 上一页 1 2 下一页 尾页 1/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇Linux下Python基础调试 下一篇Linux移植到mini2440 浅谈

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·JAVA现在的就业环境 (2025-12-26 01:19:24)
·最好的java反编译工 (2025-12-26 01:19:21)
·预测一下2025年Java (2025-12-26 01:19:19)
·Libevent C++ 高并发 (2025-12-26 00:49:30)
·C++ dll 设计接口时 (2025-12-26 00:49:28)