深入理解Android:Telephony原理剖析与最佳实践(txt+pdf+epub+mobi电子书下载)


发布时间:2020-07-15 12:22:16

点击下载

作者:杨青平

出版社:机械工业出版社

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

深入理解Android:Telephony原理剖析与最佳实践

深入理解Android:Telephony原理剖析与最佳实践试读:

前言

随着ICT技术的推广和发展,在三网融合、智慧的地球(物联网)等概念风行的形势下,手机终端技术的发展和进步可谓日新月异;Android经受住了市场的考验,并占据了较大的市场份额,从手机芯片厂家、手机生产厂家到各种应用开发公司、互联网公司等,逐步形成了以Android系统平台为核心的上下游产业链。正是由于Android源代码的开源,各大手机厂商才能通过深度定制Android系统平台,在降低研发成本的同时,快速推出具有自身特色的Android智能手机产品。因此,各大手机厂家在推出新版本Android系统平台手机上投入了较多的研发成本,其中不乏SamSung、Motorola等国际知名公司;国内如小米手机、联发科、展讯等也都有自己的Android研发团队。

目前国内市场上针对Android的书籍很多,但这些书籍中,绝大多数是基于Android SDK在应用层的开发进行讲解的。针对Android系统级的源代码分析的书籍,主要是邓凡平著的《深入理解Android:卷Ⅰ》和《深入理解Android:卷Ⅱ》,但深入理解Android Telephony的书籍国内目前还是空白。而Telephony基本通信功能是手机中的核心,在定制Android手机的过程中也不例外,手机离开了基本通信能力,如通话、短彩信、手机上网等功能,也就失去了它本身的意义。

在Android手机定制化的过程中,Telephony涉及的范围和内容也非常多,从应用层到框架层,再到RIL与Modem无线通信模块的交互,所有部分均有不同程度的定制和优化,因此,在Android手机平台定制化研发的过程中,需要对Android Telephony有全面而深入的理解。

本书以Android 4.0.3源代码为基础,全面、深入地解析了Android Telephony涉及的主要内容,其中包括Call通话、ServiceState接入网络服务状态、DataConnection手机上网数据连接以及SMS&[1]MMS短信和彩信的应用等,并且详细解析了Android RIL的运行机制。读者对象

本书主要适合于以下读者。(1)Android应用的普通开发者

对于Android应用开发工程师来说,本书中关于发起通话呼叫、接收到新的来电、发送短信、接收新短信、手机上网等Telephony涉及的通信能力的介绍,能帮助他们在编写Android应用程序时,选择最优方式完成多种场景的应用。比如如何发起通话呼叫、如何发送短信、如何监听或接收新来电或新短信的通知等,都是Android应用程序需要处理的消息和事件。(2)Android系统平台的定制开发者

Android Telephony涉及的通信能力,常常是Android系统平台定制化过程中的重点和难点,它的可用性和稳定性决定了手机产品是否能成功量产。本书全面、深入地讲解了Android Telephony涉及的通信能力的实现流程和机制。(3)对Android源代码有浓厚兴趣的读者

Android源代码中汇集了很多国外专家和优秀工程师的设计思想和理念,本书对Android Telephony源代码中的关键设计模式、设计思路做了详细分析,读者可拓展思考和训练,以提升自己的设计水平和编码能力。(4)开设相关课程的大专院校的师生

从搭建Android的编译环境到分析源代码的过程,本书由浅入深地进行了讲解,阅读本书可帮助读者提升Linux操作系统的动手能力、Java语言的编码能力、UML的阅读能力和理解常见的设计模式,了解Android系统平台定制的主要工作内容。[1]RIL即Radio Interface Layer,中文释意为无线通信接口抽象层。如何阅读本书

全书分为5个部分,共13章:

第一部分(第1~3章)首先介绍Android和智能手机的框架结构,帮助读者了解一些手机的发展历程;然后讲解Android源代码的编译环境搭建过程,并普及Android中的一些技术基础。

第二部分(第4~6章)详解Android Telephony通话功能。首先整体认识通话功能在整个Android系统平台所处的位置,及每层的主要作用;然后分析通话的关键流程,主要体现在主动拨号流程和来电流程的过程分析;最后解析通话功能在应用层和框架层中的实现机制和逻辑。

第三部分(第7~9章)详解ServiceState(网络服务状态)、DataConnection(手机上网数据连接)、SMS和MMS的业务实现流程,以及在应用层和框架层中的关键处理逻辑和实现机制。

第四部分(第10~12章)首先讲解Android RIL框架结构和关键业务流程,然后详细解析RILJ、RILC和Reference-RIL的运行机制。

第五部分(第13章)讲解Telephony模块所提供的系统服务,包括系统服务的注册入口以及调用系统服务接口的实例。

如果你是一名Android经验丰富的资深用户,能够快速搭建Android源代码编译环境以及掌握了Android开发的基础知识和技巧,那么可以跳过第一部分,直接阅读后面四部分;但是如果你是一名Android初学者,请一定从第1章的基础理论知识开始学习。勘误和支持

由于笔者的水平有限,加之编写时间仓促,书中难免会出现一些错误或者不准确的地方,恳请读者批评指正。为此,笔者特意创建一个在线支持博客http://blog.163.com/yqp_mail/。您可以将书中的错误或是遇到的任何问题留言给我,我将尽量在线上为读者提供最满意的解答。如果您有更多的宝贵意见,也欢迎发送邮件至邮箱yqp_mail@163.com。期待能够得到大家的真挚反馈。致谢

感谢Android技术专家邓凡平,在你的引荐下才促成了这本书的合作与出版。

感谢机械工业出版社华章公司的编辑杨福川和白宇,在这半年里是你们始终支持着我的写作,因为有了你们的鼓励和帮助我才能顺利完成全部书稿。[1]

感谢ThunderSoft中科创达公司,这是一家创业型、学习型和成长型的软件公司。在这里工作,有机会与Android亲密接触,能够在Android涉及的各个方面不断学习、总结和分享;感谢ThunderSoft成都分公司领导常衡生先生和曾俊汉先生的鼓励和支持,因为有了你们的帮助,我才能有更多的时间和精力去完成全部书稿的写作;感谢ThunderSoft公司的同事刘斌、任洪亮等人在本书的写作过程中给予的大力支持。

感谢我的妻子,在本书的写作过程中,我几乎放弃了所有晚上和周末的休息时间,妻子给了我极大的关心和体贴,让我无后顾之忧,专注写作。

最后感谢我的爸爸、妈妈,你们将我培养成人,从小学、初中、高中到大学,乃至到我工作后,你们都时时刻刻关心和帮助着我,在本书的写作过程中你们同样给了我极大的关心和帮助。

谨以此书献给我最亲爱的家人,以及众多热爱Android的朋友们!杨青平于成都[1]ThunderSoft中科创达,提供Android核心技术和整体解决方案的软件公司,公司主页http://www.thundersoft.com。第一部分 基础篇 

第1章 初识Android

第2章 搭建Android源代码编译环境

第3章 主要技术准备第1章初识Android

Android中文意思为“机器人”,中文翻译为“安卓”,是Google于2007年11月5日发布的基于Linux平台的开源手机操作系统的名称。该平台由操作系统、中间件、用户界面和应用软件组成,被称为首个为移动终端打造的真正开放和完整的移动软件。Google与电信运营商、手机设备制造商、芯片开发商以及其他有关方面结成深层次的合作伙伴关系,希望借助建立标准化、开放式的移动电话软件平台,在移动产业内形成一个开放式的生态系统。

从2007年到现在,Android已经成为全球最热门的手机操作平台之一。本章主要从智能手机的基本硬件结构、Android手机操作系统整体架构和Android的Telephony模块的体系结构这三个方面介绍Android,特别将Android手机操作系统平台下的Telephony模块作为本书讲解的重点内容。1.1 智能手机的系统结构

Android手机的基本硬件结构是符合智能手机的基本硬件结构,我们要学习Android移动开发,首先需要了解智能手机的硬件系统基本结构。

随着通信领域的快速发展,移动终端发展和变化也非常巨大,已经由原来单一的通话、短信功能向彩信、数据上网、图像处理、音乐和多媒体方向综合演变。目前,市面上的移动手机基本上可以分成两大类:一类是功能手机(Feature Phone),另一类是智能手机(Smart Phone)。

这两类手机是如何区分的呢?智能手机具有传统手机的基本功能,如电话、短信、照相等功能,同时具有开放的操作系统、硬件和软件的可扩充性,并且支持第三方的二次开发。相对于功能手机,智能手机就像计算机一样,可通过安装第三方软件来扩展其功能和应用,因此,智能手机越来越受到人们的青睐,成为手机终端市场的一种潮流。

智能手机采用的硬件基本结构如图1-1所示。图 1-1 智能手机的硬件结构

智能手机的硬件基本结构大多采用双处理器架构:主处理器和从处理器。主处理器运行开放式操作系统以及操作系统之上的各种应用,负责整个系统的控制;从处理器负责基本无线通信,主要包括DBB(Digital Baseband,数字基带芯片)和ABB(Analog Baseband,模拟基带),完成语音信号和数字语音信号调制解调、信道编码解码和无线Modem控制。

主处理器也叫AP(Application Processor,应用处理器),从处理器也叫BP(Baseband Processor,基带处理器),它们之间通过串口、总线或USB等方式进行通信,不同手机芯片生产集成厂家采用的集成方式都不一样,目前市面上仍以串口通信为主。

不难发现,在智能手机的基本硬件结构中,BP部分只要再加一定的外围电路,如音频芯片、LCD控制、摄像机控制器、扬声器、天线等,就是一个完整的智能手机的硬件结构。

注意 现在我们能区分功能手机与智能手机吗?回顾手机终端的发展历程,不难发现这样一条规律:随着手机芯片处理能力的提升、上网能力的扩展和发展(蓝牙、Wi-Fi、3G网络),手机应用得到了非常迅速的扩大和发展。在智能手机的硬件设计上,应采用处理能力比较强大的处理器作为AP,用以支持开放手机操作系统及操作系统之上的扩展应用,由此可见智能手机的发展趋势和方向。1.2 Android系统架构

前面学习了智能手机的基本硬件结构,可以通过功能手机与智能手机的特点和区别从本质上认识它们。Android智能手机操作系统作为运行在AP上的开源智能手机操作系统,其系统架构是什么样的呢?我们先看看图1-2。图 1-2 Android系统架构

通过图1-2不难发现,Android手机操作系统是一个基于Linux Kernel的分层智能手机操作系统,其共分为4层,从上到下分别是Java Applications(应用层)、Java Frameworks(应用框架层)、User Libraries(系统运行库层)和Linux Kernel(核心层),下面将对这4层进行简要的分析和介绍。1.2.1 应用层

Android近几年的发展可谓迅猛,之所以会出现这样的情况,一个很重要的原因就是它的应用非常多。安卓市场已发布的软件个数和软件下载量目前仅次于苹果的应用商店,并且保持着快速增长的态势。这些第三方发布的应用(如游戏、导航、播放器、桌面主题等)日益丰富,终端用户才能不断地发展和壮大,而这些应用均在应用层运行。

应用层包括了Android各种应用程序,这些应用程序使用Java语言开发并运行在Dalvik虚拟机上,在Android系统架构中的第一层。在Android源码和SDK(Software Development Kit,软件开发工具包)中,Google已经捆绑和发布了一些核心应用及源代码,如Dialer、MMS、日历、Google地图、浏览器、联系人等。1.2.2 应用框架层

如图1-2所示,Android系统框架中的第二层是框架层,它是用Java语言实现和开发的。有了框架层,开发者使用框架层提供的API便可以非常方便地访问设备硬件、获取位置信息、向状态栏添加通知消息、设置闹铃等,而不必关心底层具体的实现机制和硬件实现方式。这样,简化了Android应用程序开发的架构设计,从而开发者能够快速开发新的应用程序。

应用框架层是Google发布的核心应用所使用的API框架,开发人员可以使用这些框架提供的API来快速开发自己的应用程序,下面是Android中一些主要的组件的简单介绍及相关说明。

❑Views(视图):在Android SDK中介绍了非常丰富的Views使用方法及相关属性,所有的Android应用程序由这些Views构成,主要包括了列表(Lists)、网格(Grids)、文本框(Text)、按钮(Buttons)等基础Android应用的界面控件。

❑Resource Manager(资源管理器):提供非代码资源转换和访问,如本地字符串(XML文件配置)、图片和布局文件(Layout Files,使用XML文件配置)。

❑Notification Manager(通知管理器):应用可以在状态栏中显示自定义的提示信息,如新短信通知、未接来电通知、手机信号量通知等。

❑Activity Manager(Activity管理器):用来管理Android应用程序界面的生命周期(onCreate创建、onResume显示、onPause暂停、onStop停止等),一个手机屏幕界面可对应一个Activity。1.2.3 系统运行库层

如图1-2所示,Android系统架构中的第三层为系统运行库层,这一层主要包含了手机系统平台必须的C/C++核心库、Dalvik虚拟机运行环境和HAL子层。我们跳过HAL,先简单地介绍和分析Android包含的C/C++核心库和Dalvik虚拟机运行环境。

1.C/C++核心库

系统运行库层包含一个C/C++库的集合,当使用应用框架的一些接口时,系统运行库层通过C/C++核心库来支持对应的组件使用,使其能更好地为Android应用开发者服务。下面是一些主要的核心C/C++库及其简要说明。

❑libc(系统C库):C语言标准库,处于系统最底层的系统库,由Linux系统来调用。

❑Media Frameworks(多媒体库):Android系统多媒体库,支持当前手机平台上主流的音频和视频格式的播放和录制,以及静态图像,如MPEG-4、MP3、AAC、JPG、PNG等多媒体格式。

❑SGL:2D图形引擎库。

❑OpenGL:对3D效果的支持。

❑SQLite:轻量级关系数据库引擎,可用来增、删、改、查通话记录、联系人等信息内容。

❑WebKit:新式的Web浏览器引擎,支持当前非常流行的HTML 5。

❑SSL:基于TCP/IP网络协议,为数据安全通信提供支持。

2.Dalvik虚拟机运行环境

系统运行库层包含了Android Runtime,其核心为Dalvik虚拟机。每一个Android应用程序都运行在Dalvik虚拟机之上,且每一个应用程序都有自己独立运行的进程空间;Dalvik虚拟机只执行DEX(Dalvik Executable)可执行文件。

DEX格式是专为Dalvik设计的一种压缩格式,适用于内存和处理器速度有限的系统;要生成DEX格式文件,首先要通过Java程序编译生成class文件,然后通过Android提供的dx工具将class文件格式转换成DEX格式。

Dalvik虚拟机的特性总结如下:

❑每个Android应用运行在一个Dalvik虚拟机实例中,而每一个虚拟机实例都是一个独立的进程空间;

❑虚拟机的线程机制、内存分配和管理、Mutex(进程同步)等的实现都依赖底层Linux操作系统;

❑所有Android应用的线程都对应一个Linux线程,因而虚拟机可以更多地使用Linux操作系统的线程调度和管理机制。

注意 因为Android的编程语言是Java语言,所以我们容易将Dalvik虚拟机与Java虚拟机认为是同一个东西。Dalvik虚拟机并不是按照Java虚拟机的规范来实现的,两者并不兼容;它们之间最大的不同在于:Java虚拟机运行的是Java字节码,而Dalvik虚拟机运行的是其专有的DEX格式的文件。1.2.4 核心层

Android 4.0基于Linux Kernel 3.0.8提供核心系统服务,例如文件管理、内存管理、进程管理、网络堆栈、驱动模型等操作系统的基本服务能力。核心层内核同时也作为硬件和软件之间的抽象层,需要一些与移动设备相关的驱动程序支持,主要的驱动如下所示。

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

❑Keyboard Driver(键盘驱动):输入设备的Key键盘驱动,比如Home待机、Menu菜单、Return返回、Power电源等设备按键。

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

❑Power Management(电源管理):比如电池电量、充电、屏幕开启关闭等管理。

❑Binder IPC驱动:Android平台上一个特殊驱动程序,具有单独设备访问节点,用来提供IPC进程间通信的功能。

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

❑Wi-Fi Driver(Wi-Fi驱动):基于IEEE 802.11标准的Wi-Fi驱动程序。

❑Camera Driver(照相机驱动):常用的基于Linux的照相机驱动。1.3 Android Telephony框架结构

前面对Android手机操作系统整体框架结构及每一层进行了简单的分析和说明,相信大家对Android智能手机操作系统有了一些基本的了解和认识。结合前面Android的系统整体框架,我们接着学习Android Telephony涉及的框架结构,如图1-3所示。图 1-3 Android Telephony框架结构

通过图1-3所示不难发现Android Telephony框架结构的一些规律,总结如下。

❑Android Telephony的业务应用跨越了AP和BP。AP与BP相互通信,符合前面介绍的智能手机硬件基本结构。

❑Android系统在AP上运行,而Telephony运行在Linux Kernel之上的User Space空间。

❑Android Telephony也采用了分层结构的设计,共跨越了三层Java Applications、JavaFrameworks和User Libraries层,与Android操作系统整体分层结构保持一致。

❑Android Telephony从上到下共分三层:Telephony应用、Telephony框架、RIL(RadioInterface Layer,无线通信接口层,主要位于User Libraries层中的HAL层,接下来详细介绍HAL)。

❑BP SoftWare在BP上运行,主要负责实际的无线通信能力处理,不在本书讨论的范围。1.3.1 系统运行库层的HAL层

HAL(Hardware Abstraction Layer,硬件抽象层)在Linux和Windows操作系统平台下有不同的实现方式。

Windows下的HAL位于操作系统的最底层,它直接操作物理硬件设备,使用抽象接口来隔离不同硬件的具体实现,为上层的操作系统和设备驱动程序提供一个统一接口,起到对硬件的抽象作用。这样更换硬件时,编写硬件的驱动只要实现符合HAL定义的标准接口即可,而上层应用并不会受到影响,不必关心具体来实现的是什么硬件。

Linux下的HAL与Windows下的HAL不太一样,HAL并不是位于操作系统的最底层直接操作硬件,相反,它位于操作系统核心层和驱动程序之上,是一个运行在User Space用户空间中的服务程序。1.3.2 简析HAL结构

通过前面的学习,我们知道Android是基于Linux Kernel的开源智能手机操作系统,所以在这里重点介绍Linux下的HAL,就不单独介绍Windows下的HAL结构了。

要想知道HAL结构,先看看来自于HAL 0.4.0 Specification的框架图吧,如图1-4所示(引用自http://people.redhat.com/davidz/hal-spec/hal-spec.html)。图 1-4 HAL 0.4.0 Specification框架结构

HAL是一个位于操作系统和驱动程序之上,运行在用户空间中的服务程序。其目的是为上层应用提供一个统一的查询硬件设备的接口。我们都知道,抽象就是为了隔离变化,那么这里的HAL可以带给我们什么?首先,有了HAL接口,可以提前开始应用的开发,而不必关心具体实现的是什么硬件;其次,硬件厂家如果需要更改硬件设备,只要按照HAL接口规范和标准提供对应的硬件驱动,而不需要改变应用;最后,HAL简化了应用程序查询硬件的逻辑,把这一部分的复杂性转移给HAL统一处理,这样当一些应用程序使用HAL时,可以把对不同硬件的实际操作的复杂性也交给不同硬件厂家提供的库函数来处理。

总之,HAL所谓的抽象并不提供对硬件的实际操作,对硬件的操作仍然由具体的驱动程序来完成。1.3.3 Android为什么引入HAL

HAL的一些优势在前面章节已经提到,这里回顾一下。Android引入HAL不仅因为其自身的优势,而且还有一个非常重要的原因,就是为了保障在Android平台基于Linux开发的硬件驱动和应用程序不必遵循GPL(General Public License)许可而保持封闭,这保障了更多厂家的利益。我们都知道,Linux Kernel是开源的而且遵循GPL许可证,根据GPL许可证规定,对源码的任何修改都必须向社会开源。

那么Android是如何做到的呢?Linux Kernel和Android的许可证不一样,Linux Kernel是GPL许可证,Android是ASL(Apache Software License)许可证。ASL许可证规定,可以随意使用源码,不必开源,所以建立在Android之上的硬件驱动和应用程序都可以保持封闭。也就是说,只要把关键的驱动处理相关的主要逻辑转移到Android平台内,在Linux Kernel中仅保留基础的通信功能,即使开源一部分代码,对厂家来讲也不会有什么损失。

Google选择了这样做,并且特意修改Kernel,原本应该包括在Linux Kernel中的某些驱动关键处理逻辑,被转移到了HAL层之中而达到了不必开源的目的。

注意 本书不再对GPL和ASL或其他的开源许可证深入探讨,有兴趣的读者可以自行上网搜索相关详细资料。1.3.4 Android中HAL的运行结构

由图1-2所示可以知道,Android源码中已经实现了一部分HAL,包括Wi-Fi、GPS、RIL、Sensor等,这些代码主要储存于以下目录:

❑Android_src/hardware/libhardware_legacy:老式HAL结构,采用直接调用so动态链接库方式;

❑Android_src/hardware/libhardware:新式HAL结构,采用Stub代理方式调用;

❑Android_src/hardware/ril:RIL(Radio Interface Layer,无线通信接口层),作为本书重点关注和学习的内容,后面将以独立章节详细讲解。

在Android中,HAL的运行机制是什么样的呢?它有两种运行机制,老式HAL和新式HAL,如图1-5所示。图 1-5 Android中HAL两种运行结构

从图1-5中不难看出,左边是老的HAL结构,应用或框架通过so动态链接库调用而达到对硬件驱动的访问。在so动态链接库里,实现了对驱动的访问逻辑处理。我们重点学习和理解HAL Stub方式,RIL也采用了此方式的设计思想。

HAL Stub是一种Proxy代理概念,Stub虽然仍是以*.so的形式存在,但HAL已经将*.so的具体实现隐藏了起来。Stub向HAL提供operations方法,Runtime通过Stub提供的so获取它的operations方法,并告知Runtime的callback方法。这样Runtime和Stub都有对方调用的方法,一个应用的请求通过Runtime调用Stub的operations方法,而Stub响应operations方法并完成后,再调用Runtime的callback方法进行返回。这里可能有一点绕,根据前面的描述再结合图1-6所示会更容易理解。图 1-6 HAL Stub结构

上层通过HAL提供的functions调用底层硬件,而底层硬件处理完成上层请求后或硬件状态发生变化后,HAL层通过Runtime提供的callback接口回调上层应用。

HAL Stub有一种包含关系,即HAL里包含了很多的Stub。Runtime只要说明请求类型,就可以取得并操作Stub对应的operations。其实现主要在hardware.c和hardware.h文件中,实质也是通过dlopen方法加载.so动态链接库,从而呼叫*.so里的符号(symbol)实现。1.4 本章小结

还记得智能手机基本硬件中的AP和BP主从处理器结构吗?基于Android平台的手机也符合智能手机的体系结构。Android是基于Linux Kernel运行在AP上的智能手机操作系统,同时也是一个分层的操作系统,其从上到下主要分为4层;在AP上运行的Telephony相关应用与Android整体分层结构保持一致,每层中的Telephony相关内容都是本书重点讲述的对象。

Android手机中的基本通信能力跨越了AP和BP。AP和BP的相互协作完成了基本的通信功能。AP上的各种Telephony应用,通过丰富的界面展示了通信相关的各种形式和状态,也可通过界面向BP发起通信能力相关的控制,且由BP负责实施具体的通信操作。

这里提出一个问题,请读者结合本章内容思考:Android Telephony在整个Android智能手机平台中处于什么位置?HAL是什么?通过本章的学习,你清楚了吗?第2章搭建Android源代码编译环境

第1章介绍了Android以及其Telephony功能模块的基本结构,在本章中将带着读者去搭建Android编译环境。即使你已经能够在自己计算机上成功编译Android源代码了,也希望你能阅读本章内容,因为本章不乏一些技巧的总结和Android相关实用工具使用方法的介绍。

Android的编译环境作为深入学习Android的基础,不可缺失,能够成功下载Android源代码并编译成功,对深入学习Android是非常关键和重要的一步;Android环境搭建比较烦琐和枯燥,花费时间长,包括Ubuntu 10.10操作系统安装;所需编译工具包的下载、更新和安装;JDK、Android SDK下载、配置以及关键工具的使用;Android 4.0源代码的下载和编译,以及相关工具的使用等。如果其中有一步未完成或有所偏差,都可能导致Android源代码不能编译通过。

注意 Android源代码编译环境在深入学习Android过程中非常关键和重要,为什么这么说呢?因为有了这样的环境,可以尝试去修改源代码并在虚拟设备上调试、运行,并查看修改源代码后的效果,特别是在没有手机开发板或工程手机的条件下,所以这对学习Android Telephony非常关键和重要。

因此本章力求做到直观和简洁,关键步骤均有截图或说明,并且每步操作均做了严格验证,只要读者按照本书步骤操作,都能成功搭建起自己的本地编译、开发、学习Android的Linux环境。2.1 Ubuntu Linux操作系统及工具安装

要搭建Android的编译环境,首先要选择好使用什么操作系统。本书选择Ubuntu 10.10桌面版64位Linux操作系统作为编译Android源码的操作系统。

注意 为什么选择使用64位Ubuntu 10.10桌面版的操作系统呢?在搭建Android源代码编译环境的过程中通过对比Ubuntu 10版本和11版本,发现Ubuntu 10更加简单,比如在Ubuntu 11.10采用的GCC和G++4.6版本,需要回退到4.4版本,否则会出现编译错误,无法通过编译;另外Ubuntu 10.10的桌面环境采用GNOME 2桌面环境,而Ubuntu 11.10桌面环境采用较新的Unity,在两个版本的使用过程中,笔者认为GNOME 2桌面环境使用时要稳定和方便一些。读者也可以选择自己喜欢的Ubuntu的其他版本。2.1.1 PC配置建议

建议采用的PC配置如下。

❑CPU类型:第二代智能英特尔酷睿i5处理器或i7处理器。

❑内存:4GB或8GB容量DDR3内存。

❑硬盘容量:500GB或1TB。2.1.2 Ubuntu安装光盘的制作

首先下载Ubuntu安装镜像文件,下载地址为http://releases.ubuntu.com/,进入此网站后发现有如下Ubuntu版本:

❑Ubuntu 12.04 LTS(Precise Pangolin)

❑Ubuntu 11.10(Oneiric Ocelot)

❑Ubuntu 11.04(Natty Narwhal)

❑Ubuntu 10.10(Maverick Meerkat)

❑Ubuntu 10.04.4 LTS(Lucid Lynx)

❑Ubuntu 8.04.4 LTS(Hardy Heron)

本书选用的是64位Ubuntu 10.10桌面版操作系统,故选择下载ubuntu-10.10-desktop-amd64.iso镜像文件,然后使用一些刻录软件工具将ISO镜像文件刻录到光盘上,系统安装光盘即制作完成了。

注意 如果没有刻录光盘的条件,可以采用制作USB系统启动盘的方式。目前大多数计算机支持USB引导系统,加上目前USB闪存容量大、价格相对较低,可选择1GB或以上容量的U盘,使用UltraISO即可制作系统安装启动盘。具体的方法可上网搜索制作U盘安装盘详情。2.1.3 Ubuntu安装过程

Ubuntu安装盘制作完成后,就可以开始安装Ubuntu操作系统了。没有使用过Linux的读者也不必担心,Ubuntu操作系统的安装和使用绝大部分采用图形化界面并支持中文,非常便于使用。下面开始Ubuntu操作系统的安装。

将前期制作的光盘或USB系统安装盘放入计算机光驱或插入USB接口,启动PC并按F12键选择引导计算机的方式。这里选择从光驱或U盘引导系统,然后进入Ubuntu 10.10的系统安装欢迎界面,如图2-1所示。图 2-1 Ubuntu安装欢迎界面

系统安装欢迎界面非常友好,选择语言中文简体,其安装过程与Windows相似,均采用图形化安装向导形式。此处选择安装Ubuntu,进入下一步,会提示安装Ubuntu需要两个必要的条件:一是至少有2.6GB的磁盘空间,二是笔记本电脑需要插入电源方式供电。满足这两个条件,不必接入网络,继续进入下一步。

这一步非常关键,为对磁盘的分区,涉及如何分配磁盘空间。这里建议手工划分磁盘空间大小,划分3个Ubuntu操作系统必备的磁盘空间即可,如图2-2所示。图 2-2 磁盘空间大小为40GB的分区样例

3个磁盘分区分别是:

❑/根目录挂载分区:不论磁盘大小,一般使用10GB即可,本例中分配15GB磁盘空间大小。

❑swap交换分区:根据经验来讲,交换分区以内存大小乘以2为最佳,本例中分配2GB磁盘空间大小。

❑/home用户数据挂载分区:目前PC市场上硬盘都较大,500GB已成为基本配置,而/home用户数据挂载分区用于保存用户数据,在Android编译环境中,源代码的保存和编译都在此空间中进行,需要较大空间,所以将剩余的磁盘空间都分配到此挂载分区。

分区完成后,进入下一步,选择地区和时区,选择“亚洲”和“上海”;再进入下一步,选择键盘布局,使用默认的USA键盘布局;然后进入计算机基本信息输入安装界面,在这里输入用户名、密码、计算机名等,如图2-3所示。图 2-3 输入计算机基本信息

计算机基本信息输入完成后,进入下一步,到此安装向导已收集完成安装信息,系统安装程序开始安装Ubuntu操作系统。安装过程界面会显示Ubuntu的一些特性,时间在30分钟左右,根据计算机配置运行速度不同时间上下有所浮动,只需耐心等待系统安装完成即可。

Ubuntu操作系统完成安装后,弹出安装完成提示,需要重启计算机,然后就可以进入图形化Ubuntu登录界面了。整个Ubuntu操作系统的安装至此已完成。2.1.4 Ubuntu系统工具包更新升级

前面已经完成了Ubuntu操作系统的安装,现在需要更新和安装Android编译环境需要的系统工具包,其Linux命令为:

sudo apt-get install git-core gnupg flex bison gperf build-essential\

zip curl zlib1g-dev libc6-dev lib32ncurses5-dev ia32-libs\

x11proto-core-dev libx11-dev lib32readline5-dev lib32z-dev\

libgl1-mesa-dev g++-multilib mingw32 tofrodos python-markdown\

libxml2-utils xsltproc

在网络异常或其他异常情况下,这些工具包可能不能完全下载和更新,那就需要在执行完此命令以后,再次执行此命令验证工具包是否完整安装和更新,其运行日志如下:

正在读取状态信息...完成

注意,选取lib32z1-dev而非lib32z-dev

bison已经是最新的版本了。

……

libxml2-utils已经是最新的版本了。

ia32-libs已经是最新的版本了。

升级了0个软件包,新安装了0个软件包,要卸载0个软件包……

说明所有的包没有遗漏,都已经安装完成。如果每个工具包提示均已完成更新和安装,便可进入下一步操作,否则我们要继续执行此命令更新和安装未完成的系统工具包。

注意 至此,还需要创建一个libGL.so.1到libGL.so的链接,其命令为:

sudo ln-s/usr/lib32/mesa/libGL.so.1/usr/lib32/mesa/libGL.so

如果读者的操作系统是其他版本的Ubuntu操作系统,可进入Android官方网站(http://source.android.com/source/initializing.html)参考其他版本Ubuntu操作系统的工具包安装方法。

我们已经完成Ubuntu系统Android源码编译所需的工具包安装和更新,下一步需要安装和配置Java运行环境。2.1.5 Java运行环境JDK安装及配置

安装和配置Java运行环境JDK(Java Development Kit,Java开发工具包),需要先下载JDK的Linux平台安装包,进入http://www.oracle.com/technetwork/java/javasebusiness/downloads/java-archive-downloads-javase6-419409.html,选择Linux平台64位JDK最新版本jdk-6u31-linux-x64.bin,下载并保存到~/tools目录下。

$chmod+x jdk-6u31-linux-x64.bin//增加jdk-6u31-linux-x64.bin的可执行权限

$./jdk-6u31-linux-x64.bin//执行JDK的安装,会在当前目录下新建jdk1.6.0_31目录,安装的文件都会保存到此目录下

解压jdk-6u31-linux-x64.bin安装文件后,接下来配置Java环境变量。

进入home路径下的vi.bashrc中,在此配置文件最后加入Java的一些基本环境配置信息:JAVA_HOME、JRE_HOME、CLASSPATH、PATH,详细代码如下:

export JAVA_HOME=~/tools/jdk1.6.0_31

export JRE_HOME=$JAVA_HOME/jre

export CLASSPATH=$JAVA_HOME/1ib:$JRE_HOME/lib:$CLASSPATH

export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH

Java配置信息完成后,需要使新增的配置信息立即生效,并验证刚配置的Java环境变量是否正确,详细代码如下:

$source.bashrc//立即使.bashrc环境变量的配置信息生效

$java-version//验证Java安装、配置是否成功

java version "1.6.0_31"

Java(TM)SE Runtime Environment(build 1.6.0_31-b04)

Java HotSpot(TM)64-Bit Server VM(build 20.6-b01,mixed mode)2.1.6 Android SDK的下载和配置

前面已经完成Java运行环境的安装和配置,接下来需要安装Android SDK(Software Development Kit,软件开发工具包)。进入http://developer.android.com/sdk/index.html,下载Android SDK安装管理工具包,根据操作系统选择不同平台版本,这里选择Linux版本,下载android-sdk_r16-linux.tgz保存到〜/tools目录下;然后进入〜/tools目录,运行tar-xvf android-sdk_r16-linux.tgz,解压android-sdk_r16-linux.tgz到在当前目录android-sdk-linux下;接着进入android-sdk-linux/tools目录,运行./android,此时会弹出Android SDK Manager运行窗口,如图2-4所示。图 2-4 Android SDK Manager窗口

至此,其实我们仅安装了SDK框架,并未包含具体的SDK内容。接下来通过AndroidSDK Manager下载和安装SDK中对应的工具和具体的Android SDK。这里选择下载和安装Tools和需要的Android SDK版本。

注意 这里列出了 Android已经发布的所有SDK版本,选择安装的Android SDK版本越多,下载和安装的时间就越长,需要的磁盘空间也就越大;本文选择Tools和Android 4.0.3,读者可以根据兴趣和需要选择下载Android其他版本的SDK。

单击“Install”按钮开始下载和安装,下载前会弹出“Package Description&License”对话框,选择Accept and Install,即可正式开始下载和安装。

SDK下载和安装完成后,将Android SDK相关的工具路径加入系统变量中,这样可使我们在命令行中的任何路径下运行和使用Android SDK相关工具。增加platform-tools和tools目录到PATH,详细代码如下:

$vi~/.bashrc

export PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin:\

~/tools/android-sdk-linux/tools:~/tools/android-sdk-linux/platform-tools

$source.bashrc//配置文件的修改即时生效2.1.7 使用Android SDK启动虚拟设备

Android SDK完成安装后,我们该如果使用SDK呢?运行和使用SDK中的虚拟设备是Android SDK最重要的应用之一,使用SDK的虚拟设备首先要增加虚拟设备的配置信息,然后启动虚拟设备,最后可在虚拟设备上模拟操作、使用Android手机。

首先退出之前启动的Android SDK Manager,接着再一次运行android命令,弹出Android SDK Manager窗口,单击Tools→Manage AVDs...菜单,弹出Android SDK and AVD(Android Virtual Device,Android虚拟设备)Manager对话框,单击此对话框右边的“New”按钮,新建Android虚拟设备配置信息,进入创建Android虚拟设备界面,其具体配置项信息可参考图2-5所示。图 2-5 Android AVD配置窗口

输入虚拟设备名称MyFirstDevice,选择SDK的Android 4.0.3版本,修改Built-in屏幕类型,默认“WVGA800”;单击“Create AVD”,开始创建Android虚拟设备;接着会弹出创建虚拟设备信息确认框,确认AVD基本信息没有问题后单击“OK”按钮,这样就成功地创建了Android虚拟设备;创建成功后在Android SDK and AVD Manager对话框可以看到刚创建的MyFirstDevice虚拟设备,可在此界面中新增、修改、删除和启动虚拟设备。

Android虚拟设备创建成功后,接着启动虚拟设备。单击Android SDK and AVDManager对话框右边的“Start”按钮启动虚拟设备;然后弹出启动虚拟设备选项对话框,按照默认选项单击“Launch”开始启动Android虚拟设备:最后弹出虚拟设备界面并开始启动Android虚拟设备,启动虚拟设备需要2分钟左右,需要耐心等待。启动成功后的界面如图2-6所示。图 2-6 成功启动Android AVD界面

虚拟设备界面分为如下几大部分:

❑标题栏,显示“5554:MyFirstDevice”,5554代表虚拟设备的运行端口,MyFirstDevice代表运行的虚拟设备名称;

❑虚拟手机屏幕区域和Android运行显示区域,可通过鼠标在此区域单击对Android进行操作;

❑虚拟按键区域,包括照相机、声音控制(2个)、关机、接听电话、挂断电话、Home、菜单、返回、查找以及上、下、左、右和确认共15个虚拟按键;

❑虚拟全电脑键盘区域。

注意 Android AVD启动成功后,可以用鼠标结合右边的虚拟按键操作虚拟设备,这是不是和我们使用Android手机差不多呢?对Android不熟悉的读者可以在这里熟悉Android的一些基本操作和Android基本功能。2.2 Android源代码下载及编译过程

前面完成了Ubuntu、JDK、Android SDK的安装和配置,接着开始下载和编译Android 4.0源代码,这个过程简单但花费的时间比较长,请读者先有个心理准备。

Android 4.0的代号为Ice Cream Sandwich,简称ICS,中文名称冰淇淋三明治。2.2.1 工作目录设置

本书采用ICS名称的文件夹作为Android 4.0源代码的根目录,在用户根目录下新建代码根目录ICS文件夹,并设置此目录为工作目录,在.bashrc中增加export $workdir=~/ICS。

注意 笔者在Android开发过程中发现,配置工作目录的环境变量有利于提升工作效率,这主要体现在一些Android工具命令、代码路径、编译结果路径等与工作环境变化配合使用会简化操作,读者在使用过程中逐步体味;后续涉及的$workdir是Android 4.0源代码的根目录。2.2.2 源代码下载

Android 4.0源代码本地的目录已经建立,接着就要开始下载代码了,操作及相关说明如下:

/*repo脚本下载(repo脚本是Android项目编写的Python的脚本,用来统一管理Android项目的代码仓库)*/

$sudo curl https://dl-ssl.google.com/dl/googlesource/git-repo/repo>/usr/bin/repo

$chmod+x/usr/bin/repo

//代码下载

cd $workdir//实际进入~/ICS目录

repo init-u https://android.googlesource.com/platform/manifest\

-b android-4.0.3_r1//初始化Android代码仓库,其版本为4.0.3

repo sync/*开始下载代码,这个过程花费的时间很长,国内下载完毕的时间大概在几个小时到十多个小时,视网络情况而定;建议读者在晚上下载,一般来讲,一个晚上基本可以完成下载,即使代码下载中途中断了,也不必担心,repo sync支持续传*/2.2.3 整体编译Android源代码

Android 4.0源代码下载完成后,开始编译源码,详情见如下操作及相关说明:

$cd $workdir

$make

============================================

PLATFORM_VERSION_CODENAME=REL

PLATFORM_VERSION=4.0.3//Android源码版本为4.0.3

TARGET_PRODUCT=full

……

============================================

Checking build tools versions...

……//由于编译过程时间比较长,编译的日志会很大,这里省略了编译日志

//以下是编译成功日志信息,可以看出成功生成了很多IMG镜像文件

Installed file list:out/target/product/generic/installed-files.txt

Target system fs image:out/target/product/generic/obj/PACKAGING/systemimage_intermediates/system.img

Install system fs image:out/target/product/generic/system.img

Target ram disk:out/target/product/generic/ramdisk.img

Target userdata fs image:out/target/product/generic/userdata.img

第一次编译时间较长,大约为3小时,如果计算机处理能力较强,可以使用make-j8增加编译工作进程数从而减少编译时间。编译完成后,进入$workdir/out/target/product/generic,关注此目录下的system.img、ramdisk.img、userdata.img等3个IMG镜像文件以及data、obj、root、system等目录,请读者自己去看看这些目录下究竟生成了一些什么文件。这里重点关注system目录,其主要结构如下:

❑app(应用apk文件,如Phone.apk、Mms.apk等)

❑bin(可执行文件,rild、vold等)

❑etc(系统配置信息)

❑fonts(字体文件)

❑framework(主要保存一些jar包,framework.jar、core.jar等)

❑lib(主要保存一些so动态链接库文件,libril.so、libreference-ril.so等)

❑usr(用户配置信息)

❑xbin(系统的一些可执行文件)

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

下载完整电子书


相关推荐

最新文章


© 2020 txtepub下载