android驱动开发和移植详解汇总Word文档下载推荐.docx
《android驱动开发和移植详解汇总Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《android驱动开发和移植详解汇总Word文档下载推荐.docx(48页珍藏版)》请在冰豆网上搜索。
上述两种类型的开发结构如图3-1所示。
主屏幕
联系人
电话
浏览器
„„
应用程序
活动管理器
窗口管理器
内容提供器
视图系统
通知管理器
框架
应用
程序
开发
包管理器
电话管理器
资源管理器
本地管理器
XMPP服务
接口管理器
持久层库
运行
环境
Dalvik虚拟
机器
位图及矢量
浏览器引擎
库
2D图形引
擎
中间协议
libc函数库
显示驱动
相机驱动
蓝牙驱动
Flash内存驱
动
BinderIPC
驱动
Linux
内核层
能源管理
USB驱动
键盘驱动
WiFi驱动
音频驱动
移植
各种硬件
图3-1Android开发的领域
3.Android系统开发
系统开发的目的是升级或改造Android中已经存在的应用和架构,开发出有自己特色的手机
系统。
例如联想手机乐Phone就是在Android基础上打造的一款适合国人使用习惯的手机系统,
如图3-2所示。
58
图3-2
乐Phone
Android系统开发的一个比较典型的示例就是当系统需要某种功能时,为了给Java层次的应
用程序提供调用的接口,需要从底层到上层的整体开发,具体步骤如下所示。
增加C或者C++和本地库。
定义Java层所需要的类(系统API)。
将所需要的代码封装成JNI。
结合Java类和JNI。
应用程序调用Java类。
一定要慎重对待对Android系统API的改动工作,因为系统API的稍微变动就可能会涉及
Android应用程序的兼容问题。
Android系统本身的功能也处于增加和完善的过程中,因此Android系统的开发也是一个重
要的方面。
这种类型的开发涉及Android软件系统的各个层次。
在更多的时候,Android系统开
发只是在不改变系统API的情况下修正系统的缺陷,增加系统的稳定性。
从商业模式的角度来看,第一种类型的开发和第二种类型的开发是Android开发的主流。
事
实上,移动电话的制造者主要进行第一种类型的开发,产品是Android实体手机;
公司、个人和
团体都可以进行第二种类型的开发,其产品是不同的Android应用程序。
在Android的开发过程中,每一种类型的开发都只涉及整个Android系统的一个子集。
在
Android系统中有着众多开发点,这些开发点相互独立,又有内在联系。
在开发的过程中,需要
重点掌握目前开发点涉及的部分。
背景说明:
AndroidAPI的接口是用Java语言编写的,通常更改接口函数的格式(参数、返回值)、
常量的值等内容就相当于更改系统API。
Android是一个开放的系统,适用于从最低端直到最高端的智能手机。
核心的Android
API在每部手机上都可使用,但仍然有一些API接口有一些特别的适用范围:
这就是
所谓的“可选API”。
在为某手机编写Android应用程序时,需要多少地对AndroidAPI进行修改,然后实现
我们需要的功能。
例如使用AndroidAPI添加蓝牙程序和Wi-Fi程序。
在更改Android
API时,通常更改其接口函数的格式(参数、返回值)和常量值等内容。
但是Android
API毕竟是谷歌推出的一系列标准,为了方便以后系统的升级,建议大家不改变
AndroidAPI的格式,而是只改变AndroidAPI的具体行为,也就是说为这些固定的
AndroidAPI编写各种各样的应用程序。
1.2Android移植
本书讲解的是Android驱动方面的开发知识,由图3-1可知,驱动开发是底层的应用,属于
Linux内核层的工作。
因为驱动是系统和硬件之间的载体,涉及不同硬件的应用问题,所以需要
做系统移植工作。
本节将简要介绍系统移植方面的有关问题。
59
1.2.1移植的任务
Android移植开发的最终目的是开发手机产品。
从开发者的角度来看,这种类型的开发以具
有硬件系统为前提,在硬件系统的基础上构建Android软件系统。
这种类型的开发工作在Android
系统的底层。
在软件系统方面,主要的工作集中在以下两个方面。
(1)Linux中的相关设备驱动程序
驱动程序是硬件和上层软件的接口。
在Android手机系统中,需要基本的屏幕、触摸屏、键
盘等驱动程序,以及音频、摄像头、电话的Modem、Wi-Fi、蓝牙等多种设备驱动程序。
(2)Android本地框架中的硬件抽象层
在Android中硬件抽象层工作在用户空间,介于驱动程序和Android系统之间。
Android系统
对硬件抽象层通常都有标准的接口定义,在开发过程中,实现这些接口也就给Android系统提供
了硬件抽象层。
上述两个部分综合起来相互结合,共同完成了Android系统的软件移植。
移植成功与否取决
于驱动程序的品质和对Android硬件抽象层接口的理解程度。
Android移植开发的工作由核心库、
Dalvik虚拟机、硬件抽象层、Linux内核层和硬件系统协同完成,具体结构如图3-3所示。
核心库
Dalvik虚拟机
硬件抽象层
Linux内核层(各种驱动)
硬件系统
图3-3
Android移植结构
1.2.2移植的内容
在Android系统中,在移植过程中主要移植驱动方面的内容。
Android移植主要分为如下几
个类型。
•基本图形用户界面(GUI)部分:
包括显示部分、用户输入部分和硬件相关的加速部分,还
包括媒体编解码和OpenGL等。
•音视频输入输出部分:
包括音频、视频输出和摄像头等。
•连接部分:
包括无线局域网、蓝牙、GPS等。
•电话部分:
包括通话、GSM等。
•附属部件:
包括传感器、背光、振动器等。
具体来说主要移植下面的内容。
•Display显示部分:
包括FrameBuffer驱动和Gralloc模块。
•Input用户输入部分:
包括Event驱动和EventHub。
•Codec多媒体编解码:
包括硬件Codec驱动和Codec插件,例如OpenMax。
•3DAccelerator(3D加速器)部分:
包括硬件OpenGL驱动和OpenGL插件。
60
•Audio音频部分:
包括Audio驱动和Audio硬件抽象层。
•VideoOut视频输出部分:
包括视频显示驱动和Overlay硬件抽象层。
•Camera摄像头部分:
包括Camera驱动(通常是v4l2)和Camera硬件抽象层。
•Phone电话部分:
包括Modem驱动程序和RIL库。
•GPS全球定位系统部分:
包括GPS驱动(例如串口)和GPS硬件抽象层。
•Wi-Fi无线局域网部分:
包括Wlan驱动和协议和Wi-Fi的适配层。
•BlueTooth蓝牙部分:
包括BT驱动和协议及BT的适配层。
•Sensor传感器部分:
包括Sensor驱动和Sensor硬件抽象层。
•Vibrator振动器部分:
包括Vibrator驱动和Vibrator硬件抽象层。
•Light背光部分:
包括Light驱动和Light硬件抽象层。
•Alarm警告器部分:
包括Alarm驱动和RTC系统和用户空间调用。
•Battery电池部分:
包括电池部分驱动和电池的硬件抽象层。
注意:
在Android系统中有很多组件,但并不是每一个组件都需要移植,例如那些纯软的组件就
不需要移植。
像浏览器引擎虽然需要下层的网络支持,但是实际上并不需要直接为其移植
网络接口,而是通过无线局域网或者电话系统数据连接来完成标准的网络接口。
1.2.3驱动开发的任务
前面介绍了Android系统的基本知识和移植内容,那么究竟在驱动开发领域需要做什么工作
呢?
我们的任务就是为某一个将要在Android系统上使用的硬件开发一个驱动程序。
因为Android
是基于Linux的,所以开发Android驱动其实就是开发Linux驱动。
对于大部分子系统来说,硬件抽象层和驱动程序都需要根据实际系统的情况来实现,例如传
感器部分、音频部分、视频部分、摄像头部分和电话部分。
另外也有一些子系统的硬件抽象层是
标准的,只需实现Linux内核中的驱动程序即可,例如输入部分、振动器部分、无线局域网部分
和蓝牙部分等。
对于有标准的硬件抽象层的系统,有的时候通常也需要做一些配置工作。
随着Android系统的更新和发展,它已经不仅仅是一个移动设备的平台,也可以用于消费类
电子和智能家电,例如3.0以后的版本主要是针对平板电脑的,另外电子书、数字电视、机顶盒、
固定电话等都逐渐使用Android系统。
在这些平台上,通常需要实现比移动设备更少的部件。
一
般来说,包括显示和用户输入的基本用户界面部分是需要移植的,其他部分是可选的。
例如电话
系统、振动器、背光、传感器等一般不需要在非移动设备系统上实现,一些固定位置设备通常不
需要实现GPS系统。
1.3Android对Linux的改造
Android内核是基于Linux2.6内核的,这是一个增强内核版本,除了修改部分Bug外,还提
供了用于支持Android平台的设备驱动。
Android不但使用了Linux内核的基本功能,而且对Linux
进行了改造,目的是实现更为强大的通信功能。
61
1.3.1Android对Linux内核文件的改动
在本书第1章的内容中已经讲解过Linux内核的基本知识,其实Android对Linux内核也进
行了改动,这些改动保存在下面的文件中。
drivers/misc/kernel_debugger.c
drivers/misc/pmem.c
drivers/misc/qemutrace/qemu_trace_sysfs.c
drivers/misc/qemutrace/qemu_trace.c
drivers/misc/qemutrace/qemu_trace.h
drivers/misc/uid_stat.c
drivers/staging/android/lowmemorykiller.c
drivers/staging/android/logger.c
drivers/staging/android/timed_output.h
drivers/staging/android/ram_console.c
drivers/staging/android/timed_gpio.c
drivers/staging/android/logger.h
drivers/staging/android/binder.h
drivers/staging/android/binder.c
drivers/staging/android/timed_output.c
drivers/staging/android/timed_gpio.h
drivers/rtc/alarm.c
drivers/rtc/rtc-goldfish.c
drivers/net/pppolac.c
drivers/net/ppp_mppe.c
drivers/net/pppopns.c
drivers/video/goldfishfb.c
drivers/switch/switch_class.c
drivers/switch/switch_gpio.c
drivers/char/dcc_tty.c
drivers/char/goldfish_tty.c
drivers/watchdog/i6300esb.c
drivers/input/misc/gpio_event.c
drivers/input/misc/gpio_input.c
drivers/input/misc/gpio_output.c
drivers/input/misc/keychord.c
drivers/input/misc/gpio_axis.c
drivers/input/misc/gpio_matrix.c
drivers/input/keyreset.c
drivers/input/keyboard/goldfish_events.c
drivers/input/touchscreen/synaptics_i2c_rmi.c
drivers/usb/gadget/android.c
drivers/usb/gadget/f_adb.h
drivers/usb/gadget/f_mass_storage.h
drivers/usb/gadget/f_adb.c
drivers/usb/gadget/f_mass_storage.c
62
drivers/mmc/host/goldfish.c
drivers/power/goldfish_battery.c
drivers/leds/ledtrig-sleep.c
drivers/mtd/devices/goldfish_nand_reg.h
drivers/mtd/devices/goldfish_nand.c
kernel/power/earlysuspend.c
kernel/power/consoleearlysuspend.c
kernel/power/fbearlysuspend.c
kernel/power/wakelock.c
kernel/power/userwakelock.c
kernel/cpuset.c
kernel/cgroup_debug.c
kernel/cgroup.c
mm/ashmem.c
include/linux/ashmem.h
include/linux/switch.h
include/linux/keychord.h
include/linux/earlysuspend.h
include/linux/android_aid.h
include/linux/uid_stat.h
include/linux/if_pppolac.h
include/linux/usb/android.h
include/linux/wifi_tiwlan.h
include/linux/android_alarm.h
include/linux/keyreset.h
include/linux/synaptics_i2c_rmi.h
include/linux/android_pmem.h
include/linux/kernel_debugger.h
include/linux/gpio_event.h
include/linux/wakelock.h
include/linux/if_pppopns.h
net/ipv4/sysfs_net_ipv4.c
net/ipv4/af_inet.c
net/ipv6/af_inet6.c
net/bluetooth/af_bluetooth.c
security/commoncap.c
fs/proc/base.c
1.3.2为Android构建Linux的操作系统
如果我们以一个原始的Linux操作系统为基础,改造成一个适合于Android的系统,所要做
的工作其实非常简单,仅仅是增加适用于Android的驱动程序。
在Android中有很多Linux系统
的驱动程序,将这些驱动程序移植到新系统的步骤非常简单,具体来说有以下三个步骤。
编写新的源代码。
在KConfig配置文件中增加新内容。
63
在Makefile中增加新内容。
在Android系统中,通常会使用FrameBuffer驱动、Event驱动、FlashMTD驱动、Wi-Fi驱
动、蓝牙驱动和串口等驱动程序。
并且还需要音频、视频、传感器等驱动和sysfs接口。
移植的
过程就是移植上述驱动的过程,我们的工作是在Linux下开发适用于Android的驱动程序,并移
植到Android系统。
在Android中添加扩展驱动程序的基本步骤如下所示。
在Linux内核中移植硬件驱动程序,实现系统调用接口。
在HAL中把硬件驱动程序的调用封装成Stub。
为上层应用的服务实现本地库,Dalvik虚拟机调用本地库来完成上层Java代码的实现。
由
编写Android应用程序,提供Android应用服务和用户操作界面。
1.4内核空间和用户空间接口是一个媒介
驱动程序是供系统使用硬件的,也就是说,驱动程序是介于系统和硬件之间的桥梁。
Linux在
下开发这些中间桥梁的驱动程序时,需要用到内核空间和用户空间之间的接口。
1.4.1内核空间和用户空间的相互作用
现在,越来越多的应用程序需要编写内核级和用户级的程序来一起完成具体的任务。
通常采
用以下模式:
首先,编写内核服务程序利用内核空间提供的权限和服务来接收、处理和缓存数据;
然后,编写用户程序和先前完成的内核服务程序进行交互。
具体来说,可以利用用户程序来配置
内核服务程序的参数,提取内核服务程序提供的数据,当然也可以向内核服务程序输入待处理数
据。
比较典型的应用包括Netfilter(内核服务程序:
防火墙);
Iptable(用户级程序:
规则设置
程序);
IPSEC(内核服务程序:
VPN协议部分);
IKE(用户级程序:
VPN密钥协商处理);
当然还包括大量的设备驱动程序及相应的应用软件。
这些应用都是由内核级和用户级程序通过相
互交换信息来一起完成特定任务的。
1.4.2系统和硬件之间的交互
实现硬件和系统的交互是底层开发的主要任务之一。
在Linux平台下有如下5种实现此功能
的方式。
1.编写自己的系统调用
系统调用是用户级程序访问内核最基本的方法。
目前Linux大致提供了二百多个标准的系统
调用(具体请参考内核代码树中的“include/asm-i386/unistd.h”“arch/i386/kernel/entry.S”和文件),
并且允许我们添加自己的系统调用来实现和内核的信息交换。
假如我们想建立一个系统调用日志
系统,将所有的系统调用动作记录下来,以便进行入侵检测,此时可以编写一个内核服务程序,
该程序负责收集所有的系统调用请求,并将这些调用信息记录到在内核中自建的缓冲里。
我们无
64
法在内核里实现复杂的入侵检测程序,因此必须将该缓冲里的记录提取到用户空间。
最直截了当
的方法是自己编写一个新系统调用实现这种提取缓冲数据的功能。
当内核服务程序和新系统调用
都实现后,就可以在用户空间里编写用户程序执行入侵检测任务了,入侵检测程序可以定时、轮
询或在需要的时候调用新系统调用从内核提取数据,然后进行入侵检测。
2.编写驱动程序
Linux/UNIX的一个特点就是把所有的东西都看做文件(everythingisafile)。
系统定义了简
洁完善的驱动程序界面,客户程序可以用统一的方法通过这个界面和内核驱动程序交互。
而大部
分系统的使用者和开发者已经非常熟悉这种界面及相应的开发流程了。
驱动程序运行于内核空间,用户空间的应用程序通过文件系统中“/dev/”目录下的一个文件
来和它交互。
这就是我们熟悉的文件操作流程:
open()→read()→write()→ioctl()→close()。
并不是所有的内核驱动程序都是这个界面,网络驱动程序和各种协议栈的使用就不大一致,
比如套接口编程虽然也有open(),close()等概念,但它的内核实现及外部使用方式都和普
通驱动程序有很大差异。
这里先不谈设备驱动程序在内核中要做的中断响应、设备管理、数据处理等工作,在此先把
注意力集中在它与用户级程序交互这一部分。
操作系统为此定义了一种统一的交互界面,就是前
面所说的open()、read()、write()、ioctl()和close()等。
每个驱动程序按照自己的需要做独立实现,
把自己提供的功能和服务隐藏在这个统一界面下。
客户级程序选择需要的驱动程