今天一天一直在网上搜索关于Adroid操作系统的移植,在网上也找到了一些资料,但很多都有一些问题,根据自己整合后,整理如下:
一、安装交叉编译器
http://www.codesourcery.com/public/gnu_toolchain/arm-none-linux-gnueabi/arm-2008q1-126-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2,可以在以上网站上下载编译器。我想应该也可以用arm920t-eabi-4.1.2这个交叉编译器,没有试过,有机会可以试试。交叉编译器具体的安装步骤就算了。
二、下载android Linux内核
http://code.google.com/p/android/downloads/list?can=1&q=&colspec=Filename+Summary+Uploaded+Size+DownloadCount
Kernel : linux-2.6.23-android-m5-rc14.tar.gz,在以上网站上可以下载到。
解压文件
$ tar -xf linux-2.6.23-android-m5-rc14.tar.gz
解压后等到后面从模拟器里到处config再来编译
三、安装Android SDK
从网上下载linux 版本的Android SDK,如下
http://dl.google.com/android/android-sdk_m5-rc15_linux-x86.zip
下载后解压,获得android-sdk_m5-rc15_linux-x86 文件
在这个sdk里面有emulator模拟器,通过模拟器与busybox,我们可以获得Android的根文件系统。
四、获得root file system
⑴下载busybox 工具从下面地址
http://benno.id.au/blog/2007/11/14/android-busybox(linux 环境中下载)
⑵运行emulator 获取root file system
$ cd <目录>/ android-sdk_m5-rc15_linux-x86/tools
$ ./emulator&
等待emulator 启动,看到出现Android 系统画面,进入菜单ALL/Dev Tools/Development Settings 下,将Wait for debugger,Show running processes,Show screen updates 这三项打勾,然后回到命令输入终端。
#./adb push <local-path> /data/busybox
#./adb shell
# /data/busybox tar -cvf system.tar /system
# /data/busybox tar -cvf data.tar /data
# /data/busybox tar -cvf etc.tar /etc
# /data/busybox tar -cvf sbin.tar /sbin
# exit
从网上查看的资料中,在我电脑上运行有错误,他提供的资料是:/data/busybox tar -czf system.tar.gz /system,由于我的busybox中tar命令在压缩时不能调用gzip程序,所以我用上述tar -cvf 命令只打包不压缩。但是在拷贝时需要时间长点。
# ./adb pull /system.tar.gz ./
# ./adb pull /data.tar.gz ./
# ./adb pull /etc.tar.gz ./
# ./adb pull /sbin.tar.gz ./
# ./adb pull /init ./
通过以上五条命令就把Adroid模拟器里的文件系统给pull到本地目录里了,现在就可以制作android的根文件系统了。
# mkdir initial_ram_disk
# cd initial_ram_disk
# mkdir cache d dev proc root sdcard sys tmp var
$ tar -xvf <local-path>/system.tar ./
$ tar -xvf <local-path>/data.tar ./
$ tar -xvf <local-path>/etc.tar ./
$ tar -xvf <local-path>/sbin.tar ./
$ cp <local-path> /init ./
包含Android root 文件系统的initial_ram_disk 做好
五、配置编译Linux内核
首先从运行着的模拟器中pull出config.gz文件。
#./adb pull /proc/config.gz ./
然后再解压:
#gunzip config.gz
将解压后的config拷贝到Linux内核的主目录,并改名为.config
可以配置内核了,配置方法跟普通Linux内核配置方法一样:
#make CROSS_COMPILE=arch-none-linux-gnueabi- ARCH=arm menuconfig
配置好就可以编译了,在编译前一定要将Makefile里的
LDFLAGS_BUILD_ID = $(patsubst -Wl$(comma)%,%,/
$(call ld-option, -Wl$(comma)–build-id,))
这行去掉,并且添加一个空的LDFLAGS_BUILD_ID定义,如下:
LDFLAGS_BUILD_ID =
如果不去掉编译出来的内核会有4.3M大。
---------------------------------------------------------------------------------
把它注释掉的原因是目前android的内核还不支持这个选项。--build-id选项,主要是用于在生成的elf
可执行文件中加入一个内置的id,这样在core dump,或者debuginfo的时候就可以很快定位这个模块是
哪次build的时候弄出来的。这样就可以避免,每次都把整个文件做一遍效验,然后才能得到该文件的是由
哪次build产生的。对于内核开发者来说,这是很不错的想法,可以节约定位模块版本和其影响的时间。
目前,该功能还出于early stage的状态,未来的android或许会支持,但至少目前的版本是不支持的。
所以,用#注释掉即可,或者害怕不保险的话,就加入LDFLAGS_BUILD_ID=空,这样即使编译的时候用了,也只是一个空格而已。
---------------------------------------------------------------------------------
开始编译内核:
#make CROSS_COMPILE=arch-none-linux-gnueabi- ARCH=arm zImage
这样就生成了内核镜像文件,可以下载到开发板上调试,也可以用模拟器调试
--------------------------------------------------------------------------------
六、用模拟器模拟内核运行
#./emulator -avd myavd -kernel <目录>kernel/arch/arm/boot/zImage