`
阿尔萨斯
  • 浏览: 4364015 次
社区版块
存档分类
最新评论

编译x86 平台的dalvik

 
阅读更多

参考文章:

我实验的版本是android 4.222222r1。

通过repo init和repo sync下载好源码之后,

敲命令:source ./build/envsetup.sh

然后:lunch


1
2
3
4
5
6
7
8
9
10
11
12
13
You're building on Linux
Lunch menu... pick a combo:
1. full-eng
2. full_x86-eng
3. vbox_x86-eng
4. full_stingray-userdebug
5. full_wingray-userdebug
6. full_crespo4g-userdebug
7. full_crespo-userdebug
8. full_maguro-userdebug
9. full_toro-userdebug
10. full_tuna-userdebug
11. full_panda-eng

输入2,回车。

然后,输入命令:make dalvikvm core ext dexopt framework android.policy services-j16

最后一个参数是为了加快编译速度,根据自己的机器配置来设置。

编译完成之后,如果cd到out/target/product/generic_x86/system/bin

然后,ll

会看到有如下两个文件:

1
2
3
4
5
6
wuhe.jyh@ubuntu:~/4.0.3r1/out/target/product/generic_x86/system/bin$ ll
total 32
drwxr-xr-x 2 wuhe.jyh wuhe.jyh 4096 2013-06-03 15:29 ./
drwxr-xr-x 5 wuhe.jyh wuhe.jyh 4096 2013-06-03 15:29 ../
-rwxr-xr-x 1 wuhe.jyh wuhe.jyh 8311 2013-06-03 15:29 dalvikvm*
-rwxr-xr-x 1 wuhe.jyh wuhe.jyh 12204 2013-06-03 15:29 dexopt*

此时,输入dalvikvm回车:

1
2
3
E/dalvikvm(24398): ERROR: must specify non-'.'bootclasspath
W/dalvikvm(24398): CreateJavaVM failed: dvmClassStartup failed
Dalvik VM init failed (check logfile)

如果cd到android 源码目录~/4.2222r1,然后执行:

./out/target/product/generic_x86/system/bin/dalvikvm

则:

1
2
wuhe.jyh@ubuntu:~/4.0.3r1$ ./out/target/product/generic_x86/system/bin/dalvikvm
-bash: ./out/target/product/generic_x86/system/bin/dalvikvm: No suchfileor directory


启动dalvik,还是需要一些环境设置,用脚本比较方便。在源码根目录,创建文件rund.sh,内容如下(https://gist.github.com/guohai/5048153):

rund.sh ---修改版
我实验的版本是android 4.222222r1。
#!/bin/sh
# base directory, at top of source tree; replace with absolute path
base=`pwd`
# configure root dir of interesting stuff
root=$base/out/host/linux-x86
export ANDROID_ROOT=$root
export LINUX_86_LIb=$base/out/host/linux-x86
export DEX_BOOTJARS=$base/out/target/product/generic_x86/dex_bootjars/system/framework
# configure bootclasspath
bootpath=$base/out/target/product/generic_x86/system/framework
export BOOTCLASSPATH=$bootpath/core.jar:$bootpath/ext.jar:$bootpath/framework.jar:$bootpath/android.policy.jar:$bootpath/services.jar:$DEX_BOOTJARS/conscrypt.jar
export LD_LIBRARY_PATH=$bootpath/lib:$LD_LIBRARY_PATH:$LINUX_86_LIb/lib
# 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 $root/bin/dalvikvm -Xdexopt:none $@
如果上面的运行有错误的话,肯定是缺一些包或者是库、类之类的,自己在编译好的android 工程中找,就上就行了


然后chmod a+x rund.sh

然后,我们创建一个Java文件:

1
2
3
4
5
classFoo {
publicstaticvoidmain(String[] args) {
System.out.println("Hello, Foo!!");
}
}

保存为Foo.java到源码根目录。

然后,shell里边执行:

javac Foo.java

dx --dex --output=Foo.dex Foo.class

然后,我们来执行dalvik虚拟机:

./rund.sh -cp Foo.dex Foo回车

结果如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
I/dalvikvm(24743): DexOpt: mismatch dep name:'/home/wuhe.jyh/4.0.3r1/out/target/product/generic_x86/system/framework/core.odex'vs.'/system/framework/core.odex'
E/dalvikvm(24743):/home/wuhe.jyh/4.0.3r1/out/target/product/generic_x86/system/framework/ext.jar odex has stale dependencies
I/dalvikvm(24743): Zip is good, but no classes.dex inside, and no valid .odexfileinthe same directory
I/dalvikvm(24743): DexOpt: mismatch dep name:'/home/wuhe.jyh/4.0.3r1/out/target/product/generic_x86/system/framework/core.odex'vs.'/system/framework/core.odex'
E/dalvikvm(24743):/home/wuhe.jyh/4.0.3r1/out/target/product/generic_x86/system/framework/framework.jar odex has stale dependencies
I/dalvikvm(24743): Zip is good, but no classes.dex inside, and no valid .odexfileinthe same directory
I/dalvikvm(24743): DexOpt: mismatch dep name:'/home/wuhe.jyh/4.0.3r1/out/target/product/generic_x86/system/framework/core.odex'vs.'/system/framework/core.odex'
E/dalvikvm(24743):/home/wuhe.jyh/4.0.3r1/out/target/product/generic_x86/system/framework/android.policy.jar odex has stale dependencies
I/dalvikvm(24743): Zip is good, but no classes.dex inside, and no valid .odexfileinthe same directory
I/dalvikvm(24743): DexOpt: mismatch dep name:'/home/wuhe.jyh/4.0.3r1/out/target/product/generic_x86/system/framework/core.odex'vs.'/system/framework/core.odex'
E/dalvikvm(24743):/home/wuhe.jyh/4.0.3r1/out/target/product/generic_x86/system/framework/services.jar odex has stale dependencies
I/dalvikvm(24743): Zip is good, but no classes.dex inside, and no valid .odexfileinthe same directory
Hello, Foo!!


如果要用gdb调试,只要把rund.sh最后一句修改成:

exec gdb $root/bin/dalvikvm

然后,

./rund.sh

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

setargs-cphello.jarhello

设置断点

bmain

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

以下是我的运行结果:

wuhe.jyh@ubuntu:~/4.0.3r1$ ./rund.sh
GNU gdb (Ubuntu/Linaro 7.2-1ubuntu11) 7.2
Copyright (C) 2010 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
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 as "x86_64-linux-gnu".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>...
Reading symbols from /home/wuhe.jyh/4.0.3r1/out/host/linux-x86/bin/dalvikvm...done.
(gdb) set args -cp Foo.dex Foo
(gdb) b main
Breakpoint 1 at 0x804877a: file dalvik/dalvikvm/Main.cpp, line 152.
(gdb) r
Starting program: /home/wuhe.jyh/4.0.3r1/out/host/linux-x86/bin/dalvikvm -cp Foo.dex Foo
[Thread debugging using libthread_db enabled]
Breakpoint 1, main (argc=4, argv=0xffffcdf4) at dalvik/dalvikvm/Main.cpp:152
152     setvbuf(stdout, NULL, _IONBF, 0);
(gdb) c
Continuing.
I/dalvikvm(24808): DexOpt: mismatch dep name:'/home/wuhe.jyh/4.0.3r1/out/target/product/generic_x86/system/framework/core.odex' vs.'/system/framework/core.odex'
E/dalvikvm(24808):/home/wuhe.jyh/4.0.3r1/out/target/product/generic_x86/system/framework/ext.jar odex has stale dependencies
I/dalvikvm(24808): Zip is good, but no classes.dex inside, and no valid .odex file in the same directory
I/dalvikvm(24808): DexOpt: mismatch dep name:'/home/wuhe.jyh/4.0.3r1/out/target/product/generic_x86/system/framework/core.odex' vs.'/system/framework/core.odex'
E/dalvikvm(24808):/home/wuhe.jyh/4.0.3r1/out/target/product/generic_x86/system/framework/framework.jar odex has stale dependencies
I/dalvikvm(24808): Zip is good, but no classes.dex inside, and no valid .odex file in the same directory
I/dalvikvm(24808): DexOpt: mismatch dep name:'/home/wuhe.jyh/4.0.3r1/out/target/product/generic_x86/system/framework/core.odex' vs.'/system/framework/core.odex'
E/dalvikvm(24808):/home/wuhe.jyh/4.0.3r1/out/target/product/generic_x86/system/framework/android.policy.jar odex has stale dependencies
I/dalvikvm(24808): Zip is good, but no classes.dex inside, and no valid .odex file in the same directory
I/dalvikvm(24808): DexOpt: mismatch dep name:'/home/wuhe.jyh/4.0.3r1/out/target/product/generic_x86/system/framework/core.odex' vs.'/system/framework/core.odex'
E/dalvikvm(24808):/home/wuhe.jyh/4.0.3r1/out/target/product/generic_x86/system/framework/services.jar odex has stale dependencies
I/dalvikvm(24808): Zip is good, but no classes.dex inside, and no valid .odex file in the same directory
[New Thread 0xf4ef3b70 (LWP 24811)]
[New Thread 0xf46eeb70 (LWP 24812)]
[New Thread 0xf3ee9b70 (LWP 24813)]
[New Thread 0xf36e8b70 (LWP 24814)]
[New Thread 0xf2ee3b70 (LWP 24815)]
Hello, Foo!!
[Thread 0xf36e8b70 (LWP 24814) exited]
[Thread 0xf2ee3b70 (LWP 24815) exited]
[Thread 0xf3ee9b70 (LWP 24813) exited]
[Thread 0xf46eeb70 (LWP 24812) exited]
[Thread 0xf4ef3b70 (LWP 24811) exited]
Program exited normally.
gdb调试,可以用ctrl x+a切换到简易的图形界面。就像vc下的调试,可以对应到代码行。

分享到:
评论

相关推荐

    dalvik linux-x86.zip

    6. **跨平台执行**:Dalvik虚拟机在Linux-x86上的实现,展示了Android应用的跨平台能力,这在早期Android系统中尤为重要,因为那时Android设备主要集中在ARM架构,而开发者可能使用各种不同平台进行开发。...

    让为ARM写程序在Android X86 4.0上运行

    Android X86项目是将Android操作系统移植到X86平台上的开源项目,允许用户在X86设备或虚拟机上运行Android系统。对于开发者来说,这意味着他们可能需要让自己的ARM应用在X86平台上运行,以便在非ARM设备上测试和分发...

    porting-android-x86.rar_android_android x86_android 移植

    10. **应用兼容性**:虽然大多数Android应用是基于ARM指令集编译的,但通过使用兼容层(如Intel的Houdini)可以实现对x86平台的兼容。然而,部分应用可能需要原生支持x86才能达到最佳性能。 综上所述,"porting-...

    u3d_apk反编译文件展示

    2. **Classes.dex**:这是Dalvik虚拟机可执行的代码,包含Unity引擎的Java代码以及项目中的脚本编译后的字节码。Unity使用JIT(Just-In-Time)编译器将C#代码转换为Java字节码。 3. **Resources.arsc**:包含了APK...

    Intel支持Andriod开发培训教程

    Dalvik应用在英特尔平台进行优化后可以正常工作,而Android本机(NDK)应用程序则需要在Android运行时、Dalvik虚拟机、内核库等进行重新编译,以获得最佳性能。如果存在依赖于特定处理器的代码,则可能需要移植。 ...

    apk反编译工具中文版 v2.1 绿色版

    3. SO库反编译:APK中的.so文件是针对特定平台的本地库,如armeabi-v7a或x86。虽然SO文件的反编译难度相对较大,但某些工具可以提供一定程度的反汇编,帮助理解其功能。 4. XML与TXT加密:APK中的XML资源文件包含了...

    Crypto++ 7.0.0 for Android (已编译)

    NDK编译的优势在于它可以利用硬件加速特性,提高加密操作的速度,并且由于代码不在Dalvik虚拟机中运行,可以避免Java层的一些安全风险。 在实际应用中,开发者可以利用Crypto++库实现各种安全功能。例如,为敏感...

    adt-bundle-windows-x86-20140624工具文件

    "adt-bundle-windows-x86-20140624工具文件"是一个专为Windows平台上的x86架构设计的Android开发工具包。这个压缩包包含了Android开发者需要的一系列核心工具,使得用户能够在本地环境中创建、调试和发布Android应用...

    ApkDB 直接右键apk文件反编译

    - classes.dex:Dalvik虚拟机执行的字节码文件,包含应用的Java代码。 - res/:资源文件夹,包括布局、图片、字符串等资源。 - assets/:原封不动地保存应用的额外文件。 - lib/:针对不同架构的库文件(如armeabi、...

    adt-bundle-windows-x86_64-20140321.zip

    - **Build Tools**: 提供编译和构建应用所需的工具,如aapt(Android Asset Packaging Tool)和dx(Dalvik Executable converter)。 - **Android Platform**: 包含特定Android版本的库和系统文件,是构建应用的...

    android源码编译及rom制作.pptx

    - `prebuilt`:x86和ARM架构下预编译的一些资源。 - `sdk`:SDK及相关模拟器。 - `system`:文件系统库、应用及组件,主要是用C语言编写。 - `vendor`:厂商定制代码。 #### 四、初始化编译环境 编译Android源码...

    apk 最新反编译工具,测试可用

    - **lib/**: 平台特定的库文件,如armeabi-v7a或x86。 - **assets/**: 开发者自定义的任意文件。 **2. APK反编译的目的** - **逆向工程**: 分析APK的工作原理,查找安全漏洞或理解其业务逻辑。 - **修改资源**: ...

    anroid8.1编译使用OpenJDK.tar.zip

    例如,本压缩包中的"java-1.8.0-openjdk.linux.x86_64.tar.gz"文件,便是针对Linux平台的x86_64架构提供的OpenJDK 1.8版本。这个版本的JDK包含了编译Android 8.1所需的全部组件,如javac编译器、jar打包工具以及...

    android-ndk-r16b-windows-x86_64.zip

    1. **交叉编译工具链**:这些工具允许你在非Android系统上构建针对Android平台的原生库。它们包括GCC和Clang编译器,分别支持ARM, x86, MIPS等架构。 2. **Android.mk和Application.mk文件**:这些是构建原生代码的...

    Android 编译文件树1

    前者包含了适用于所有设备的代码,后者则针对特定硬件平台,例如驱动程序和传感器。 `Prebuilts`目录包含预构建的库,这些库可能出于隐私或性能原因不随源代码一起发布。预构建库可以加速构建过程,并使第三方...

    反编译工具

    32位系统(如基于x86架构的设备)和64位系统(如基于ARM64架构的设备)在指令集和内存管理上有所不同,因此一个反编译工具能够同时处理这两种类型意味着它具备高级的解析和转换能力。 描述中提到的“完美编译各种...

    android JNI运行NDK编译成的可执行文件

    NDK提供了一套工具链,允许开发者在本地环境中编译源代码,生成适用于Android平台的机器码。这些工具包括交叉编译器,用于将源代码转换为ARM、x86或其他Android架构的二进制格式。生成的文件可以是`.so`(共享对象)...

    Android源码编译流程借鉴.pdf

    `emulator`程序位于`~/mydroid/out/host/linux-x86/bin`目录下,而`ramdisk.img`、`system.img`和`userdata.img`等镜像文件则在`~/mydroid/out/target/product/generic`路径下。通过修改环境变量,可以指定模拟器...

    Android源码编译流程.pdf

    完成编译后,Android镜像文件位于`out/host/linux-x86/bin`目录下,如`ramdisk.img`、`system.img`和`userdata.img`。可以在模拟器或真实设备上运行这些镜像进行测试和调试。在运行前,可能需要设置环境变量,例如...

    android-ndk-r20b-darwin-x86-64.zip

    1. **交叉编译器**:用于将源代码编译为目标平台(如Android设备)的可执行代码,支持多种架构,如armeabi-v7a, arm64-v8a, x86, x86_64等。 2. **构建系统**:如Android Gradle插件的NDK支持,它允许你在Android ...

Global site tag (gtag.js) - Google Analytics