《Android系统开发入门》
Android应用开发者通常会接触到Java编程,因为大部分应用程序是用Java编写的,它们在Dalvik虚拟机上运行。然而,要深入理解Android系统的内部机制,掌握Linux内核知识至关重要,因为Android系统是基于Linux Kernel 2.6构建的。为了深入学习Android,需要具备C和Java语言的基础,以及对Linux系统的基本了解,C++的知识也大有裨益。
本文以Android 2.2版本为背景,通过创建一个模拟设备(一个带有4字节寄存器的设备)为例,详述从底层驱动到中间件再到上层应用程序的全程代码实现。虽然由于2011年9月的黑客事件,无法访问特定的kernel配置文件,但作者选择了JZ4760BLYNX开发板来运行示例代码。在设置好JZ Android编译环境后,就可以开始Android系统开发的学习旅程。
Android的硬件抽象层(HAL)是一个关键概念,它将Linux内核驱动程序封装起来,向上层提供接口,隐藏底层实现细节。硬件抽象层运行在用户空间,内核驱动程序则在内核空间。这样的设计并非仅出于技术考虑,更多的是商业策略。由于Linux内核遵循GNU License,要求发布产品时公开源代码,而Android遵循Apache License,不强制公开源代码。因此,将硬件支持逻辑全部放在内核驱动层会导致硬件参数和实现细节的公开,不利于厂商保护商业秘密。因此,Android将硬件支持分为内核驱动和HAL,内核驱动仅提供基本的硬件访问,而复杂的操作则在HAL中完成,从而保护了商业机密。这也导致Android无法被纳入Linux内核主线。
学习Android的HAL有助于全面理解Android系统,因为它涵盖了从硬件驱动层到硬件抽象层、运行时库和应用程序框架层等多个层次。在学习过程中,会涉及以下六个主要步骤:
1. **在Android内核源代码中编写硬件驱动程序**:理解内核驱动的基本结构和交互方式,以及如何在内核中实现对硬件的操作。
2. **在Android系统中添加C可执行程序访问硬件驱动程序**:了解如何在Android环境中执行C代码并与其硬件接口交互。
3. **在Android HAL中增加接口模块访问硬件驱动程序**:学习如何创建HAL接口,以便上层软件可以安全地调用硬件功能。
4. **在Android系统中编写JNI方法**:利用JNI(Java Native Interface)实现Java代码与C/C++代码的互操作,使得Java应用程序可以调用硬件驱动。
5. **在Android应用程序框架层增加硬件服务接口**:设计并实现框架层的服务,以便其他组件或应用程序可以方便地访问硬件资源。
6. **编写APP通过应用程序框架层访问硬件服务**:学习如何编写Android应用程序,利用前面创建的框架层接口来访问和控制硬件。
这一系列的学习过程将逐步揭示Android系统从底层硬件到上层应用的完整交互流程,帮助开发者更好地理解和掌控Android系统的每一个环节。