【Android源码 栏目提醒】:网学会员在Android源码 频道为大家收集整理了“Android文件系统及其linux内核的编译 - 其它资料“提供大家参考,希望对大家有所帮助!
Android 文件系统及其 linux 内核的编译 Ver1.0 作成者:雷鹏 作成年月:2012/3/2 目录目录 .................................................................................................................................................. 24.1 配置开发主机及搭建开发环境.............................................................................................. 34.2 编译 Android 文件系统、uboot 及 linux kernel .................................................................... 71.背景 Android是一种以Linux为基础的开源操作系统,具有
免费和便于开发的特点,所以在RUYI项目上采用了Android操作系统。
为了能够对硬件进行调试,如何正确对Android文件系统及其Linux内核进行编译,从而使Android系统移植到RUYI的硬件设备上,成为开发前期最重要的
工作之一。
由于Android的内核是基于标准的linux2.6kernel,并且Android的核心服务依赖于kernel,因此linux2.6 kernel同时作为硬件和软件之间的抽象层必须编译,而引导和加载Android系统的uboot也要编译,只有进行了正确的编译,Android系统才能够在硬件设备上运行。
2.目的 本报告书主要描述如何将bootloader、linux kernel以及
Android源码进行编译,使其可以被移植到Freescale的imx51 系列芯片的开发板上,从而使RUYI的硬件设备可以运行Android系统。
3.适用范围 本
报告书中编译方法生成的 uboot、uImage、以及 android 的各个版本的文件系统,均适用于 imx51 系列 CPU。
4.详细内容4.1 配置开发主机及搭建开发环境4.1.1 PC 的要求及配置 使用装有 linux 的 ubuntu 操作系统的电脑,也可以在 windows XP 下虚拟 ubuntu 操作系统来搭建编译的环境,推荐使用 ubuntu9.10 以上版本。
虚拟机可以使用 sun 公司开发的 Virtualbox4.1.8 软件来虚拟 ubuntu 操作系统,可在www.virtualbox.org/wiki/Downloads/网站下载合适的 Virtualbox 版本,具体安装步骤可参见 Virtualbox 的 User Manual。
安装完成虚拟 ubuntu 后需要进行共享文件夹的设置,这样才能让 windows 和 linux 之间进行文件的传输和共享操作,下面就 Virtualbox 虚拟 Ubuntu 共享文件夹设置进行说明。
例:主机操作系统是 Windows XP,虚拟系统是 Ubuntu11.04,虚拟机是VirtualBox4.1.8。
配置步骤如下: ①安装增强功能包Guest Additions 安装好 Ubuntu11.04 后,运行 Ubuntu 并登录。
然后在 VirtualBox 的菜单里选择设备Devices — 安装增强功能包Install Guest Additions。
在 Ubuntu 桌面上多出一个光盘图标,这张光盘默认被自动加载到了文件夹/media/cdom0。
进入命令行终端,输入: cd /media/cdom0 sudo ./VboxLinuxAdditions.run 开始安装工具包。
安装完毕后会提示要重启 Ubuntu。
②设置共享文件夹 重启完成后点击设备Devices - 共享文件夹Shared Folders菜单,添加一个共享文件夹,选项固定和临时是指该文件夹是否是持久的。
共享名可以任取一个自己喜欢的,比如gongxiang,尽量使用英文名称。
③挂载共享文件夹 重新进入虚拟 Ubuntu,在命令行终端下输入: sudo mkdir /mnt/shared sudo mount -t vboxsf gongxiang /mnt/shared 其中gongxiang是之前创建的共享文件夹的名字,按上述命令操作后,名称为gongxiang 的文件夹将被在 windows 和 linux 间共享。
假如您不想每一次都手动进行挂载操作,可以在/etc/fstab 中添加一项,按如下命令操作即可。
gongxiang /mnt/shared vboxsf rwgid100uid1000auto 0 0 ④卸载共享文件夹命令: sudo umount -f /mnt/shared 注意:共享文件夹的名称千万不要和挂载点的名称相同。
比如,上面的挂载点是/mnt/shared,如果共享文件夹的名字也是 shared 的话,在挂载的时候就会出现如下的错误信息: /sbin/mount.vboxsf: mounting failed with the error: Protocol error4.1.2 android 源码包的下载 Android 源代码是由 100 多个项目组成,通过 internet 来查看 git
web 形式的
android源码包,编译需要从 google 下载源码,通过下列指令可从 Google repo 获得 android 源码: cd mkdir myandroid cd myandroid curl http://android.git.kernel.org/repo ./repo chmod ax ./repo ./repo init -u git://android.git.kernel.org/platform/manifest.git -b eclair cp /opt/imx-android-r7/code/r7/default.xml .repo/manifests/default.
xml 为了避免下载不必要的 gits,同时下载一些没有包含在默认 manifest 文件中的 gits,可使用下列命令: ./repo sync 通过下列指令可以从 kernel.org 获取干净的 kernel 内核源码: cd myandroid git clonegit://git.kernel.org/pub/scm/
linux/kernel/git/stable/linux-2.6.31.y.gitkernel_imx 如果使用 uboot 作为 bootloader,必须从原始的 git 获取一个干净的 uboot 代码,通过如下命令: cd myandroid/bootable/bootloader git clone git://git.denx.de/u-boot.git uboot-imx4.1.3 搭建 java 环境 编译 android 还需要配置 java 的环境,并且只能是 java1.5 版本,其他的版本会在编译的过程中出错。
① 从 http://java.sun.com/下载 jdk 的 bin 文件,将下载的jdk-1_5_0_22-linux-i586.bin 文件放到/usr/lib/jvm/java 中 然后在终端执行命令: sudo chmod ux /usr/lib/jvm/java/ jdk-1_5_0_22.bin (修改文件权限使 bin 可执行) 接着在终端执行命令: sudo /usr/lib/jvm/java/ jdk-1_5_0_22.bin 按 Enter 直到显示要求输入 yes/no,此时输入 yes 并回车,将会得到 jdk-1_5_0_22目录。
② 环境变量配置 在终端执行代码: sudo gedit /etc/environment 在 gedit 打开的 enviroment 文件中添加如下信息: JAVAHOME/usr/lib/jvm/java/ jdk-1_5_0_22 PATH/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/lib/jvm/java/ jdk-1_5_0_22/bin CLASSPATH.:/usr/lib/jvm/java/ jdk-1_5_0_22/lib 环境变量设置成功 ③ 设置默认的 jdk,因为系统默认可能存在别的 jdk 在终端执行代码: sudo update-alternatives --install /usr/bin/java java/usr/lib/jvm/java/jdk1.5.0_22/bin/java 300 sudo update-alternatives --install /usr/bin/javac javac/usr/lib/jvm/java/jdk1.5.0_22/bin/javac 300 选择系统默认的 jdk,在终端执行命令: sudo update-alternatives --config java 如果只存在一个 java 环境则会出现提示系统只有一个 jdk 最后执行命令: java -version java version 1.6.0_16 JavaTM SE Runtime Environment build 1.6.0_16-b01
Java HotSpotTM Client VM build 14.2-b01 mixed mode sharing 此时显示使用的 Java 版本信息,并确定是否是 jdk-1_5_0_22。
在 ubuntu 10.04 系统以后,就产生了一系列的 jdk 的
问题。
默认系统安装的是开源的open jdk如果要换到标准的 sun jdk。
但是编译 android2.3 需要标准的 jdk 1.6 版本。
将 jdk1.6安装到/usr/lib/jvm/目录下。
采用 update-alternatives --config java 命令查看当前 java 运行环境选项。
如下图: 把 JRE 的 java 装进系统里:由于本人默认情况下就一个,所以采用如下命令:(尾部数字 1 为优先级) config 一下 java。
如下图: 查看当前的 JRE 修改成功没有。
接下来修改 javac 编译环境的位置。
整个过程与 java 修改过程极为相似,不同的是 java 变成了 javac,目录也有些不同。
具体见下图步骤: 选中 sun 的 javac 为默认。
查看当前系统 javac 的版本 4.1.4 安装编译 android 需要下列
软件包 下面为要安装的软件说明: flex: This lexical analyzer generator is used to read a given input file fora description of a scanner to generate. bison: This is a general-purpose parser generator. gperf: This is a perfect hash function generator. libesd0-dev: This enlightened sound daemon dev files is used to mix digitizedaudio streams for playback by a single device. libwxgtk2.6-dev: This package provides GUI components and other facilities formany different platforms. build-essential: This package contains a list of packages considered fundamentalto building Debian packages. 使用以下命令可以一起安装上述所需要的软件包: sudo apt-get install flex bison gperf libesd0-dev libwxgtk2.6-dev zlib1g-devbuild-essential4.2 编译 Android 文件系统、uboot 及 linux kernel4.2.1 解压 i.MX Android 源码包及设置交叉编译环境 配置完 ubuntu PC,可使用下列命令来解压 FSL i.MX Android 源码包: cd /opt or any other directory you like tar xzvf imx-android-r7.tar.gz cd imx-android-r7/code tar xzvf r7.tar.gz 完成 i.MX Android 源码包解压,在目录/opt/imx-android-r8/下。
下列指令安装交叉编译环境: cd /opt/imx-android-r8/tool tar xzvf gcc-4.1.2-glibc-2.5-nptl-3.tar.gz -C /opt 使用 gedit 设置要导出的编译器相关的环境变量: sudo gedit /etc/profile 打开 profile 文件并在里面添加如下代码: Freescale CrossCompiler Env export ARCHarm export CROSS_COMPILE/opt/gcc-4.1.2-glibc-2.5-nptl-3/arm-none-linux-gnueabi/bin/ar m-none-linux-gnueabi- export PATH/opt/gcc-4.1.2-glibc-2.5-nptl-3/arm-none-linux-gnueabi/bin:PATH 4.2.2 给 i.MX Android
源代码打上 Patch 发布包内包含了一个打 patch 的脚本,以下指令将打上所有的 i.MX Android patches: cd /myandroid . /opt/imx-android-r7/code/r7/and_patch.sh help Now you should see c_patch function is available for you c_patch /opt/imx-android-r7/code/r7 imx_r7 这里 /opt/imx-android-r8/code/r8 是 patches 的路径,imx_r8是所有 patches的目录,可以 任意创建和命名。
如果成功的话,c_patch 将产生如下的输出显示: Success: Now you can build android code for FSL i.MX platform 注: The patch script and_patch.sh utilizes some basic utilities like awk/sed .If they are not available on your LinuxPC install them in advance.(因为怡鼎的开发包已经提供了 Android2.2 的源码,所以可以省略上面的步骤,直接解压怡鼎所提供的源码包就可以了。
)4.2.3 编译 uboot cd /myandroid/bootable/bootloader/uboot-imx echo ARCH echo CROSS_COMPILE 上面的命令是确保编译环境有以下两个环境变量: i.MX51 BBG3 开发板的编译命令为: make mx51_bbg_android_config make 如果编译成功的话将生成u-boot.bin 。
生成的 bootloader 二进制文件头部有 1024B的字节填充,例如第一个可执行的指令就在 1KB 的字节里,要生成一个没有字节填充的二进制文件,需要执行下列指令: dd if./u-boot.bin of./u-boot-no-padding.bin bs 1024 skip1 一般情况下,没有字节填充的 uboot 文件被烧写在 SD 卡的头部 1024KB 后的位置作启动,这样就不会覆盖头部 512B 字节的分区表 MBR。
注:每一个通过 uboot 加载的 image 文件必须拥有唯一的文件头部,比如,一些 image (文件头部的数据能告诉 uboot 是哪类 image 比如 kernel,ramfs 等)以及如何去加载 image()。
因此,通过 uboot 加载任何 image 文件到 RAM 之前,需要使用 tool 添加一些新的信息以产生新的 image 文件,这样 uboot 才能识别。
这些 tool 是和 uboot 一起发布,在生成uboot 之后就可以在/tools 目录下找到这些 tool。
4.2.4 编译内核 Kernel 为了在 NFS 或 SD 运行 android,使用默认的设置编译 kernel,前提是你已经编译好 uboot,mkimage 已经生成在目录下: myandroid//bootable/bootloader/uboot-imx/tools cd /myandroid/kernel_imx echo ARCH echo CROSS_COMPILE 上面的命令是确保编译环境有以下两个环境变量: make imx51_android_defconfig 根据在 arch/arm/configs 下的默认配置信息产生.config 文件 make uImage 编译成功后,生成以下的 kernel image:/myandroid/kernel_imx/arch/arm/boot/uImage 也可以通过命令make zImage 生成 zImage,然后使用下列指令从 zImage 生成 uImage。
cd myandroid/kernel_imx/arch/arm/boot /myandroid/bootable/bootloader/uboot-imx/tools/mkimage -A arm -O linux -Tkernel –C none -a 0x90008000 -e 0x90008000 -n Android Linux Kernel-d ./zImage ./uImage 注:During boot when uboot try to load above uImage it will know to loadit without image head added by mkimage tool into 0x90008000 specified by -aand then jump to 0x90008000 specified by -e to execute it. -C none means nocompression when generating uImage . This is because the original zImage is alreadya compressed one.4.2.5 编译 Android 文件系统 编译 Android 系统步骤如下: cd /myandroid i.MX51 BBG3 board 编译 android 的命令为: make PRODUCT-imx51_BBG-eng tee build_imx51_BBG_android.log imx51_bbg是产品名称(详见/myandroid/vendor/fsl/product)。
编译完后,请检查 build__android.log, 确保编译成功。
编译完成后,会生成 myandroid/out/target/product/imx51_bbg 目录,该目录包含以下内容: root/:根文件
系统(包含 init init.rc 等等),系统运行时会被挂载在:/下。
system/:Android 系统目录(包含可执行程序,库及配置文件),系统运行时会被挂载在/system下。
data/:Android 数据目录,系统运行时会被挂载在/data下。
recovery/:恢复系统的根文件系统。
不直接使用。
ramdisk.img:Ramdisk image,生成自root/。
该镜像会作为 Kernel initramfs 作为根文件系统最早挂在到系统的根目录下。
system.img: EXT4 文件系统格式的 image 生成自system/。
userdata.img: EXT4 文件系统格式的 image 生成自data/。
recovery.img: EXT4 文件系统格式的 image 生成自recovery/。
如果希望编译从 NAND 启动的 Android,请编译产品名:imx51_iding_nand。
生成的目录为 myandroid/out/target/product/imx51_iding_nand: root/:根文件系统(包含 init init.rc 等等),系统运行时会被挂载在:/下。
system/:Android 系统目录(包含可执行
程序,库及配置文件),系统运行时会被挂载在/system下。
data/:Android 数据目录,系统运行时会被挂载在/data下。
recovery/:恢复系统的根文件系统。
不直接使用。
ramdisk.img:Ramdisk image,生成自root/。
该镜像会作为 Kernel initramfs 作为根文件系统最早挂在到系统的根目录下。
system.img:UBIFS 文件系统格式的 image 生成自system/。
不直接使用。
userdata.img: UBIFS 文件系统格式的 image 生成自data/。
不直接使用。
recovery.img:UBIFS 文件系统格式的 image 生成自recovery/。
android_recovery.img:从 recovery.img 生成的 UBI 原始镜像,被烧写在 RECOVERYNAND 分区中。
android_root.img: UBI 原始镜像,包含 system/userdata.img,被烧写在 ROOT NAND分区中。
4.2.6 生成 uboot 可以加载的 ramdisk 镜像:uRamdisk uboot 需要从外部存储器上读取 kernel 和 ramdisk。
这两个镜像都需要包含 uboot 所能识别的头部,这个头部可以使用以下步骤来制作: cd myandroid/out/target/product/imx51_BBG /myandroid/bootable/bootloader/uboot-imx/tools/mkimage - A arm -O linux -Tramdisk -C none -a 0x90308000 -n Android Root Filesystem -d ./ramdisk.img ./uramdisk.img mkimage 在编译完 uboot 后,会生成在myandroid/bootable/bootloader/uboot-imx/tools/ 目录下。
注:通过以上过程编译好的文件将分别放在以下不同的文件目录下: 1 Uboot:编译好的 Uboot 将被生成在 myandroid/bootable/bootloader/uboot-imx 目录下。
2 Linux kernel:编译好的 kernel 文件 uImage 将被生成于 myandroid/kernel_imx 目录下。
3 Android:编译完成的 android 文件系统全部在 myandroid/out 目录下。
5. 结论通过上述的流程进行编译过的Android文件系统,linux内核可以被成功移植到RUYI的开发板上,经验证能够正常运行。
证明编译的过程是正确并可行的。