Android系统级深入开发——移植与调试(txt+pdf+epub+mobi电子书下载)


发布时间:2020-09-11 21:20:53

点击下载

作者:韩超,梁泉

出版社:电子工业出版社

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

Android系统级深入开发——移植与调试

Android系统级深入开发——移植与调试试读:

前言

Android系统是目前最为流行的手机系统之一,本书作者在推出了全面介绍Android系统的《Android系统原理及开发要点详解》一书,同时出版了繁体版,并将版权成功输出到韩国,韩文版将在2011年7月出版。在本书出版之后,笔者切实感到越来越多的开发人员和企业在关注Android系统的各个方面。

Android系统是开源的,它的一个比较大的优势就是可以移植到各个不同的硬件平台上。“移植”是Android系统的精华所在,也是Android开发中的难点兼重点。

本书《Android系统级深入开发——移植与调试》出版的主要目的是分享开发经验,帮助众多开发者快速地掌握Android系统在不同硬件平台移植的方法。帮助工程师以最快的速度、最小的开销、最轻的工作量,让Android系统高效地运行在更多的硬件上。本书特点

本书紧紧抓住了Android系统移植与调试的主题,从开发者的角度出发,其特点主要包括以下几个方面:

●本书使用的代码以Android的开源工程为主,硬件也是比较常见的设备,保证读者可以很容易地获得开发环境。

●根据Android系统自身的固有特点,从Linux内核中的驱动和硬件抽象层两个着手点作为切入点。

●按照Linux的开发思路,从驱动程序的角度出发,让具有Linux开发经验的工程师,可以更快地熟悉主要用于移动设备开发的Android系统。

●从模拟器、高通的MSM平台、德州仪器的OMAP平台这三种硬件平台出发,全面介绍,不以偏概全,既把握共同点,也突出差异。

●对于Android中规模和难度各不相同的子系统,抓住它们和硬件相关的共同点,采取同样的格式和思路进行介绍,体现了“从特殊到一般”的理念。

●简要介绍各个子系统的框架,并列出代码路径,对移植部分的主要调用部分加强提示,让读者更全面地把握系统。本书内容

本书分成24章,各章的内容如下所示:本书读者

本书适合不同类型的读者群,不同类型的读者在学习的时候需要使用不同的方法。作者的建议如下:

●对于熟悉Linux内核但不熟悉Android的开发者,应该以驱动程序作为切入点,通过硬件抽象层的实现,将Linux的各个驱动程序应用到Android系统中。

●对于熟悉Android系统但不熟悉Linux内核的开发者,向下了解Linux内核,这样既可以更深入地了解Android系统的运作方式,又可以拓展自己的技术领域。

●对于经验较多,希望深入研究Android系统的开发者,应该更关注开发的细节,了解移植中调试的要点。本书作者

本书的规划和统筹由中国大陆的韩超完成,韩超常年工作在Linux和Android的开发一线,兼具产品和理论经验。本书内容来源于工作在不同领域Android和Linux开发者多年的经验。韩超和梁泉完成了本书内容的主要部分,众多不同规模的企业开发成果也为本书的编写提供了重要的素材。参与本书编写的还有崔海斌、于仕林、张宇、张超、赵家维、黄亮、沈桢、徐威特、杨钰、马若劼、曹道刚等。广大社区开发者也对本书的成稿作出了贡献。第1章Android系统移植开发概述1.1Android系统架构和生态系统1.1.1 Android软件系统

Android是一个包括操作系统、中间件和关键应用的移动设备软件堆。Android是目前最流行的手机开发平台,依靠Google的强大开发和媒体资源,Android成为众多手机厂商竞相追逐的对象。

Android系统在推出后,逐渐完善和增加功能。从最初的版本发布后,又陆续发布了Cupcake, Donut, Eclair, Froyo等版本,发布的时候使用Android 1.5、Android 2.0等版本号标示,后面版本对前面的版本兼容,如表1-1所示。每一个版本具有不同的API级别,目前Android的API基本从2到8,这个API级别通常是指Android平台的Java层的API的接口。表1-1 Android版本的升级

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

●第1层:Linux操作系统及驱动

●第2层:本地代码框架和Java虚拟机

●第3层:Java框架

●第4层:Java应用程序

Android的第1层由C语言实现,第2层由C和/C++实现,第3、4层主要由Java代码实现。

第1层和第2层之间,从Linux操作系统的角度来看,是内核空间与用户空间的分界线。

第2层和第3层之间,是本地代码层和Java代码层的接口。

第3层和第4层之间,是Android的系统API的接口。

由于Android系统需要支持Java代码的运行,这部分内容是Android的运行环境(Runtime),由虚拟机和Java基本类组成。这部分内容通常也可以认为是第2层的一个部分。

第1层次运行于内核空间,第2、3、4层运行于用户空间。提示:通常情况下,可以将第1层视为Android的Linux内核,将第2、3、4层视为Android系统。

Android几个层次的功能如下所示:

●Android的操作系统

使用Linux 2.6内核,包括安全性、内存管理、进程管理、网络协议栈和驱动模型。Linux内核也同时作为硬件和软件系统之间的抽象层。

●Android本地库

包含一些C/C++库,这些库可以被Android系统中不同的组件使用,它们通过Android应用程序框架为开发者提供服务。

●Android运行环境

为Java的运行环境,提供了Java编程语言核心库的大多数功能,由Dalvik Java虚拟机和基础的Java类库组成。Dalvik是Android中使用的Java虚拟机,Dalvik被设计成一个可以同时高效地运行多个虚拟机实例的虚拟系统。

●Android应用程序框架

包含了4种基本的组件(活动、服务、广播接收器、内容提供者),丰富的控件(在Android中称为视图),内容提供器,资源管理器,通知管理器,活动管理器等。

●Android应用程序

一般由Java语言编写,核心应用程序和系统一起发布,包括:桌面、电话、短信息、E-mail、日历、浏览器、联系人管理程序等。1.1.2 Android的生态系统

基于Android软件系统,各个厂商可以实现自己的产品,由于Android具有成熟、完整的软件系统,各个厂商可以缩短自己的产品开发周期。

同时,Android的应用程序开发者,可以基于Android的平台API来开发软件,Android的平台API是Java接口,与具体的硬件无关,甚至可以在没有硬件的情况下在仿真器环境中完成。

各个厂商生产产品和Android的软件开发者是相互促进的过程:众多的Android软件可以让Android的各个设备具有更多的功能;不同厂商制造的各种设备可以让Android软件具有更多的运行载体。

在众多的Android产品和Android软件的开发过程中,Google可以提供自己的服务,例如Gtalk, Gmail, Google Search等,既促进Android平台的发展,也让自己的业务拓展到各个基于Android的移动设备和其他产品。

OHA(Open Handset Alliance,开放手机联盟)是Google与33家公司联手为Android移动平台系统的发展而组建的一个组织。

Google的Android系统是一个完全开放的系统,也是一个完整的生态系统,它分成了3个有机的组成部分:

●Android源代码工程(Android Open Source Project)网址:http://source.android.com/

●Android开发者(Android Developer)网址:http://developer.android.com/

●Android市场(Android Market)网址:http://www.android.com/market/

Android的生态系统如图1-2所示。图1-2 Android的生态系统1.2Android移植的概念和方法

在各个厂商开发基于Android系统的产品的时候,虽然有的时候也需要修改Android的框架,但是移植是其中的主要工作。

Android系统本身是一个庞大的系统,移植并不需要精通Android的每一个部分,需要考虑的是Android系统的硬件抽象层(HAL)和Linux中的相关设备驱动程序。如图1-3所示。图1-3 Android移植的概念

基于Android系统的手机,有官方的G1、Hero和Nexus One等,其他的手机厂商也推出了几款Android手机。这些手机所使用的处理器和各种外围硬件各不相同,但是其使用的大部分Android系统的软件都是相同的(包括本地框架、虚拟机、Java框架和Java应用等部分)。

移植的目的就是为了改动较小的内容,支撑较为庞大上层的系统。同时由于硬件抽象层具有标准的接口,在各个不同的平台的实现中可以互相参考,虽然具体实现的内容不同,但是思路类似,可以相互参考。1.3Android移植的主要工作

Android系统的移植工作的目的是为了在特定的硬件上运行Android系统。在移植的过程中,把握关键要点,减少工作量是一个重要的方面。从工作的角度,通常的方法为,首先要熟悉硬件抽象层的接口,其次要集成和复用已有的驱动程序,主要的工作量在硬件抽象层的实现中。为了更好地理解和调试系统,也应该适当地了解上层对硬件抽象层的调用情况。

移植方面主要的工作有两个部分:

●Linux驱动

●Android系统硬件抽象层

Linux中的驱动工作在内核空间,Android系统硬件抽象层工作在用户空间,有了这两个部分的结合,就可以让庞大的Android系统运行在特定的硬件平台上。

Android移植的主要工作如图1-4所示。图1-4 Android移植的主要工作

在具有了特定的硬件系统之后,通常在Linux中需要实现其驱动程序,这些驱动程序通常是Linux的标准驱动程序,在Android平台和其他Linux平台基本上是相同的。主要的实现方面是Android系统中的硬件抽象层(Hardware Abstract Layer),硬件抽象层对下调用Linux中的驱动程序,对上提供接口,以供Android系统的其他部分(通常为Android本地框架层)调用。提示:Android硬件抽象层的接口是本地移植层的接口,不属于标准API,不具有向前或者向后兼容性。

在Android系统需要移植的内容,主要包含了以下的各个部分:

●显示部分(Display)包括framebuffer驱动+Gralloc模块(可选择是否实现)

●用户输入部分(Input)包括Event驱动+EventHub(Android标准内容)

●多媒体编解码(Codec)包括硬件Codec驱动+Codec插件(如OpenMax)

●3D加速器部分(3D Accelerator)包括硬件OpenGL驱动+OpenGL插件

●音频部分(Audio)包括Audio驱动+Audio硬件抽象层

●视频输出部分(Video Out)包括视频显示驱动+Overlay硬件抽象层

●摄像头部分(Camera)包括Camera驱动(通常是v412)+Camera硬件抽象层

●电话部分(Phone)Modem驱动程序+RIL库

●全球定位系统部分(GPS)包括GPS驱动(通常为串口)+GPS硬件抽象层

●无线局域网部分(WIFI)包括Wlan驱动和协议+WIFI的适配层(Android标准内容)

●蓝牙部分(Blue Tooth)包括BT驱动和协议+BT的适配层(Android标准内容)

●传感器部分(Sensor)包括Sensor驱动+Sensor硬件抽象层

●震动器部分(Vibrator)包括Vibrator驱动+Vibrator硬件抽象层(Android标准内容)

●背光和指示灯部分(Light)包括LED驱动+Light硬件抽象层

●警告器—实时时钟部分(Alarm & RTC)包括Alarm驱动和RTC系统+用户空间调用(Android标准内容)

●电池部分(Battery)包括Power Supply驱动+电池的硬件抽象层(Android标准内容)

Android中具有很多组件,但并不是每一个部件都需要移植,对于一些纯软的组件,就没有移植的必要。对于一些部件,例如浏览器引擎,虽然需要下层网络的支持,但是并非直接为其移植网络接口,而是通过无线局域网或者电话系统数据连接来完成标准的网络接口。

Android的移植主要可以分成几个类型:基本图形用户界面(GUI)部分,包括显示部分和用户输入部分;和硬件相关的加速部分,包括媒体编解码和OpenGL;音视频输入输出环节,包括音频,视频输出和摄像头部分;连接部分,包括无线局域网,蓝牙,GPS;电话部分;附属部件:包括传感器、背光、振动器等。

除了以上的移植方面,电源管理也是非常重要的一个方面,它和Android的各个子系统都有关系。

Android系统主要需要移植部件如图1-5所示。图1-5 Android系统主要需要移植部件

对于大部分子系统,硬件抽象层和驱动程序都需要根据实际系统的情况实现,例如:传感器部分、音频部分、视频部分、摄像头部分、电话部分。也有一些子系统,硬件抽象层是标准的,只需要实现Linux内核中的驱动程序即可,例如:输入部分、振动器部分、无线局域网部分、蓝牙部分等。对于有标准的硬件抽象层的系统,有的时候通常也需要做一些配置工作。

时至今日,随着Android系统的发展,它已经不仅仅是一个移动设备的平台,也可以用于消费类电子和智能家电,例如:上网本、电子书、数字电视、机顶盒、固定电话等。在这些平台上,通常需要实现比移动设备更少的部件。一般来说,基本用户界面部分(包括显示和用户输入)是需要移植的,其他部分是可选的。例如:电话系统、振动器、背光、传感器等一般不需要在非移动设备系统来实现;对于一些固定位置设备通常也不需要实现GPS系统。第2章Android源代码和开发环境2.1开发环境和工具

在Linux环境中,开发Android主机环境包括以下需求:git工具,repo工具,Java的JDK,主机编译工具等

在Ubuntu的主机上,通常需要安装以下的包:

在Android 1.6—Android 2.2发布版本中,Android系统推荐使用Java 5来编译系统,如果本机使用的是Java 6,可以将其配制成Java 5。

删除Java 6的方式如下所示:

配置Java的环境的方法如下所示:

将出现命令行选择菜单中,选择Java 5作为使用的Java。同样方法可以配置Javac编译器。

Android系统在编译的过程中,需要编译主机的工具,因此还需要使用主机的GCC工具链。而对于编译目标机文件,Android在prebuilt目录中集成了GCC交叉编译工具链。

repo是对调用git的封装的工具,安装repo的方法如下所示:

在编译内核的过程中,toolchain工具使用的可能不尽相同,需要根据具体的内核来使用工具链。2.2Android的代码库

Android代码库的路径为android.git.kernel.org,这个代码库主要的使用方法是通过repo或者git的方式下载代码。

也可以通过网页浏览Android的代码库内容,基于网页方式访问Android代码库,在浏览器使用这样的路径http://android.git.kernel.org/,浏览的情况如图2-1所示。图2-1 使用http浏览Android代码仓库

上部是获取代码的步骤,下部是工程的列表。获取代码有两种方式,使用repo获取和使用git直接获取。2.3Android系统代码和编译2.3.1 获取Android源代码

获取Android完全的源代码方法包括初始化代码仓库和获取代码两个步骤,每个步骤可以增加不同的参数。

对于Android的代码仓库,初始化代码仓库的一般方法如下所示:

在Linux控制台的命令行中,一般需要在一个新建的目录中执行repo init,其过程将显示一些信息,内容如下所示:

出现以上的内容,说明第一步获取已经完成。不需要用户的控制,过程将继续进行,在控制台中,继续显示的内容如下所示:

最后出现可以输入用户名和E-mail账户。在以上执行的流程中,出现的各个[new tag]和[new branch]的内容可以作为repo init中-b指定的参数。如果没有指定,将使用master分支的最新版本。

repo init之后,在执行的目录中,将生成隐藏目录.repo。这里面的内容是工程管理的信息。

文件manifest.xml为repo工程的描述文件,是一个到.repo/manifests/default.xml文件的连接。这个文件表示repo时包含的各个工程,其片段如下所示:

其中,path表示工程获取后的路径(基于当前目录),name表示工程的名称,也是该工程在服务器上的相对路径。

在repo init的时候,使用-b选项可指定初始化的版本的方法如下所示:

在经过repo init之后,可以使用repo获取Android的全部代码,方法如下所示:

repo sync是主要从服务器上取内容的过程,执行时间将比较长。可以通过repo sync-j5来并行加速。5是并行的线程数,可自行调整。

使用repo sync的时候,也可以同步一个单个工程的内容,需要使用工程的名称作为repo sync的参数,工程的名称可以从manifest.xml获得。

例如,以下的命令表示同步dalvik虚拟机项目:

如果前面已经有过了同步,目前只需要使用sync进行更新的话,使用工程的路径也是可以的。这样的方式更为方便。

例如,在源代码的根目录中,再次同步虚拟机项目(dalvik)的方法可以如下所示:

repo工具实际上是对git的封装。直接使用git clone的方式也可以获取一个工程的代码,方法如下所示:

有些没有包含在repo工程中的代码,还只能使用git clone的方式获取。

repo同时也是一个方便管理众多git库组成的Android工程的好工具。repo start, repo branches, repo prune, repo forall等命令,能够极大地方便开发人员对众多git库的同时管理。2.3.2 Android源代码结构

按照Google网站的描述,Android全部代码的工程分为3个部分。

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

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

●包(Package):提供Android的应用程序、内容提供者、输入法、服务,在package文件夹中。

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

下载完整电子书


相关推荐

最新文章


© 2020 txtepub下载