通过链接http://www.virtualbox.org/wiki/Downloads页面选择◦VirtualBox 4.0.8 for Windows hosts x86/amd64下载,下载得到的文件是VirtualBox-4.0.8-71778-Win.exe,直接双击,一步一步next完成安装。
l 下载Ubuntu,网址http://www.ubuntu.org.cn/getubuntu/download/,我选的是最新的11.04,64-bit
l 启动VirtualBox
l 点击”新建”图标,进入[新建虚拟电脑]对话框。点击”next”,在【操作系统】中选择linux,【版本】选Ubuntu(64 bit)
l 为虚拟机分配内存,这里我选择1024,视机器配置而定,不宜超过绿色部分
l 为虚拟机选择虚拟硬盘,我们没有虚拟硬盘,所以点击【创建新的虚拟硬盘】
l 创建虚拟硬盘的时候,选择【固定大小映像】
l 设置虚拟硬盘的位置和大小
l 生成虚拟硬盘的摘要,点击[Finish],就开始创建虚拟硬盘,可能要等待一段时间。
l 把刚刚创建好的硬盘设为虚拟机的启动盘,点击[next]
l 生成系统摘要,点击[Finish].创建虚拟机完成
l 设置虚拟光驱,加载Ubuntu安装光盘(刚刚下载的ubuntu-11.04-desktop-amd64.iso)。
l 在【设置】中点击【Storage】,IDE控制器,CD/DVD Drive中,选中ubuntu安装包
l 点击【系统】,”处理器”tab,勾选”启用PAE/NX”,”硬件加速”tab,勾选“启用VT-x/AMD-v”和”启用Nested Paging”。驱动顺序可以设置为”软驱,硬盘,光驱”。
l 重启,BIOS设置中,enable virtual system
l 打开Virtualbox,启动虚拟机开始Ubuntu的安装过程。
l 安装增强功能。Ubuntu安装完成后,启动,非全屏,需要安装addon。设备—>分配光驱àIDE控制器àchoose a virtual cd/vcd disk file,选中virtualbox里面的“VBoxGuestAddition.iso”,我的在Program Files/Oracle/VirtualBox目录下。Restart ubuntu,在终端中/media/VBOXADDITIONS_4.0.8_71778下执行
sudo ./VBoxLinuxAdditions.runs。Restart,完成。
l 创建共享目录(参考http://blog.csdn.net/hz_chenwenbiaoTMB/archive/2010/07/02/5709573.aspx)。”设备”à”分配数据空间”—>”添加”。设置好数据空间位置和名字,选”固定”,名字最好中文。不要勾选”Auto-mount”。
在linux终端中:
sudo mkdir /mnt/winshare
通过mount命令就可以加载共享目录(其中share就是刚才设置的名字,共享文件夹的名称不要和挂载点名称一样)
sudo mount –t vboxsf share /mnt/winshare
如果不想每次都手动挂载,可以在/etc/fstab中添加一项
share /mnt/winshare vboxsf defaults 0 0
l 启用usb设备(http://blog.csdn.net/zmyde2010/archive/2010/10/16/5945008.aspx)
http://source.android.com/source/initializing.html
sudo apt-get install g++-multilib
http://source.android.com/source/downloading.html
http://source.android.com/source/building.html
编译成功后,emulator在~/mydroid/out/host/linux-x86/bin下,ramdisk.img,system.img和userdata.img则在~/mydroid/out/target/product/generic下(我的android目录为mydroid)
编辑~/.bashrc,增加环境变量
export ANDROID_PRODUCT_OUT=~/mydroid/out/target/product/generic
ANDROID_PRODUCT_OUT_BIN=~/mydroid/out/host/linux-x86/bin
export PATH=$PATH:$ANDROID_PRODUCT_OUT_BIN:$ANDROID_PRODUCT_OUT
同步这些变化
$source ~/.bashrc
运行
$emulator
android中的一个应用程序可以单独编译,编译后要重新生成system.img
在源码目录下执行
$ source build/envsetup.sh
就多出一些命令:
- croot: Changes directory to the top of the tree.
- m: Makes from the top of the tree.
- mm: Builds all of the modules in the current directory.
- mmm: Builds all of the modules in the supplied directories.
- cgrep: Greps on all local C/C++ files.
- jgrep: Greps on all local Java files.
- resgrep: Greps on all local res/*.xml files.
- godir: Go to the directory containing a file.
可以加—help查看用法
我们可以使用mmm来编译指定目录的模块,如编译联系人:
$ mmm packages/apps/Contacts/
编完之后生成两个文件:
out/target/product/generic/data/app/ContactsTests.apk
out/target/product/generic/system/app/Contacts.apk
可以使用
$ make snod
重新生成system.img,再运行模拟器
l 由于emulator虚拟arm指令,CPU占用比较高,所以启动比较慢,特别是第一次启动,要有耐心。
l 运行模拟器时可以打开内核log输出,看下是否有严重错误发生
$emulator –show-kernel
l 可以关闭开机动画,加速启动过程
$emulator –no-boot-anim
l 指定内存大小(缺省为256M),可能对模拟器响应速度有帮助
$emulator –memory 1024
l 如果不调试audio,可以关闭audio
$emulator –noaudio
l 请help emulator的选项
$emulator –help
l 如果模拟器一直无法开启,且无法从kernle log中分析出原因,可以看系统log,结合linux ps,top等命令,或者使用ddms工具进行分析。
$adb logcat
l MountService Patch
我在运行模拟器的时候通过logcat发现,Android启动后卡在下面的语句上,不断的输出这条语句:
W/MountService( 546): Waiting too long for mReady
google之,发现需要打补丁
http://blog.csdn.net/AndyTsui/archive/2011/02/16/6188900.aspx
l 关掉重新启动试试
l 了解之前编译的android所用的内核
$adb shell
$cd proc
$cat version
显示
Linux version 2.6.29-00261-g0097074-dirty ([email protected]) (gcc version 4.4.0 (GCC) ) #20 Wed Mar 31 09:54:02 PDT 2010
$cat cpuinfo
显示
Processor : ARM926EJ-S rev 5 (v5l)
BogoMIPS : 153.60
Features : swp half thumb fastmult vfp edsp java
CPU implementer : 0x41
CPU architecture: 5TEJ
CPU variant : 0x0
CPU part : 0x926
CPU revision : 5
Hardware : Goldfish
Revision : 0000
Serial : 0000000000000000
为了减少版本匹配方面的问题,确定下载2.6.29的gold_fish版本。
l 下载Android的linux内核(kernel为本地内核保存文件夹):
$git clone git://android.git.kernel.org/kernel/common.git kernel
$cd kernel
$git branch
显示:
$android-2.6.36
$cd kernel
显示所有head分支
$git branch –a
显示
$* android-2.6.36
remotes/origin/HEAD -> origin/android-2.6.36
remotes/origin/android-2.6.35
remotes/origin/android-2.6.36
remotes/origin/android-2.6.37
remotes/origin/android-2.6.38
remotes/origin/android-2.6.39
remotes/origin/archive/android-2.6.25
remotes/origin/archive/android-2.6.27
remotes/origin/archive/android-2.6.29
remotes/origin/archive/android-2.6.32
remotes/origin/archive/android-gldfish-2.6.29
remotes/origin/archive/android-goldfish-2.6.27
remotes/origin/linux-bcm43xx-2.6.39
remotes/origin/linux-wl12xx-2.6.39
此处注意2.6.26的goldfish缩写成gldfish。
Check out android-goldfish-2.6.29版本
$git checkout -b android-goldfish-2.6.29 remotes/origin/archive/android-gldfish-2.6.29
等待下载完数据,再次确认工作分支
$git branch
显示
android-2.6.36
* android-goldfish-2.6.29
l 交叉编译环境设置
android代码树中有一个prebuilt项目,包含了我们编译内核所需的交叉编译工具。
tom@tom-VirtualBox:~/froyo/prebuilt/linux-x86/toolchain/arm-eabi-4.4.0/bin$ ls
arm-eabi-addr2line arm-eabi-c++ arm-eabi-g++ arm-eabi-gccbug arm-eabi-gdbtui arm-eabi-nm arm-eabi-ranlib arm-eabi-size
arm-eabi-ar arm-eabi-c++filt arm-eabi-gcc arm-eabi-gcov arm-eabi-gprof arm-eabi-objcopy arm-eabi-readelf arm-eabi-strings
arm-eabi-as arm-eabi-cpp arm-eabi-gcc-4.4.0 arm-eabi-gdb arm-eabi-ld arm-eabi-objdump arm-eabi-run arm-eabi-strip
$gvim ~/.bashrc
增加如下一行:
export PATH=$PATH: ~/froyo/prebuilt/linux-x86/toolchain/arm-eabi-4.4.0/bin
保存后,同步变化
$source ~/.bashrc
修改Kernel目录下的Makefile文件,把CROSS_COMPILE指向的prebuilt中的arm-eabi编译器
CROSS_COMPILE ?= arm-eabi-
把
LDFLAGS_BUILD_ID = $(patsubst -Wl$(comma)%,%,2 $(call ld-option, l$(comma)?build-id,))
这一行注释掉,并且添加一个空的LDFLAGS_BUILD_ID定义
LDFLAGS_BUILD_ID =
l 拷贝goldfish配置文件到kernel目录
$cp arch/arm/configs/goldfish_defconfig .
l 编译
$make goldfish_defconfig
$make –j2
编译较快,最后两行信息
OBJCOPY arch/arm/boot/zImage
Kernel: arch/arm/boot/zImage is ready
l 测试编译成功的内核
$emulator –memory 1024 –show-kernel –no-boot-anim –kernel arch/arm/boot/zImage
内核启动的log中可以看出运行了刚编译成功的zImage。
Linux version 2.6.29-gb0d93fb-dirty (tom@tom-VirtualBox) (gcc version 4.4.0 (GCC) ) #1 Wed Jun 1 18:18:53 CST 2011