移动终端应用开发技术——Android实战(txt+pdf+epub+mobi电子书下载)


发布时间:2020-09-12 22:33:36

点击下载

作者:林少丹

出版社:机械工业出版社

格式: AZW3, DOCX, EPUB, MOBI, PDF, TXT

移动终端应用开发技术——Android实战

移动终端应用开发技术——Android实战试读:

前言

计算机设备从桌面计算机发展到移动笔记本电脑,因特网也从有线网络发展到无线网络,网络无所不在的时代来了,移动设备的时代来了。为了满足任何一台设备在任何地点、任何时间都可以使用相同的操作接口来获取相同的信息,将会有更多更漂亮的创意、革命性产品和技术推陈出新,鼠标会不会被触控屏幕的手指操作功能替代了?移动设备需要什么样的输入和输出新方式?电信网络会有突破性的革命吗?通信资费会大幅度降低吗?这一切的变化将会牵动移动设备的未来发展。Android操作系统是针对移动设备和嵌入式设备所设计的操作系统,所以在蓝牙通信、触控屏幕、感应侦测和无线网络方面都提供了新的功能,并在不断地改进。学习和选择Android操作系统来开发应用程序是明智之举。

本书以Android操作系统架构为经,以开发Android应用程序为纬,介绍如何开发Android应用程序。读者可以学习Android OS 2.3所提供的方法,自己来开发Android应用程序,同时可以学习到Android操作系统的架构和原理。本书以Android OS 2.3来介绍和提供相关的范例程序,范围更宽广,讲解更完整。

各章的主题都按照进阶学习的顺序安排,以满足不同读者的需要,顺序如下:

1)概念介绍。

2)操作系统结构和类库说明。

3)开发应用程序的方法。

4)应用程序范例说明。

本书共9章,逻辑上分成三个部分,第一部分(第1~4章)是准备篇,读完这一篇你会了解Android操作系统的基本运作单元活动程序(Activity)和活动程序彼此间的互动方式,采用意图(Intent)来切换程序和显示窗体,同时分门别类地详细说明开发Android应用程序常用的创作套件(Widget)、窗体布局(Layout)和操作菜单(Menu)。第二部分(第5~8章)是基础篇,介绍进阶功能,完整地说明Android操作系统的架构,包括服务程序(Service)和内容提供器(Content Provider)如何工作,同时介绍Google提供的本地数据库系统SQLite和Web视图WebView的强大功能,也会学习到如何设置Android常驻程序(AppWidget)和如何将Android应用程序国际化,提供多国语言的应用程序。第三部分(第9章)是实践篇,介绍了关于3G和多媒体等,以及应用程序如何使用Google所提供强大的地图库及其功能,音频和视频播放程序,各种绘图工具和编写游戏软件常用到的高速描绘(SurfaceView),同时你也会学习到蓝牙通信Bluetooth、WIFI通信、触屏控制等技术。

本书紧紧围绕Android经典应用程序开发进行讲授。经典应用程序开发,就是基于Android的标准API在SDK的环境下进行应用程序包(APK)的开发。这种开发模式下的开发成果可以作为Android系统的第三方的应用程序包,也可以作为Android产品中的应用程序。这是一种最基本、适用面最广的Android应用程序开发模式。

随着Android系统的发展,经历了1.0、1.1版本的初露锋芒阶段,1.5版本里程碑式的阶段,1.6版本的升级,2.0版本的重要阶段,2.1、2.2版本的升级,获得了Android2.3版本。目前,Android 3.x版本是更适合平板电脑的系统,且开源策略与从前相比有所变化。因此Android 2.3版本是用于移动系统的相对稳定而高级的版本。Android 4.0作为Android系统最新的开源版本,其开发的技术方面依然和Android 2.3非常相似。Android 2.3中的开发方式和理念可以在Android 4.0开发中使用。

本书作者参与了Android系统三年多发展过程中的系统开发和产品开发,对Android系统整体架构和发展理念有着深刻的认识。随着Android系统趋于稳定,本书作者也获得了一个将成熟的Android系统的经典应用开发结构清晰完整地展示给读者的契机。

本书纳入“福建省高等职业教育教材建设计划”,在编写过程中得到了福建省教育厅的大力支持,在此表示衷心感谢!

由于作者水平有限,书中难免存在错误和疏漏之处,敬请读者批评指正。作者第一部分准备篇第1章Android开发简介

在开放手机联盟推出基于Linux平台的开源手机操作系统Android之后,举办了Android开发者大赛,吸引了众多开发者的目光。Android不仅功能强大,而且具有开放和免费等先天优势,因此全球范围内的电信行业、手机制造商毫不犹豫地加入到Android开放手机联盟中来。2008年9月22日,美国运营商T-Mobile在纽约正式发布了第一款基于Android的手机——T-Mobile G1,这让更多的移动设备商看到了Android的光明前景,并纷纷加入其中。

随着Android手机的普及,Android应用的需求势必会越来越大,这将是一个潜力巨大的市场,会吸引无数软件开发厂商和开发者投身其中。1.1 Android基本概念

Android一词本意是指“机器人”,现在大家都知道它是开源手机操作系统。Android基于Linux平台,由操作系统、中间件、用户界面和应用软件组成。它是一个由30多家科技公司和手机公司组成的开放手机联盟共同研发的,大大降低了新型手机设备的研发成本,使完全整合的全移动功能性产品成为开放手机联盟的最终目标。

Android作为移动互联网战略的重要组成部分,将进一步推进“随时随地为每个人提供信息”这一目标的实现,让移动通信不依赖于设备,甚至是平台。

Android系统具有如下5个特点:(1)开放性

开放手机联盟开发了Android,通过与移动运营商、设备制造商、软件开发商和其他有关各方结成深层次的合作伙伴关系,希望通过建立标准化、开放式的移动电话软件平台,在移动产业内形成一个开放式的生态系统。(2)应用程序无界限

Android的应用程序可以通过标准API访问核心移动设备功能。通过互联网,Android的应用程序可以声明它们的功能可供其他应用程序使用。(3)应用程序是在平等的条件下创建的

移动设备上的应用程序可以被替换或扩展,即使是拨号程序或主屏幕这样的核心组件。(4)应用程序可以轻松地嵌入网络

应用程序可以轻松地嵌入HTML、JavaScript和样式表,还可以通过WebView显示网络内容。(5)应用程序可以并行运行

Android是一种完整的多任务环境,应用程序可以在其中并行运行。在后台运行时,应用程序可以生成通知,以引起注意。

为什么Android手机如此受用户青睐?以下就是Android的各项功能。

1)智能虚拟键盘。虚拟键盘的出现意味着基于Android 1.5或以上版本的移动设备可以同时支持物理键盘和虚拟键盘。不同的输入方式可满足用户在特定场景的需求。Android虚拟键盘可以在任何应用中提供,包括Gmail、浏览器、SMS,当然也包括大量的第三方应用,如自动校正、推荐、用户词典等。不同于其他手机平台,Android还支持第三方虚拟键盘应用的安装。

2)使用Widget实现桌面个性化。可以用Widget“武装”自己的桌面。大多数小的web应用都是从网络上获得实时数据并展示给用户的。Android预装了5个桌面Widget,包括数字时钟、日历、音乐播放器、相框和搜索。不同于iPhone,Android通过内置的应用程序库安装第三方Widget,使用户体验大大提升。

3)使用在线文件夹快速浏览在线数据。类似于OS X Leopard的QuickLook特征,Android的在线文件夹可显示常见的数据条目,如联系人、喜欢的应用、E-mail信息、播放列表、书签、RSS源等,并不需要运行系统程序处理特定的数据条目。在线文件夹数据实时更新,就像通过云或是本地创建新的数据。开发者可以拓展通用数据条目和注册新数据类型的内置支持。例如,Twitter客户端程序可以注册tweet作为新数据类型,因此可以从朋友那里创建tweet的在线文件。Android可以为个人桌面提供一组在线文件夹,从而帮助快速、方便地浏览联系人、股市、书签等信息。

4)视频录制和分享。Android有录制和分享视频的功能,对RealPlayer和MPEG-4、3GP等视频格式也有很好的支持。可以通过E-mail、MMS或直接上传到YouTube等方式来分享视频,可使用隐私控制来决定是分享给朋友还是每个人。上传视频的同时,可以继续使用手机,甚至可以继续录制和上传新的视频。

5)图片上传。完成拍照后,当浏览图片或选择在线图片服务Picasa时,只需单击“分享”就会拥有免费图片存储空间。

6)更快、更兼容的浏览器。Android基于Webkit内核的浏览器带来了重要的调速装置(SpeedPumb),这得益于新的Webkit渲染引擎和优化的Java脚本编译器(SquireIFish)。当使用包含大量Java脚本的复杂web应用时,可以体验到更佳的性能。除提高速度外,Android的浏览器还支持Web页面内的复制和粘贴操作,用户可以选中文本并复制,然后粘贴到搜索框中进行搜索。

7)语音搜索(Voice Search)。带有语音识别技术的手机已于2008年11月面世,它支持语音搜索功能。该功能增强了默认的搜索能力,已超过纯文本搜索。当大声说出要搜索的内容后,Android将上传数字信号并记录到web服务器中。在服务器中。语音识别技术能将语音转化为特定的文本搜索,使之通过搜索引擎,通过地理位置的筛选,将结果反馈到手机设备。

8)立体声蓝牙和免提电话。除了增强的免提电话体验,Android还支持立体声蓝牙(A2DP和AVCRP),并有自动配对功能。

9)强大的GPS技术。Android内部提供了大量GPS组件,可以很轻松地获得设备当前的位置等信息,让导航等功能更加完美。

10)Android系统硬件检测。Android可自动检测和修复SD卡的文件系统,允许第三方应用显示Android系统的硬件特征。为了让用户下载到与自己的设备更匹配的应用,可以检测用户设备的硬件信息,让满足应用要求的设备安装该程序。当更多的Android设备建立在不同的硬件上时,这个功能会显得很实用。1.2 Android系统构架

从图1-1中可以看出Android分为4层,从高到低分别是应用层、应用框架层、系统运行库层和Linux内核层。下面将对这4层进行简要的分析和介绍。图1-1 Android的系统架构(1)应用层

应用是用Java语言编写的,运行在虚拟机上。最初是在Android系统中捆绑了一些核心应用,如E-mail客户端、SMS短消息程序、日历、地图、浏览器、联系人管理程序等。(2)应用框架层

这一层是编写核心应用时所使用的API框架,开发人员同样可以使用这些框架来开发自己的应用,这样便简化了程序开发的架构设计,但是必须遵守其框架的开发原则。

Android提供了如下一些组件。

丰富而又可扩展的视图(View):可以用来构建应用程序,它包括列表(List)、网格(Grid)、文本框(TextBox)、按钮(Button)以及可嵌入的Web浏览器。

内容提供器(ContentProvider):它可以让一个应用访问另一个应用的数据(如联系人数据库),或共享它们自己的数据。

资源管理器(ResourceManager):提供非代码资源的访问,如本地字符串、图形和布局文件(Layoutfile)。

通知管理器(NotificationManager):应用可以在状态栏中显示自定义的提示信息。

活动管理器(ActivityManager):用来管理应用程序生命周期并提供常用的导航退回功能。

窗口管理器(WindowManager):管理所有的窗口程序。

包管理器(PackageManager):Android系统内的程序管理。(3)系统运行库(C/C++库以及Android运行库)层

当使用Android应用框架时,Android系统会通过一些C/C++库来支持使用的各个组件,使其能更好地服务。

Bionic系统C库:C语言标准库是系统最底层的库,C库通过Linux系统来调用。

多媒体库(MediaFramework):Android系统多媒体库,基于PacketVideo OpenCORE,该库支持多种常见格式的音频、视频的回放和录制以及各种图片格式,如MPEG4、MP3、AAC、AMR、JPG、PNG等。

SGL:二维图形引擎库。

SSL:位于TCP/IP与各种应用层协议之间,为数据通信提供支持。

OpenGLES1.0:三维效果的支持。

SQLite:关系数据库。

Webkit:Web浏览器引擎库。

FreeType:位图(Bitmap)及矢量(Vector)。

每个Java程序都运行在Dalvik虚拟机上。与个人计算机一样,每个Android应用程序都有自己的进程,Dalvik虚拟机只执行.dex可执行文件。当Java程序通过编译时,还需要通过SDK中的dx工具转化成.dex格式,才能正常在虚拟机上执行。

2007年底正式发布了AndroidSDK,作为Android系统的重要特性,Dalvik虚拟机也第一次进入了人们的视野。它对内存的高效使用以及在低速CPU上表现出的高性能,确实令人刮目相看。Android系统可以简单地完成进程隔离和线程管理。每一个Android应用在底层都会对应一个独立的Dalvik虚拟机实例,其代码在虚拟机的解释下得以执行。

很多人认为Dalvik虚拟机是一个Java虚拟机,正是因为Android的编程语言恰恰就是Java语言。但是这种说法并不准确,因为Dalvik虚拟机并不是按照Java虚拟机的规范来实现的,两者并不兼容。它们有两个明显的不同:①Java虚拟机运行的是Java字节码,而Dalvik虚拟机运行的是其专有的文件格式,即dex文件;②在JavaSE程序中的Java类会被编译成一个或者多个字节码文件(.class),然后打包到jar文件,Java虚拟机会从相应的class文件和jar文件中获取相应的字节码,Android应用虽然也是使用Java语言进行编程,但是在编译成class文件后,还会通过一个工具(dx)将应用所有的class文件转换成一个dex文件,而后Dalvik虚拟机会从其中读取指令和数据。

Dalvik虚拟机非常适合在移动终端上使用,相对于在桌面系统和服务器系统运行的虚拟机而言,它不需要很快的CPU计算速度和大量的内存空间。根据测算,64MB的内存已经能够让系统正常运转了。当然,随着系统服务的增多和应用功能的扩展,所消耗的内存也势必越来越大。归纳起来,Dalvik虚拟机有如下几个主要特征。

1)专有的dex文件格式。dex是Dalvik虚拟机专用的文件格式,为什么弃用已有的字节码文件,而采用新的格式呢?原因如下:

●每个应用中会定义很多类。编译完成后即会有很多相应的class文件,class文件中会有大量冗余信息,而dex文件格式会把所有的class文件内容整合到一个文件中。这样,除了减少整体的文件尺寸和I/O操作外,同时提高了类的查找速度。

●增加了对新的操作码的支持。

●文件结构尽量简洁,使用等长的指令,借以提高解析速度。

●尽量扩大只读结构的大小,借以提高跨进程的数据共享。

dex的优化使dex文件的结构是紧凑的,如果希望运行时的性能有进一步提高,就需要对dex文件进一步优化。优化上要针对以下几个方面:

●调整所有字段的字节序和对齐结构中的每一个域。

●验证dex文件中的所有类。

●对一些特定的类和方法里的操作码进行优化。

●基于寄存器,相对于基于堆栈实现的虚拟机,给予寄存器实现的虚拟机虽然在硬件、通用性上要差一些,但是它在代码的执行效率上却更胜一筹。

2)一个应用,一个虚拟机实例,一个进程。每一个Android应用都运行在一个Dalvik虚拟机实例中,而每一个虚拟机实例都是一个独立的进程空间。虚拟机的线程机制、内存分配和管理、Mutex等的实现都依赖底层操作系统。所有Android应用的线程都对应一个Linux线程,因此虚拟机可以更多地依赖操作系统的线程调度和管理机制。不同的应用在不同的进程空间里运行,对不同来源的应用都使用不同的Linux用户来运行,可以最大限度地保护应用的安全和独立运行。(4)Linux内核层

Android的核心系统服务基于Linux 2.6内核,如安全性、内存管理、进程管理、网络协议栈和驱动模型等都依赖于该内核。Linux内核同时也作为硬件和软件栈之间的抽象层。

Android需要一些与移动设备相关的驱动程序,主要的驱动如下所示。

●显示驱动(Display Driver):基于Linux的帧缓冲(FrameBuffer)驱动。

●键盘驱动(KeyBoard Driver):作为输入设备的键盘驱动。

●Flash内存驱动(Flash Memory Driver):基于MTD的Flash驱动程序。

●照相机驱动(Camera Driver):常用的是基于Linux的v412(Video for Linux)驱动。

●音频驱动(Audio Driver):常用的是基于ALSA(Advanced Linux Sound Architecture)的高级Linux声音体系驱动。

●蓝牙驱动(Bluetooth Driver):基于IEEE 802.15.1标准的无线传输技术。

●WIFI驱动:基于IEEE 802.11标准的驱动程序。

●Binder IPC驱动:Android的一个特殊的驱动程序,具有单独的设备节点,提供进程间通信的功能。

●电源管理(Power Management):如电池电量等。1.3 Android应用程序框架

在开发应用时,都是通过框架来与Android底层进行交互,接触最多的就是应用框架层。

什么是应用程序框架呢?框架可以说是一个应用程序的核心,是所有参与开发的程序员共同使用和遵守的约定,大家在其约定上进行必要的扩展,但程序始终保持主体结构的一致性。其作用是让程序保持清晰和一目了然,在满足不同需求的同时又不互相影响。

Android系统提供给应用开发者的本身就是一个框架,所有的应用开发都必须遵守这个框架的原则。开发应用就是在这个框架上进行扩展。下面介绍Android这个框架都有些什么功能可供使用。

android.app:提供高层的程序模型和基本的运行环境。

android.content:包含对各种设备上的数据进行访问和发布。

android.database:通过内容提供者浏览和操作数据库。

android.graphics:底层的图形库,包含画布、颜色过滤、点、矩形,可以将它们直接绘制到屏幕上。

android.location:定位和相关服务的类。

android.media:提供一些类管理多种音频、视频的媒体接口。*

android.net:提供帮助网络访问的类,超过通常的java.net.接口。

android.os:提供系统服务、消息传输和IPC机制。

android.opengl:提供OpenGL的工具。

android.provider:提供访问Android内容提供者的类。

android.telephony:提供与拨打电话相关的API交互。

android.view:提供基础的用户界面接口框架。

android.util:涉及工具性的方法,如时间日期的操作。

android.webkit:默认浏览器操作接口。

android.widget:包含各种UI元素(大部分是可见的)在应用程序的布局中使用。第2章硬件开发平台介绍2.1 TCC88XX硬件配置介绍图2-1 TCC88XX硬件配置(1)TCC88XX核心板配置

CPU处理器:ARMcortexA8,主频最高可达1.2GHz。

内存配置:核心板装配512MB DDR3,DDR3可达到800MHz以上。

Flash存储器:核心板载4GB Nand Flash,掉电非易失。

WIFI配置:带WIFI无线上网模块。

加密配置:带加密芯片。

音频芯片:ALC5621。

CPU电压:正常工作为1.33V,待机为1.20V,休眠后为0.90V。(2)TCC88XX底板配置

1)LCD和TP接口。

●LCD接口支持TFT液晶屏。默认配置为7in普清TFT屏,自带触摸屏。

●TP接口可支持AK4187两点电阻屏,SIS(矽统)的两点电容屏,两者可选。默认配置为AK4187两点电阻屏。

2)其他接口。

●1个100Mbit/s以太网RJ-45接口。

●2个USB Host型接口。

●1个USB OTG型接口。

●1个TF卡接口。

●1个3G模块(包括SIM卡接口)。

●1个HDMI高清输出接口。

●1个GPS全球卫星定位模块。

●1个UART。

●1个音频模块。

●1个电源开关。

●1个Camera模块(在屏上)。

●1个光感模块。

●1个指南针模块。

●1个直流电动机模块。

●12个按键(ADC采样检测)。(3)按键功能说明

总共有14个按键,其中特别键说明如下。

1)Power键:长按此键开机;开机状态下,长按此键可弹出选择对话框。

2)Volume键:Volume+键表示开机时长按此键进入FWDN烧录模式;Volume-键表示开机时长按此键进入Fastboot烧录模式。

3)Back键:开机时长按此键进入升级模式。2.2TCC88XX软件资源介绍

1)bootloader特性:支持用USB线下载程序;支持显示开机logo;支持I2C通信;支持UART打印。

2)Linux内核:Kernel版本2.6.35.7,支持的文件系统有ext2文件系统、ext3文件系统、yaffs2文件系统。

3)应用apk:在源码包根目录下,进入Premake\apps\,里面有很多,如gtp113.apk(GPS调试)、eMusic.apk(音乐)、compass.apk(指南针)等。2.3主页界面说明

系统启动后的主页界面如图2-2所示,共支持5个桌面的显示。

1)打开系统3G功能。

2)不同的3G模块支持不同的SIM卡(联通卡或是移动卡),请注意选择。

3)第一次连接可能会比较久,且要反复几次,多次连接不上可重启再试。图2-2 系统主页界面第3章Android系统与驱动准备3.1 Android开发环境搭建实验【实验目的】

1)搭建Android开发环境。

2)熟悉Android编译过程。

3)熟悉Linux常用命令。【实验步骤】(1)搭建系统相关环境

把光盘内的编译工具arm-linux-4.11.tar.gz放到Linux系统某个目录内,然后解压到opt目录下。

更新Java编译器,登录http://source.android.com/source/initializing.html网站,因为要编译的是Android2.3.3系统,所以要把编译器更新到Java6。

执行如下命令:

其中,第二步sudoadd-apt-repository"deb-srchttp://archive.canonical.com/ubuntu lucid partner"可能不成功,可以直接跳过这步,执行后面的操作;把光盘内的编译工具arm-linux-4.11.tar.gz放到Linux系统某个目录内,然后解压到opt目录下。将编译器路径加入到系统环境中,在系统根目录下执行vi/etc/profile,打开profile文件,最后可以看到PATH的添加路径。将两个编译器的bin文件路径添加进去,多余的部分不必理会。当然jdk工具也要是1.5.0_22,如下所示:

下面是安装ncurses等编译时所用到的库,此库在编译内核文件时需要。

下面是安装eclipse,以后开发Android上层需要此开发环境。

把光盘里提供的BSP包解压到某个目录:

配置字长为32位的CPU,此资源包默认配置为64位CPU,所以如果计算机是32位字长的CPU,则需要进行如下的修改。

首先打开build/core/main.mk,会看到如下情况:

屏蔽errorstop即可(前面加#号)。

修改标记,在cdexternal/clearsilver目录下,执行grep-nHr"LOCAL_CFLAGS"*,会看到如下情况:

此时修改相应目录下的LOCAL——CFLAGS+=-m64为LOCAL_CFLAGS+=-m32即可。*

再次执行grep-nHr"LOCAL_LDFLAGS",会看到如下情况:

此时,将相应目录下的LOCAL_LDFLAGS+=-m64改为LOCAL_LDFLAGS+=-m32即可。(2)了解Android系统

作为一个开放式的移动设备平台,Android系统包含了众多的功能和庞大的代码。其代码基于Linux内核,在用户空间又分成本地代码(C和C++)和Java代码两种。从宏观的角度看,Android是一个开放的软件系统。从下至上,Android系统可以分成4层:

第一层:Linux操作系统及驱动层。

第二层:本地代码框架及Java虚拟机。

第三层:Java框架。

第四层:Java应用程序。

Android系统的第一层由C语言实现,第二层由C和C++实现,第三层和第四层主要由Java代码实现。

按照传统的描述,Android系统全部代码的工程分为3个部分。

1)核心工程:是建立Android系统的基础,在根目录的各个文件夹中。

2)扩展工程:使用其他开源项目扩展的功能,在external文件夹中。

3)包:提供Android系统的应用程序、内容提供者、输入法、服务、在package文件夹中。

Android源代码的根目录内容如下所示。

1)bionic:C运行时支持libc、libm、libl和动态linker。

2)bootable:BootLoader的参考代码。

3)build:build系统。

4)cts:兼容性测试框架。

5)dalvik:Dalvik虚拟机。

6)development:高层的开发和调试工具。

7)device:设备相关代码。

8)external:扩展库。

9)frameworks:Android框架层。

10)ndk:ndk相关的内容。

11)packages:应用程序员的各个包。

12)prebuilt:对Linux和MaxOS编译的二进制的支持。

13)sdk:sdk环境中需要的内容。

14)Android的基本系统。3.2 Android系统的定制实验【实验目的】

1)定制Kernel。

2)定制Android。

3)源码编译。【实验步骤】(1)编译前准备工作

编译之前,先对开发板进行环境配置。在源码根目录下执行.build/envsetup.sh脚本文件,显示如下:

之后执行lunch命令,显示如下:

在TCC8803平台上,选择full_m801-eng或full_m801-user模式,eng/user表示是对文件操作权限。本开发板,可以选择8。

注意:此步骤在编译Kernel之前,每次编译之前需要执行lunch命令,进行环境变量配置。(2)编译bootloader

在根目录下执行cdbootable/bootloader/lk/,进入lk目录。对于TCC8803平台,执行makem801_evm,之后lk.rom在build-m801_evm文件夹里面生成。如果想清除生成文件,则在本目录下执行makem801_evmclean.。

由于给的bootloader源码是针对于本开发板的,所以无需作太多改动,直接编译即可。(3)编译内核

编译kernel,在根目录下执行cdkernel,进入kernel目录。对于TCC8803平台,可以通过maketcc88xx_defconfig选择配置。如果需要精确配置和修改,则执行make menuconfig命令,进入文本配置界面(见图3-1)进行修改。图3-1 文本配置界面

Device Drivers选项是一些驱动的集合体,所谓的系统裁剪(根据硬件,只保留有用的驱动),很大一部分工作量就是在这里面完成的。

最后执行make命令,开始编译。如果想清除kernel里面生成的文件,则执行make clean命令。

注意:如果要生成boot.img文件,则执行make out/target/product/m801/boot.img命令,因为烧录内核的东西是boot.img文件。

在编译触摸屏选项时,注意内核的触摸屏配置如图3-2所示。

这里使用的是电容屏,就要配制[]i2csis,内核里默认是i2cAK4187。

在使用串口调试时需要打开串口的调试功能,如图3-3所示。

[Device→Character devices→Serial driver→Console on TCC serial port](4)编译Android系统

编译Android系统,在根目录下执行make命令即可。图3-4所示为环境配置信息,可在这里进行信息核对,直到编译完成,会花费很长一段时间。

编译完成后会在根目录下生成out/目录,里面全是编译所生成的文件,其中system.Img、boot.img和recovery.img在out/target/product/m801/目录下。若想清除out目录下文件,在根目录下可执行makeclean命令。图3-2 触摸屏配置图3-3 打开串口的调试功能图3-4 环境配置信息

最后,执行命令mkmtdimg--boot out/target/product/m801/boot.img --system out/target/product/m801/system.img-recovery out/target/product/m801/recovery.img-om801_mtd.img。此时,会在根目录中生成文件m801_mtd.img。烧录时只需烧录lk.rom和m801_mtd.img文件即可。3.3 Android系统的下载实验【实验目的】

系统烧录。【实验步骤】

当修改了lk中的内容时,调试则只需要烧录lk.rom即可;当修改了kernel中的内容时,只需烧录boot.img即可;当修改了上层应用时,此时需要烧录整个MTD文件。烧录lk.rom和m801_mtd.img文件(用FWDN_V7_V2.13.exe软件),如图3-5所示。图3-5 烧录软件界面

步骤如下:

1)打开FWDN,添加lk.rom和m801_mtd.img文件。

2)把USB线接到计算机上的USB口,按VOLUME+键,然后开机或重启,可进入FWDN模式。

3)当开发板上没有程序或按键无作用时,接入USB线,需要在开机短接核心板上靠近主芯片的两点,这样也可以进入FWDN模式。

4)添加NAND_Data.fai,方法是:单击Area Map下方的NAND Data,进入NAND配置界面,在DiskImage→Number of Partition中选择一个分区即可。

5)单击Start按钮,即可烧录。

注意:设置WIFI的MAC地址。

用Fastboot烧录boot.img、system.img、recovery.img、update.img;按VOLUME-键,可以进入Fastboot烧录模式,步骤如下(见图3-6):

1)用USB线连接开发板和计算机。

2)打开计算机上运行窗口,输入cmd命令。

3)进入到fastboot\盘下(fastboot工具所在目录)。

4)按住Volume-键,启动或重启开发板,进入fastboot模式。

5)运行命令:fastboot.exedevices,检测设备是否存在。

6)烧写boot.img,命令如下:fastbootflashboot烧录文件所在目录。

7)烧录完成,重启开发板命令如下:fastbootreboot。图3-6 Fastboot烧录步骤3.4 按键驱动实验【实验目的】

1)Android驱动架构。

2)按键驱动实现方式。【实验步骤】(1)按键电路图

按键电路有两种:矩阵式和非矩阵式。矩阵式的电路图就像一个图格(X,Y坐标),通过两条线路才能确定哪个按键被按下,并且需要多个GPIO口,而在开发板中,按键检测只用一个GPIO口,此口作为ADC的一个检测口,通过检测按下键后的电压值,经过ADC转换得到的数据,从而检测到哪个键被按下。按键电路图如图3-7所示。图3-7 按键电路图(2)按键驱动代码

驱动代码位于51Board/kernel/drivers/input/keyboard/目录下tca_keypad.c和tca_keypad.h两个主要文件夹中,当然还有其他文件,可以参考下面所包含的头文件。

ADC控制器初始化代码如下:

当按键被按下时,相应驱动会取得一个AD值。

把取得的AD值转化为对应的键值。

对于键盘的映射值在对应的头文件里也有对应。

此处是定义映射的地方。

KPD_SCANCODE_MAP在这里是一个宏,其定义在51Board/kernel/include/linux/51boardpcb/51BOOT_PCB_TCC88XX_V1.h文件里(254行开始处)。

51Board/kernel/drivers/input/keyboard/tca_keypad.c中所实现的代码只是最底层调用的接口,这些接口如何调用及调用流程,要看Linux内核里的input子系统中的东西。

在本开发平台上,生成的文件结点是/dev/input/event0,在此input下生成的文件夹结点有event0~4,按键所用的是event0,event4对应于USB鼠标。

可以在adbshell模式下输入:cat/dev/input/event0,然后按下按键,这时系统层就会反馈出对应的信息(由于编码问题,反馈的信息可能是乱码)。3.5 Framebuffer驱动实验【实验目的】

1)熟悉Android底层驱动模型。

2)熟悉Framebuffer的构架。【实验步骤】(1)Framebuffer工作原理

Framebuffer的机制就是模仿显卡的功能,直接通过Framebuffer的读写对显存进行操作。对于用户而言,Framebuffer和/dev下面的其他设备没有什么区别,用户可以将Framebuffer看成是显示内在的一个映像,将其映射到进程地址空间之后,就可以直接执行读写操作。写操作可以立即反映在屏幕上,这种操作是抽象的和统一的,用户不必关心物理显存的位置和换页机制等具体细节,这些都是由Framebuffer设备驱动来完成的,下面将对这个设备驱动的实现进行介绍。Framebuffer本身不具备任何数据运算的能力,它就好比是一个暂时存放水的水池,CPU将运算后的结果放到这个水池,水池再将结果流到显示器,中间不会对数据做处理。应用程序也可以直接读写这个水池的内容。在这种机制下,尽管Framebuffer需要真正的显卡驱动的支持,但所有显示任务都由CPU完成,因此CPU负担很重。

PCI设备可以将自己的控制寄存器映射到物理内存空间,然后,对这些控制寄存器的访问就变成了对物理内存的访问。因此,这些寄存器又被称为memio。一旦被映射到物理内存空间,Linux的普通进程就可以通过mmap将这些内存的I/O映射到进程地址空间,这样就可以直接访问这些寄存器了。Framebuffer属于字符设备,它采用了“文件层-驱动层”的接口方式。Linux为帧缓冲设备定义的驱动层接口为fb_info结构体,在文件层次上,用户调用file_operations结构体的函数操作。其中,间接调用fb_ops结构体的函数操作硬件。在向内核注册FB设备的时候,也注册了structfb_ops的指针。当打开FB设备时,先调用fb_drivers[]的xxxfb_init()来初始化设备。

通常,每个系统都可以拥有多个显示设备,它们用“/dev/fbX”来表示,其中的X表示设备的序列号。例如,第一个被注册的Framebuffer的minor等于0,第二个被注册的Framebuffer的minor为1,那么就应该分别写成/dev/fb0和/dev/db1,依此类推。(2)Framebuffer构架

根据对Framebuffer工作原理的了解,首先在用户空间中可以通过ioctl和mmap等文件系的接口对“/dev/fbX”进行操作;然后通过字符设备驱动程序调用Framebuffer驱动,该项驱动又会调用具体的Framebuffer驱动(structfb_info);最后由fb_inf操作不同的硬件显示设备。Framebuffer的注册流程正好与此相反,图3-8所示为Framebuffer系统构架。

因为不同的显示芯片具有不同的加速能力,所以对memio的使用和定义也各不相同。这时,就需要针对加速芯片的不同类型来实现不同的加速功能。例如,大多数芯片都提供了对矩形填充的硬件加速支持,但不同的芯片实现的方式不同,这时就需要针对不同的芯片类型编写不同的程序来完成填充矩形的函数。图3-8 Framebuffer系统构架(3)Framebuffer驱动的实现机制

对Framebuffer的原理和构架有所了解之后,现在来分析该驱动的具体实现过程。Framebuffer对应的源文件在linux/driver/video目录中,总的抽象设备文件夹为fbcon.c,在这个目录下还有与各种显卡驱动相关的源文件。Framebuffer设备驱动基于如下3个文件:Linux/include/linux/fb.h、Linux/drivers/video/fbmem.c和Linux/drivers/video/xxxfb.c。

其中,fb.h主要定义了一些结构体和宏;fbmem.c实现了设备初始化、卸载和文件操作接口;xxxfb.c为自己添加的设备驱动文件(如structfb_info)实现了入口点函数xxxfb_init;xxxfb_setup。下面分析研究fb.h中定义的一些数据结构。首先,structfb_var_screeninfo描述了图形卡的特性,这通常是由用户设置的,具体定义代码如下:

试读结束[说明:试读内容隐藏了图片]

下载完整电子书


相关推荐

最新文章


© 2020 txtepub下载