本章讲解了Android移植的第一步,主要学习如何搭建Android移植的环境。因为Android底层是基于Linux内核的。所以,我们从搭建交叉编译环境开始,包括交叉编译环境、各种服务程序和应用程序的安装、配置和使用。不同的体系结构、不同的操作内容甚至是不同版本的内核,都会用到不同的交叉编译器。选择交叉编译器非常重要,有些交叉编译器经常会有部分的Bug,都会导致最后的代码无法正常运行。
构建开发环境是任何开发工作的基础,对于软硬件非常丰富的嵌入式系统来说,构建高效、稳定的环境是能否开展工作的重要因素之一。Android移植与Android应用程序开发有很大不同,具体流程如下:
(1) 下载Android内核;
(2) 熟悉开发环境和工具。交叉开发环境是Android系统移植开发的基本模拟。Linux环境配置、GUN工具链、测试工具甚至集成开发环境都是Android系统移植的利器。
(3) 熟悉Linux内核。因为Android系统移植开发一般需要重新定制Linux内核,所以熟悉内核配置、编译、移植很重要。
(4) 熟悉目标板引导方式。开发板的Bootloader负责硬件平台最基本的初始化,并且具体引导Linux内核启动的功能。由于硬件平台是专门定制的,一般需要修改编译Bootloader。
交叉编译器完整的安装一般涉及多个软件的安装,包括binutils、gcc、glibc、glibc-linuxthreads软件。其中,binutils主要用于生成一些辅助工具,如readelf、objcopy、objdump、as、ld等;gcc是用来生成交叉编译器的,主要生成arm-Linux-gcc交叉编译工具;glibc主要提供用户程序所使用的一些基本的函数库,glibc-linuxthreads是线程相关的函数库。这样,交叉编译环境就搭建起来了。
Bootloader是在操作系统运行之前执行的一小段程序。通过这段小程序,我们可以初始化硬件设备、建立内存空间映像表,从而建立适当的系统软硬件环境,为最终调用操作系统内核做好准备。对于嵌入式系统,Bootloader是基于特定硬件平台来实现的。因此,几乎不可能为所有的嵌入式系统建立一个通用的Bootloader,不同的处理器架构都有不同的Bootloader。Bootloader不但依赖于CPU的体系结构,而且依赖于嵌入式系统板级设备的配置。对于两块不同的嵌入式板而言,即使他们使用同一种处理器,要想让运行在一块板子上的Bootloader程序也能运行在另一块板子上,一般也需要修改Bootloader的源程序。反过来,大部分Bootloader仍然具有很多共性,某些Bootloader也能够支持多种体系结构的嵌入式系统。例如:U-Boot就同时支持PowerPC、ARM、MIPS和X86等体系结构,支持的板子有上百种。通常,他们能够自动从存储介质上启动,都能够引导操作系统启动,并且大部分都支持串口和以太网接口。
为了驱动目标板,必须先做好Bootloader、操作系统内核及文件系统。