前言
为什么要写这本书
由于 Android 底层开发在最近几年开始逐渐升温,很多读者迫切希望出现更符合实际需求的Android 底层开发的技术书籍。也有很多读者给我发 E-mail,希望多写一些关于 Android 和 Linux底层开发的书。尽管目前已经有一些这方面的书籍,但这方面的书中理论讲的多一些,这对于很多初学者,学习的第一步搭建试验环境都很困难,而且书中并未提供完整的代码,这对于新手来说,上机试验的困难比较大。而对于程序设计这门学科来说,实践是成为高手的唯一途径。所以,这些书一般只适合有一定Android底层开发基础的程序员阅读,而对于一些初学者,由于本身知识有限,再加上一开始搭建试验环境可能会失败,从而大大失去了继续学习的欲望和信心。
还有一些Linux底层开发的书涉及的版本比较低,有些书的部分内容甚至仍然为Linux 2.4.x,或Linux 2.6.x的较低版本。这对于目前学习Linux底层开发的读者造成了一定的困惑。学习低版本的Linux内核实际上用处不大,因为现在很多系统(如Android)都使用了较高版本的Linux内核。所以这部分读者急切需要一本可以结合Android和Linux内核,并且使用较高Linux内核版本的技术书籍。
为了满足读者的上述需求,笔者特意结合目前很常用的Android和Linux底层开发技术编写了这本《Android深度探索(卷1):HAL与驱动开发》。这本书主要介绍了Linux驱动的驱动开发,以及如何使用HAL(硬件抽象层)与Linux驱动交互,并使用NDK和Java技术通过HAL与Linux驱动交互。而且使用了较新的Linux内核版本(Linux2.6.36和Linux3.x)。
本书从实践角度出发,每一个技术点都提供了详细的例子,除此之外,还提供了一个完整的虚拟环境(随书光盘中)供读者进行测试。这个虚拟环境是基于VMWare的Ubuntu Linux12.04 LTS。虚拟环境的配置与笔者使用的开发环境完全一样,而且虚拟环境中包含了本书所有的源代码和相应的Linux内核源代码。读者可以直接在虚拟环境中测试本书所有的例子代码。
使用《Android深度探索(卷1):HAL与驱动开发》学习Android和Linux底层开发技术完全没有因不具备试验环境而无法试验的后顾之忧。而且书中所有的知识点都提供了完整的例子代码,读者在试验时并不需要自己来输入代码,从而大大提高了学习的效率。
本书的特点
1.本书几乎所有的知识点都提供了详细的例子代码,读者可以在自己配置的开发环境或虚拟环境中学习和测试这些代码。
2.提供了VMWare虚拟环境,同时在虚拟环境中包含了本书所有的例子代码和相应的Linux内核源代码。读者不再需要自己搭建试验环境,大大提高了学习效率。
3.结合了实际的S3C6410开发板学习嵌入式Linux驱动开发和Android HAL开发,目前是市面上唯一一本结合真实开发板、Android和Linux内核的底层开发书籍。
4.大多数例子(有些例子只能在某一个或两个环境中运行)都提供了Ubuntu Linux、Android虚拟机和S3C6410开发板3种平台的运行脚本程序,执行build.sh脚本文件后可以选择在不同环境中安装和运行程序,使学习和测试代码更方便。
5.本书除了涉及大量的C/C++和Java代码外,还涉及一些Shell脚本的知识,这些Shell脚本主要用于自动编译和运行例子代码,以及选择安装和运行平台。本书会对这些Shell脚本的核心代码进行详细解释。
6.由于测试环境可能会连接多个 Android 设备,这时操作某一个设备就需要指定该设备的Device ID。为了方便读者操作这些设备。在虚拟环境中提供了若干个Shell脚本(pull.sh、push.sh、shell.sh等),允许读者选择操作的设备,而不是输入Device ID。这样可以大大缩短读者操作这些Android设备的时间。
7.本书分析了大量的Linux驱动和Android底层的代码,而且使用多个版本进行对比的方式进行分析,例如,音频驱动分别分析了Android2.3.4、Android4.x与Linux驱动交互的差异。
8.本书采用了较新的Linux内核(Linux2.6.36和Linux3.x)进行讲解和代码分析。
9.本书还介绍了大量的工具的使用。这些工具在开发的过程中起到了很大的作用,例如,通过串口调试开发板的minicom,搜素源代码的工具等。
读者对象
□ 从事Android应用开发,但想进入Android底层开发领域的程序员。
□ 想从事Android底层开发的在校或即将毕业的大学生。
□ 有C/C++基础,想进入Android底层开发领域的程序员。
□ 想进一步提高Android底层开发技术和实践能力的程序员。
□ 开设Android底层开发课程的大专院校和培训机构。
□ 想进一步了解Linux常用驱动实现原理的程序员。
□ 有一定的Android和Linux底层开发理论基础,想进一步增加实战经验的程序员。
□ 所有对Android底层技术感兴趣的读者。
如何阅读本书
本书分为4篇,主要内容如下。
第1篇为入门准备篇,在这一部分主要为后面的内容搭建开发环境。包括Android开发环境和Linux驱动开发环境。其中包括JDK、Android SDK、Android NDK、Eclipse、交叉编译器以及一些工具的安装和使用。
第2篇为Android和Linux底层开发的入门篇。主要讨论了Linux驱动的开发,Android HAL开发,Android应用程序如何与Linux驱动交互和Linux驱动开发的调试技术。
第3篇为开发Linux驱动需要掌握的高级技术篇。包括并发控制、阻塞和非阻塞I/O、异步编程、Linux中断和底半部、时间管理、内存管理和I/O访问。
第4篇为Linux中典型驱动的源代码篇,包括RTC驱动、LCD驱动、音频驱动、块设备驱动、网络设备驱动和USB驱动。
这4篇通过由易到难的顺序系统地介绍了Android HAL和Linux驱动开发的各种技术。如果读者是初学者,建议从本书的第1章开始阅读。如果读者的机器上已经配置了相应的开发环境,可以跳过第1篇,直接从第2篇开始学习。当然,对于有一定Android和Linux底层开发经验的读者,可以直接阅读后两篇的内容。
在随书光盘的sources文件夹中包含了本书的所有例子代码,建议读者将该目录复制到硬盘中进行测试,也可以用Eclipse导入其中的Eclipse工程(包括Android工程和C/C++工程)。在随书光盘中还提供了一个虚拟环境(VMWare Ubuntu Linux 12.04 LTS),也包含了例子代码(/root/drivers)。如果读者由于某种原因不想或不能配置开发环境,可以在Windows、Linux或Mac OS X中通过VMWare打开虚拟机文件来学习本书提供的例子代码,并结合书中介绍的理论知识,学习的效果会更好。关于虚拟环境的用法会在“如何使用虚拟环境”中详细介绍。
如何使用虚拟环境
本书的随书光盘中带了一个Ubuntu Linux 12.04 LTS的VMWare虚拟环境,以虚拟文件的形式提供(用7z压缩),登录用户名:root,登录密码:12345678。该虚拟环境可以在Windows、Mac OS X和Linux下的VMWare中运行,建议读者安装较新的VMWare版本(如Windows版的VMWare8)。
虚拟环境压缩文件位于光盘的根目录,文件名是Ubuntu12.04.vmwarevm.7z,大约3.76GB。解压后大约13GB。建议读者在解压之前确保当前分区至少有15GB的自由空间。在不断读写虚拟环境后可能会使虚拟机文件尺寸增大。读者可以在 Ubuntu Linux 中执行 vmware-toolbox 命令启动VMWare工具来收缩虚拟机磁盘空间,收缩过程如图1所示。
▲图1 收缩虚拟机磁盘空间
虚拟环境已经配置了运行本书例子代码的开发环境,读者只要用 VMWare 打开虚拟环境即可启动Ubuntu Linux。运行本书的例子需要使用root登录。登录后会进入Ubuntu Linux的桌面。在桌面上有Eclipse的链接,双击即可启动Eclipse,如图2所示。本虚拟环境可以使用root登录。如果读者在自己的计算机上新安装了Ubuntu Linux12.04 LTS。用root登录的方法可以参考虚拟环境桌面的“用root登录”文档进行设置。
▲图2 Ubuntu Linux12.04虚拟环境桌面
虚拟环境中包含了本书所有的例子代码,这些代码位于/root/drivers目录中的相应子目录。
每一个源代码目录都提供了build.sh脚本文件。读者只要在Linux终端中进入该目录的相应子目录,执行build.sh脚本文件即可。该脚本文件会指导读者下一步如何做。
大多数程序的 build.sh 脚本文件都会要求读者选择编译平台,这些平台包括 Ubuntu Linux、Android模拟器和S3C6410开发板。如果读者选择Android模拟器,应确保Android模拟器已经启动。如果选择了S3C6410开发板,应确保S3C6410开发板通过USB线连接到PC上。如果同时有多个 Android 设备,脚本程序会显示一个选择菜单,需要选择具体的 Android 设备(运行平台)。选择时要注意选择正确的Android设备,例如,如果在编译程序时选择的平台是Android模拟器,那么运行平台也应该选择Android模拟器。脚本程序会自动将相应的二进制文件上传到Android设备上并安装,如果选择错了,尽管可以上传,但无法安装(会出现格式错误的提示信息)。如果只有一个Android设备,并不会出现设备选择菜单,脚本程序会直接操作这个Android设备。
有一些程序只能在某些Android设备上运行,例如,LED驱动只能在S3C6410开发板上才可以安装和测试,所以这些程序的build.sh脚本文件并不会要求选择编译平台,而会直接使用相应的Linux内核进行编译。
由于光盘空间的限制,虚拟环境并未包含Android源代码。但本书有一些章节的例子(如HAL)需要使用到Android源代码。读者可以按着第4章介绍的方法下载相应版本的Android源代码,或购买S3C6410开发板时随机光盘会包含相应版本的Android源代码。
读者可以直接在虚拟环境中下载Android源代码,也可以将下载后的源代码复制到虚拟环境中,通常将Android源代码放在/working目录中。当然,读者也可以将Android源代码放在其他的目录中,但要注意修改相应的路径。
勘误和支持
由于本人的水平有限,编写时间仓促,书中难免会出现一些错误或者不准确的地方,恳请读者批评指正。为此,特意提供了一个答疑 E-mail:techcast@126.com。读者可以将书中的错误、建议、技术问题发到该E-mail。非常期待能够得到你们的真挚反馈,编辑联系邮箱为zhangtao@ptpress.com.cn。
致谢
感谢所有在本书写作过程中给予我指导、帮助和鼓励的朋友,尤其是人民邮电出版社的编辑,他们不仅对本书提出了宝贵的写作建议,而且还对本书进行了仔细的审阅。
感谢一直以来信任、鼓励、支持我的家人和朋友。
感谢eoeandroid、移动开发者社区的朋友对我技术上的帮助。
谨以此书献给我最亲爱的家人,以及众多热爱Android的朋友们!
编者