安卓操作系统,以其开源优势稳坐嵌入式系统龙头位置。安卓系统为了应用于特定硬件的定制过程叫做安卓“移植”。安卓定制主要是完成底层驱动开发,由于安卓是基于Linux的,所以完成Linux定制即可。

Liunx定制说白了就是完成Linux驱动定制,所以有必要了解Andriod架构与Linux驱动有哪些联系之处。Android架构分为四层:最底层Linux驱动层,属于Linux内核;往上一层C/C++层,属于.so文件;往上一层Android SDK层,属于安卓应用自定义接口;最上层Android应用层,属于APK文件。所以,Andriod移植主要关注最底层Linux内核层。什么叫内核?内核就是一个提供硬件抽象层、磁盘及文件系统控制、多任务处理等功能的系统软件。它跟操作系统是一个被包含关系,所以一个内核并不是一个完整的操作系统。

那么怎么来判定某Linux内核是不是我们目标Andriod系统所需要的呢?通过Linux内核版本,只要Linux内核版本五部分组成与我们移植的Andriod系统Linux内核版本完全一致就可以认为该内核所包含的驱动程序是可用的。这五部分分别是:主版本号、次版本号、修订版本号、微调版本号以及特定的系统调校描述。安卓设备可在设置中查看内核版本,Linux操作系统可用以下俩命令中一条:cat /proc/version ;uname -a(更多信息)。

以上,并非Andriod系统移植全部准备,还需要HAL移植,也就是硬件抽象层插入。因为Andriod系统是一种解释执行的操作系统,它必然运行于解释器之上,不会直接访问驱动层,所以需要HAL作为中介来抽象形形色色的Andriod设备。
两者都准备好之后就需要一种解释执行语言来编译移植上述内容,我所熟悉的Linux环境下编程语言是GNU C,而要运行GNU C必然需要一种Linux操作系统,我用的是Ubuntu麒麟。另外开发板可以的话最好具备,它的强大之处是模拟机不具备的,比如最简单的LED测试,AVD无法模拟。
说到硬件,Linux设备驱动并不是为了驱动CPU,因为CPU的话很多内核都包含各种架构驱动,所以还是以存储设备和外设设备为主。Linux使用了文件系统,其硬件分为三类:字符设备、块设备和网络设备,前两者除了访问顺序不一样基本没区别,但是二者跟第三部分还是有很大区别。驱动主要围绕这三类做研究。
最后,学习Andriod系统移植还需要主观练习次数的积累,实操是最好的老师。