《Android深度探索(卷1):HAL与驱动开发》——1.2节Android系统移植的主要工作

1.2 Android系统移植的主要工作
Android深度探索(卷1):HAL与驱动开发
Android移植可分为两部分:应用移植和系统移植。应用移植是指将如图1-1所示第4层的应用程序移植到某一个特定硬件平台上。由于不同硬件平台之间的差异,Android SDK API也有可能存在差异(有的厂商会修改部分Android SDK API以适应自身硬件的需要),或者将应用程序从低版本Android移植到高版本的Android上。为了保证应用程序可以在新的硬件平台正常运行,需要对源代码进行一些修改。当然,如果没有或无法获取源代码,只有重新在新的平台上实现了。一般Android应用移植并不涉及驱动和HAL程序库(Android新增加的硬件抽象层,将在后面的章节介绍)的移植,而且Android应用程序移植也不在本书讨论的范围内,因此,本书后面出现的Android移植都是指Android操作系统的移值(包括Linux驱动、HAL程序库的移植)。

Android系统移植是指让Android操作系统在某一个特定硬件平台上运行。使一个操作系统在特定硬件平台上运行的一个首要条件就是该操作系统支持硬件平台的CPU架构。Linux内核本身已经支持很多常用的CPU架构(ARM、X86、PowerPC等),因此,将Android在不同的CPU架构之间移植并不用做过多的改动(有时仍然需要做一些调整)。要想Android在不同硬件平台上正常运行,只支持CPU架构还不行,必须要让Android可以识别平台上的各种硬件(如声卡、显示器、蓝牙设备等)。这些工作主要也是由Linux内核完成的。其中的主角就是Linux驱动。因此,系统移植除了移植CPU架构外,最重要的就是移植Linux驱动。例如,为硬件平台增加了一个新型的Wi-Fi模块,就需要为这个Wi-Fi模块编写新的驱动程序,或修改原来的驱动程序,已使得Linux内核可以与Wi-Fi模块正常交互。

除了Linux驱动需要移植外,在Android系统中还增加了一个硬件抽象层(HAL,Hardware Abstraction Layer),为了方便,本书后面的部分都使用HAL表示硬件抽象层。

HAL位于如图1-1所示的第2层,也是普通的Linux程序库(.so文件),只是Android SDK通过HAL直接访问Linux驱动。也就是说,Android并不像其他的Linux系统一样由应用程序直接访问驱动,而是中间通过HAL隔了一层。Google这样设计的原因很多,例如,由于Linux内核基于GPL开源协议,而很多驱动厂商不想开放源代码,所以增加了HAL层后,可以将Linux驱动的业务逻辑放在HAL层,这样处理Linux驱动开源技术,也只是一个空架子而已。关于Android支持HAL的原因将在后面的章节详细介绍。

如果为Android增加了新的驱动或修改原来的驱动代码,HAL中的代码就要做相应的调整。因此,Android移植的主要工作如下:

移植Linux驱动;
移植HAL。
移植的工作也可能不多,当然,也可能非常多。如果要移植的Android系统提供了驱动源代码,那就好办多了,直接根据移植的目标平台修改驱动代码就可以了。不过很多时候由于某些原因,无法获得驱动的源代码,或者要实现的驱动程序所对应的硬件是自己特有的,这就需要从头开始编写驱动程序以及相关的配置文件。对于HAL的移植也和Linux驱动差不多。总之,Android移植的基本原则是尽可能找到驱动和HAL的源代码,在源代码的基础上改要比从头开始编写容易得多,实在无法获取源代码,就只有从头开始做起了。不过在了解了编写Linux驱动和Android HAL程序库的步骤和规则以后,看着也没那么复杂。因为驱动和HAL的代码远没有Android SDK和Android应用程序的代码量大。

注意

Android移植在很大程度上是Linux内核的移植。Linux内核移植主要就是移植驱动程序。不同Linux版本的驱动程序不能通用,需要重新修改源代码,并在新的Linux内核下重新编译才可以运行在新的Linux内核版本下。Android版本和Linux版本不同。无论哪个Android版本,其Linux内核版本都是Linux 2.6或Linux 3.0(将来有可能使用更高版本的Linux内核),只是小版本号不同。由于Android开放源代码,所以就算同一个Android版本,Linux的内核也可能不同(有很多自制的ROM会更换不同的Linux内核,以至于和官方同一Android版本的Linux内核不同),例如,笔者曾见过有的Android 2.3使用了Linux ,而官方的Android 2.3使用了Linux 2.6.35。在移植Linux驱动时,主要应考虑Linux内核的版本,就算Android版本不同,只要Linux内核版本相同,Linux驱动就可以互相替换(有时也需要考虑HAL是否和Linux驱动兼容)。

时间: 2024-07-28 13:15:52

《Android深度探索(卷1):HAL与驱动开发》——1.2节Android系统移植的主要工作的相关文章

《Android深度探索(卷1):HAL与驱动开发》——1.1节Android系统架构

1.1 Android系统架构 Android深度探索(卷1):HAL与驱动开发 Android是一个非常优秀的嵌入式操作系统.经过几年的发展和演进,Android已经形成了非常完善的系统架构,如图1-1所示. 从图1-1可以看出,Android的系统架构分为4层.这4层所包含的内容如下. 第1层:Linux内核 由于Android是基于Linux内核的,因此,Android和其他Linux系统(如Ubuntu Linux.Fedora Linux等)的核心部分差异非常小.这一层主要包括Linu

《Android深度探索(卷1):HAL与驱动开发》——1.3节查看Linux内核版本

1.3 查看Linux内核版本 Android深度探索(卷1):HAL与驱动开发 目前Linux内核主要维护3个版本:Linux 2.4.Linux 2.6和Linux 3.x,大多数Linux系统都使用了这3个版本的内核,其中Linux 2.6是目前使用最广泛的Linux内核版本,Android就使用了该内核版本.而Linux 2.4由于其内部设计缺陷(主要是进程调度上的缺陷),除了一些遗留Linux系统,已很少有新的Linux系统使用Linux 2.4了.Linux 3.x是最新推出的Lin

《Android深度探索(卷1):HAL与驱动开发》——6.4节使用多种方式测试Linux驱动

6.4 使用多种方式测试Linux驱动 Android深度探索(卷1):HAL与驱动开发 在上一节已经实现了一个简单的Linux驱动程序,该驱动的功能是统计给定字符串中的单词数,并且在最后已经将该Linux驱动的源代码成功编译成动态Linux驱动模块word_count.ko.下一步就是测试该模块.测试的方法很多,最常用的就是直接在Ubuntu Linux中测试.当然,这对于本章实现的Linux驱动是没问题的,但是对于需要直接访问硬件的驱动在Ubuntu Linux上测试就不太方便.在这种情况下

《Android深度探索(卷1):HAL与驱动开发》——6.5节使用Eclipse开发和测试Linux驱动程序

6.5 使用Eclipse开发和测试Linux驱动程序 Android深度探索(卷1):HAL与驱动开发 在前面几节开发的word_count驱动和测试程序大多都需要在Linux终端进行编译(Android应用程序除外)和运行,而且也无法跟踪到Linux内核函数.变量.宏的内部(除非自己到Linux内核源代码中就寻找这些源代码文件),这并不利于深入了解Linux内核技术.在本节将为读者展示如何在Eclipse中开发Linux驱动程序,并且可以像跟踪Java代码一样直接跟踪到Linux内核源代码.

《Android深度探索(卷1):HAL与驱动开发》——1.5节如何学习Linux驱动开发

1.5 如何学习Linux驱动开发 Android深度探索(卷1):HAL与驱动开发 由于Linux的内核版本更新较快(稳定版本1至3月更新一次,升级版本1至2周更新一次),每一次内核的变化就意味着Linux驱动的变化(就算不需要修改驱动代码,至少也得在新的Linux内核版本下重新编译),所以Linux内核的不断变化对从事Linux驱动开发的程序员影响比较大.不过这对于学习Linux驱动开发来说影响相对较小.因为不管是哪个版本的Linux内核,开发Linux驱动的方法和步骤基本相同,只要掌握了一

《Android深度探索(卷1):HAL与驱动开发》——1.8节小结

1.8 小 结Android深度探索(卷1):HAL与驱动开发学习Linux驱动编程一定要了解Linux驱动只与Linux内核有关,与用户使用的Linux系统(Ubuntu Linux.Fedora Linux.Android等)无关.也就是说,不管是哪个Linux系统,只要使用了同样的Linux内核,驱动就可以通用.唯一可以判断Linux内核是否相同的方法就是Linux内核版本号.在1.4节介绍了Linux内核版本号的定义规则,只有组成内核版本号的五部分完全相同,才能说明两个Linux系统的内

《Android深度探索(卷1):HAL与驱动开发》——1.4节 Linux内核版本号的定义规则

1.4 Linux内核版本号的定义规则Android深度探索(卷1):HAL与驱动开发Linux内核版本号由下面几部分组成.主版本号:次版本号:修订版本号:微调版本号:为特定的Linux系统特别调校的描述.在Linux内核版本2.6.29.7-flykernel-12a中,2是主版本号,6是次版本号,29是修订版本号,7是对2.6.29的微调,称为微调版本号,而flykernel-12a则是该Linux内核专门为flykernel调校.要注意的是,调校描述可以是任意字符串,由开发者自行定义.主版

《Android深度探索(卷1):HAL与驱动开发》——1.6节 Linux设备驱动

1.6 Linux设备驱动Android深度探索(卷1):HAL与驱动开发随着计算机技术的不断发展,与计算机(也包括手机等计算设备)相关的硬件设备的种类也不断丰富起来.这就需要大量的Linux设备驱动来与这些硬件设备进行交互.为了使读者在学习如何编写Linux驱动之前对Linux驱动有一个初步的认识,本节介绍了设备驱动在整个操作系统中的作用以及设备驱动的分类. 1.6.1 设备驱动的发展和作用任何一台计算机系统的运行都是由软硬件共同作用的结果,没有硬件的软件是空中楼阁,而没有软件的硬件则是一堆废

《Android深度探索(卷1):HAL与驱动开发》——1.7节见识一下什么叫Linux驱动:LED

1.7 见识一下什么叫Linux驱动:LEDAndroid深度探索(卷1):HAL与驱动开发Linux驱动这个家伙到现在为止仍然是只见其声,未见其人,不过在本节会向读者展示一下Linux驱动到底是个什么东西.如果读者看到Linux驱动的代码感到头晕,这属于正常现象.因为如果一看就明白的话,那就没有阅读本书的必要了.本节的目的只为向读者展示Linux驱动程序的结构,以及使读者对Linux驱动有一个大致的印象,读者无须理解其中的细节.当读者阅读完本书时,自然会对这些细节部分了如指掌. 下面给出一个简