Android Telephony原理解析与开发指南(txt+pdf+epub+mobi电子书下载)


发布时间:2021-02-23 07:25:37

点击下载

作者:杨青平

出版社:人民邮电出版社

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

Android Telephony原理解析与开发指南

Android Telephony原理解析与开发指南试读:

前言

随着智能手机的日益普及,移动互联网正深刻改变着我们的日常生活,iOS和Android两大移动操作系统功不可没。由于Android的开源,各大厂商纷纷通过定制Android系统降低研发成本和周期,从而快速推出智能产品。

Telephony作为Android系统的核心业务,包括接打电话、手机上网、短信、彩信等应用场景,也是终端用户使用最多、最频繁的业务。因此,在定制Android系统的开发过程中,对Telephony业务的定制和修改也非常多,如优化通话界面、过滤骚扰短信和电话,分析短信内容和优化展示关键信息等,既能方便用户操作和使用,提升用户体验,也能增加广告收入。

Android Telephony业务跨度大,涉及多个层之间的交互:应用层、系统框架层、HAL硬件抽象层和BP Modem。理解和掌握Android Telephony业务和技术,方能更好地完成Android系统定制、业务扩展和数据挖掘。

本书主要特点如下。

1. 解析源代码并总结Android Telephony业务模型、设计原理和系统架构

Android的源代码汇集了大量Google工程师的设计思想和理念。本书对Telephony源代码中的关键设计模式、设计原理和实现方式做了详细的分析和总结,可帮助读者拓展思路和加强训练,以提升软件设计水平和编码能力。

本书由浅入深地详细讲解了搭建Android编译环境、分析源代码并推导出Telephony业务模型,可帮助读者提升Ubuntu系统动手能力、Java语言编程能力、Android开发能力、UML阅读能力,理解和掌握常用的设计模式,以及Android系统平台定制的核心工作。

2. 合理、有效的组织

本书以Telephony关键业务流程为主线,分析和总结主要业务、核心实现和业务模型。首先分析和总结Telephony业务模型中Voice Call语音通话、ServiceState网络服务、Data Call移动数据和SMS & MMS的关键业务流程和核心实现机制,然后扩展Telephony Phone、Voice Call、Data Call等关键业务模型,同时输出时序图、类图、状态图等UML图和架构图,以帮助读者理解和掌握Telephony业务。

3. 内容充实、实用并结合实践

本书紧紧围绕Android Telephony关键业务展开,主要包括Voice Call语音通话、ServiceState网络服务、Data Call移动数据和SMS&MMS中需要优化和定制的关键业务,以及Radio Interface Layer(无线通信接口抽象层)的消息处理机制和系统架构。

本书总结的Telephony业务模型可在华为Nexus 6P手机上进行运行和验证,使读者对Telephony业务和实现有更加直观的认识和理解,并掌握调试Android代码的方法和技巧。

尽管作者在写作过程中力求准确、完善,但书中不妥或错误之处仍在所难免,殷切希望广大读者批评指正!恳请读者一旦发现错误,于百忙之中及时与作者联系,以便尽快更正,作者将不胜感激。E-mail:android_tele@163.com。杨青平2018年4月第1章初识Android学习目标

• 学习智能手机基本硬件体系结构。

• 掌握基于Linux Kernel的Android系统分层架构。

• 掌握Telephony在Android系统中的结构。

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

从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控制、摄像机控制器、扬声器、天线等,就是一个完整的普通手机的硬件结构。注意现在我们能区分功能手机与智能手机吗?回顾手机终端的发展历程,不难发现这样一条规律:随着手机芯片处理能力的提升、上网能力的扩展和发展(蓝牙、WiFi、3G网络),手机应用得到非常广泛的扩大和发展。在智能手机的硬件设计上,采用处理能力比较强大的处理器作为AP,来支持开放手机操作系统及操作系统之上的扩展应用,由此可见智能手机发展的趋势和方向。1.2 Android系统架构

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

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

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

应用层包括了各种Android应用程序,这些应用程序是使用Java语言开发,并运行在Dalvik虚拟机上,处于Android系统架构中的第一层。在Android源码和SDK中,谷歌公司已经捆绑和发布了一些核心应用及源代码,如Dialer、MMS、日历、谷歌地图、浏览器、联系人等。1.2.2 应用框架层

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

应用框架层是谷歌公司发布核心应用时所使用的API框架,开发人员可以使用这些框架提供的API来快速开发自己的应用程序。下面是对Android中一些主要的组件的简要总结及相关说明。

• 视图(View)

在Android SDK(Software Development Kit,软件开发工具包)中介绍了其丰富的视图的使用方法及相关属性,所有的Android应用程序都由这些视图构成,主要包括列表(List)、网格(Grid)、文本框(Text)、按钮(Buttons)等基础Android应用的界面控件。

• 资源管理器(Resource Manager)

提供非代码资源转换和访问,如本地字符串(xml文件配置)、图片和布局文件(Layout File,使用xml文件配置)。

• 通知管理器(Notification Manager)

应用可以在状态栏中显示自定义的提示信息,如新短信通知、未接来电通知、手机信号量通知等。

• Activity管理器(Activity Manager)

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

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

1. C/C++核心库

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

• libc(系统C库)

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

• Media Framework(多媒体库)

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可执行文件。

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(Dalvik Executable)文件。1.2.4 核心层

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

• 显示驱动(Display Driver)

基于Linux的帧缓冲驱动。

• 键盘驱动(Keyboard Driver)

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

• 音频驱动(Audio Driver)

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

• 电源管理(Power Management)

如电池电量、充电、屏幕开启关闭管理等。

• Binder IPC驱动

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

• 蓝牙驱动(Bluetooth Driver)

基于IEEE 802.15.1标准的蓝牙无线传输技术。

• WiFi驱动(WIFI Driver)

基于IEEE 802.11标准的WiFi驱动。

• 照相机驱动(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之上的用户空间。

• Android Telephony也采用了分层结构的设计,共跨越了三层:应用层、应用框架层和系统运行库层,与Android操作系统整体分层结构保持一致;

• Android Telephony从上到下共分三层:Telephony应用、Telephony框架、RIL(Radio Interface Layer,无线通信接口层,主要位于系统运行库层的HAL中,什么是HAL,接下来会详细介绍)。

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

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

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

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

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

要想知道HAL结构,先看看来源于HAL 0.4.0 Specification的框图,如图1-4所示。图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中仅保留基础的通信功能,即使开源一部分代码,对厂家来讲也不会有什么损失。

谷歌选择了这样做,并且特意修改了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两种运行结构

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

HAL Stub是一种代理概念,虽然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提供的函数,而底层在处理完上层请求后或硬件状态发生变化时回调上层,则通过Runtime提供的callback接口完成。

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

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

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

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

• 学习Ubuntu系统安装及相关依赖工具安装。

• 下载和编译Android源码。

• 掌握Android Studio和SDK的使用。

• 掌握在Google手机上运行调试Android源码。

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

Android的编译环境作为深入学习Android的基础,不可缺失,能够完整下载Android源代码并编译成功,对深入学习Android是非常关键和重要的一步。Android环境搭建比较繁琐和枯燥,花费时间长,从Ubuntu 17.10操作系统安装、编译所需工具包的下载、更新和安装,到JDK、Android SDK下载、配置以及关键工具的使用,再到Android 8.1.0源代码下载、编译和“刷机”等。其中有一步未完成或稍有偏差,都可能导致Android源码编译不能通过或是无法在Google手机上调试Android源码。注意Android源代码编译调试环境在深入学习Android的过程中非常关键和重要,为什么这么说呢?因为有了这样的环境,我们在面对大量的代码不知道如何下手时,可以尝试着修改源码并在Google Nexus 6P或是其他Google手机上调试、运行修改源码后的效果,特别是在没有开发板或工程手机的条件下(本书将告诉你如何使用Google手机替代),对我们学习Android系统至关重要。因此本章内容尽量做到直观和简洁,关键步骤均有截图或说明,并且每步操作均做了真实、严格的验证,只要读者按照本书步骤一步一步对照操作,都能够成功搭建起自己本地的Android编译、调试和开发环境。2.1 Ubuntu Linux操作系统及工具安装

要搭建Android的编译环境,首先选择操作系统。本书选择Ubuntu 17.10桌面版64位Linux操作系统,作为编译Android源码的操作系统。2.1.1 PC配置建议

CPU类型:英特尔酷睿i5处理器或i7处理器

内存:8GB或更大容量

硬盘容量:500GB或1TB

显卡:集成显卡或其他独立显卡2.1.2 Ubuntu安装光盘制作

首先下载Ubuntu安装镜像文件,进入Ubuntu官方网站,发现有如下Ubuntu版本:

• Ubuntu 17.10 (Artful Aardvark)

• Ubuntu 17.04 (Zesty Zapus)

• Ubuntu 16.04.3 LTS (Xenial Xerus)

• Ubuntu 14.04.5 LTS (Trusty Tahr)

• Ubuntu 12.04.5 LTS (Precise Pangolin)

本书选用64位Ubuntu 17.10桌面版操作系统,选择下载ubuntu-17.10-desktop-amd64.iso镜像文件,然后使用刻录软件工具将ISO镜像文件刻录到光盘上,制作成系统安装光盘。注意如果没有刻录光盘的条件,可以采用制作USB系统启动盘的方式。目前大多数计算机支持USB引导系统,加上目前USB闪存容量大且价格相对较低,可选择2GB或以上容量的U盘,使用Universal USB Installer在Windows下制作Ubuntu 17.10系统安装启动盘,具体的方法可上网搜索制作U盘安装盘详情。2.1.3 Ubuntu安装过程

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

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

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

这一步非常关键,是对磁盘的分区。如何分配磁盘空间?这里建议手工划分磁盘空间大小,划分两个Linux操作系统必备的磁盘空间即可:/根目录挂载分区和swap交换分区,如图2-2所示。图2-2 磁盘空间大小为500GB的分区样例

根据图2-2,它们分别是:

• swap交换分区

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

• /根目录挂载分区

不论磁盘大小,除去swap交换分区占用的磁盘空间,剩余的都分配在/根目录挂载分区。本例中分配480GB磁盘空间大小。

目前市场上的硬盘都较大,2TB已成为基本配置。本例中的/根目录挂载分区包括了/home用户数据分区(读者也可以分配独立的/home分区挂载点)。在Android编译环境中,源代码的保存和编译都在此进行,所以需要较大空间,因此将除去swap交换分区占用的磁盘空间剩余的磁盘空间都分配到此挂载分区。

分区完成后,进入下一步,时区选择Shanghai,进入下一步,然后选择键盘布局,这里使用默认的USA键盘布局;最后进入计算机基本信息输入界面,输入用户名、密码、计算机名,如图2-3所示。图2-3 输入计算机基本信息

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

Ubuntu Linux操作系统安装完成后,弹出安装完成提示,需要重启计算机,就可以进入图形化Ubuntu登录界面了。整个Ubuntu Linux操作系统安装过程都是图形化向导过程,非常简单。2.1.4 安装OpenJDK

Android源码的编译离不开JDK的支持。从Android刚发布到现在的Android 8.1.0版本,不同版本对JDK的需求是不一样的。表2-1中列举了Android版本与JDK的对应关系。表2-1 Android版本与JDK的对应关系JDK

因此,我们要编译Android 8.1.0的源码,对JDK的需求是OpenJDK 8。在Ubuntu 17.10系统中,安装和验证OpenJDK的命令如下:$ sudo apt-get update$ sudo apt-get install openjdk-8-jdk$ java -versionopenjdk version "1.8.0_151"OpenJDK Runtime Environment (build 1.8.0_151-8u151-b12-0ubuntu0.17.10.2-b12)OpenJDK 64-Bit Server VM (build 25.151-b12, mixed mode)2.1.5 Ubuntu系统工具包更新升级

前面的步骤已经完成了Ubuntu操作系统的安装,现在需要更新和安装Android编译环境需要的系统工具包,其Linux命令为:$ sudo apt-get install git-core gnupg flex bison gperf build-essential zip curl \zlib1g-dev gcc-multilib g++-multilib libc6-dev-i386 lib32ncurses5-dev \x11proto-core-dev libx11-dev lib32z-dev ccache libgl1-mesa-dev libxml2-utils xsltproc unzip

因网络异常或其他异常,这些工具包可能不能完全下载和更新,那就需要在执行完此命令以后,再次执行此命令来验证工具包是否完整安装和更新。xsltproc is already the newest version (1.1.28-2.1ubuntu0.1).zlib1g-dev is already the newest version (1:1.2.8.dfsg-2ubuntu4.1).0 upgraded, 0 newly installed, 0 to remove and 247 not upgraded.

说明所有的包都没有遗漏,已经安装完成。如每个工具包提示均已完成更新和安装,便可进入下一步操作,否则继续执行此命令更新和安装剩余未完成的Ubuntu系统工具包。2.2 Android源代码下载及编译过程

前面已经完成了Ubuntu Linux、OpenJDK和编译Android源码所需的系统工具包的安装和配置,接下来开始下载和编译Android 8.1.0源代码,这个过程简单但花费的时间比较长。2.2.1 工作目录设置

Android 8.0的代号为Oreo,简称O,中文名称奥利奥。采用名称Oreo作为本书选用Android 8.1.0版本源代码的根目录,在用户根目录下新建代码根目录Oreo文件夹,并设置此目录为工作目录,在.bashrc中增加export $oreo=~/code/Oreo。注意在Android开发过程中,配置工作目录的环境变量有利于提升工作效率,主要体现在一些Android工具命令、代码路径、编译结果路径等配合工作目录的环境变量使用会简化操作,读者在使用过程中可逐步体会;后续涉及的$oreo即是Android 8.1.0源代码的根目录路径。2.2.2 源代码下载

Android 8.1.0源代码的本地目录已经建立,接下来就要开始下载代码了,相关操作及说明如下:repo脚本是Android项目编写的Python脚本,用来统一管理Android项目的代码仓库$ sudo apt-get install python$ curl https://storage.googleapis.com/git-repo-downloads/repo > repo$ chmod a+x repo注意在~/用户主目录下新建一个bin目录,并将此目录设置在PATH目录中;我们将在此目录下保存常用的一些脚本或二进制可执行程序,以后不必更新系统环境变量就能在任意目录执行这些脚本或可执行程序。$ mkdir ~/bin$ vi ~/.bashrc//在文件最后一行增加PATH=~/bin:$PATH,保存退出$ source .bashrc//立即生效配置的PATH目录$ mv repo ~/bin/$ cd $oreo//配置git个人信息$ git config --global user.name android_tele$ git config --global user.email android_tele @163.com//查看配置的git信息$ cat ~/.gitconfig[user] name = android_tele email = android_tele @163.com[color] ui = auto//获取Android源码分支信息$ repo init -u https://android.googlesource.com/platform/manifest ...... * [new tag] android-8.0.0_r32 -> android-8.0.0_r32 * [new tag] android-8.0.0_r33 -> android-8.0.0_r33 * [new tag] android-8.0.0_r34 -> android-8.0.0_r34 * [new tag] android-8.0.0_r35 -> android-8.0.0_r35 * [new tag] android-8.0.0_r36 -> android-8.0.0_r36 * [new tag] android-8.0.0_r4 -> android-8.0.0_r4 * [new tag] android-8.0.0_r7 -> android-8.0.0_r7 * [new tag] android-8.0.0_r9 -> android-8.0.0_r9 * [new tag] android-8.1.0_r1 -> android-8.1.0_r1 ......//读者可根据实际情况,选择最新的Android源码分支下载,本书选择android-8.1.0_r1分支下载$ repo init -u https://android.googlesource.com/platform/manifest -b android-8.1.0_r1 repo has been initialized in /home/android/Oreo$ repo sync –j8 //开始下载Android O源码,工作进程数量,本例中使用8个,读者可以根据网络带宽进行调整//这个过程花费的时间很长,视网络情况而定;建议读者在晚上下载,如果中途代码下载中断了,也不必担心,//repo sync支持续传2.2.3 开始编译Android源代码

Android 8.1.0源代码下载完成后,可以开始编译源码,详情见如下操作及相关说明。$ cd $oreo$ source build/envsetup.sh //或者. build/envsetup.sh //加载编译脚本//使用第二种方法需要注意,build前有一个空格including device/asus/fugu/vendorsetup.shincluding device/generic/car/vendorsetup.shincluding device/generic/mini-emulator-arm64/vendorsetup.sh......including device/huawei/angler/vendorsetup.shincluding device/lge/bullhead/vendorsetup.shincluding sdk/bash_completion/adb.bash$ lunch //选择编译的产品信息You're building on LinuxLunch menu...... pick a combo: 1. aosp_arm-eng 2. aosp_arm64-eng 3. aosp_mips-eng 4. aosp_mips64-eng 5. aosp_x86-eng 6. aosp_x86_64-eng ...... 28. aosp_angler-userdebug 29. aosp_bullhead-userdebug 30. aosp_bullhead_svelte-userdebug 31. hikey-userdebug 32. hikey960-userdebugWhich would you like? [aosp_arm-eng] aosp_arm64-eng============================================PLATFORM_VERSION_CODENAME=RELPLATFORM_VERSION=8.1.0 //Android O版本TARGET_PRODUCT=aosp_arm64 //lunch选择aosp_arm64-engTARGET_BUILD_VARIANT=eng......BUILD_ID=OPM1.171019.011 //编译号OUT_DIR=outAUX_OS_VARIANT_LIST=============================================$ make –j8//编译时间长,编译过程中输出的日志很大,这里对编译日志进行了省略//以下是编译成功日志信息,可以看出成功编译出system.img镜像文件encoding RS(255, 253) to '/tmp/tmpGZPyrs_verity_images/verity_fec.img' for input files: 1: 'out/target/product/angler/obj/PACKAGING/systemimage_intermediates/system.img' 2: '/tmp/tmpGZPyrs_verity_images/verity.img'appending /tmp/tmpGZPyrs_verity_images/verity_fec.img to /tmp/tmpGZPyrs_verity_images/verity.imgRunning: append2simgout/target/product/angler/obj/PACKAGING/systemimage_intermediates/system.img/tmp/tmpGZPyrs_verity_images/verity.img [100% 89721/89721] Install system fs image: out/target/product/generic_arm64/system.img out/target/product/angler/system.img+out/target/product/generic_arm64/obj/PACKAGING/recovery_patch_intermediates/recovery_from_boot.p maxsize=3288637440 blocksize=135168total=1048456853 reserve=33251328#### build completed successfully (02:26:35 (hh:mm:ss)) ####

第一次编译时间较长,不同的计算机花费的时间不同。作者使用较老的笔记本电脑(酷睿 2 代i7+8GB)编译Android O源码,共使用了6.5小时。如果计算机处理能力较强,可使用更多的工作进程,比如:make –j16,增加编译工作进程数从而减少编译时间。编译完成后,进入$oreo/out/target/product/generic_arm64目录,关注此目录下的system.img、ramdisk.img、userdata.img三个IMG镜像文件,以及data、obj、root、system等目录。请读者自己查看,编译完成后究竟生成了一些什么文件,这里重点关注system目录,其主要目录结构如下。

• app/priv-app(应用apk文件,如TeleService.apk、Mms.apk等)

• bin(可执行文件,app_process32/64、toybox、netd等)

• etc(系统配置信息)

• fonts(字体文件)

• framework(主要保存一些jar包,framework.jar、telephony-common.jar等)

• lib/lib64(主要保存一些so动态链接库文件,libbrillo.solibsurfaceflinger.so等)

• usr(用户配置信息)

• xbin(系统的一些可执行文件)2.2.4 编译单个模块

整个Android编译环境搭建已经完成了60%。在前面曾经谈到为什么要搭建这样的编译环境,那就是能够调试、运行修改的内容。如果在Telephony应用里修改了Android源码增加日志打印功能,是不是也要通过make来编译呢?这样的话,在编译方面就需要花很多时间。在Android中能够按照模块进行模块的单独编译,可减少不必要的编译时间开销。注意在进行分模块编译之前,必须先完成整体编译后才能进行,否则不能成功编译需要单个编译的模块。

分模块编译主要有三种方式。第一种,在$oreo代码根目录下执行mmm module path命令;第二种,进入对应的应用模块代码所在目录执行mm命令;第三种,在$oreo代码根目录下执行make module name命令,详情见如下操作及相关说明。$ cd $oreo$ source build/envsetup.sh //或者. build/envsetup.sh//使用第二种方法需要注意build前有一个空格$ mmm packages/service/Telephony/ //编译TeleService应用$ mmm frameworks/base/ //编译framework.jar$ cd packages/service/Telephony //TeleService应用代码目录$ mm //编译TeleService模块$ cd $oreo$ cd frameworks/base //进入framework代码目录$ mm //编译framework$ cd $oreo$ make TeleService //编译TeleService应用$ make framework //编译framework.jar应用

不论采用什么方式编译单个模块,编译成功后,均有类似如下的日志。[100% 10/10] Install:out/target/product/generic_arm64/system/priv-app/TeleService/TeleService.apk#### build completed successfully (01:16 (mm:ss)) ####[100% 131/31] Install:out/target/product/generic_arm64/system/framework/arm64/boot.art#### build completed successfully (05:28 (mm:ss)) ####注意建议使用make module name和mmm方式分模块编译,编译过程不涉及目录的切换,可以减少工作量。而这两种方式中优先选择mmm的编译方式,因为比起make module name方式,它更加省时。2.3 Android Studio及SDK2.3.1 下载和配置Android Studio

Google提供了Windows 32/64、Mac和Linux四个不同平台的Android Studio版本供我们下载和使用。

选择Linux版本,下载android-studio-ide-171.4443003-linux.zip文件到本地,约740MB大小。$ unzip android-studio-ide-171.4443003-linux.zip$ tree -L 1 android-studioandroid-studio├── bin├── build.txt├── gradle├── Install-Linux-tar.txt├── jre├── lib├── license├── LICENSE.txt├── NOTICE.txt└── plugins6 directories, 4 files$ cd android-studio/bin$ ./studio.sh//启动Android Studio注意(1)第一次启动Android Studio将启动安装向导,可在线更新Android SDK、Gradle等工具包。要关闭启动安装向导,可修改bin目录下的idea.properties配置文件,增加一行配置信息如下:disable.android.first.run=true(2)每次启动Android Studio都需要进入android-studio/bin目录,再运行studio.sh脚本,操作较多。比较省事的办法是增加一个desktop图标,在Ubuntu Activity菜单中可方便启动,具体的操作如下:$ sudo vi /usr/share/applications/androidstudio.desktop//需要root权限//增加以下配置信息[Desktop Entry]Name=androidstudioComment=androidstudioType=ApplicationTerminal=falseIcon=/home/android/tools/android-studio/bin/studio.pngExec=/home/android/tools/android-studio/bin/studio.sh

单击Ubuntu Activity,输入androidstudio即可匹配出Android Studio应用,再单击Android Studio图标即可启动它了。2.3.2 Android SDK下载及配置和使用

Android SDK的下载页面与Android Studio在同一个页面,谷歌也提供了Windows、Mac和Linux三个平台的版本供我们下载和使用。

同样选择Linux版本,下载sdk-tools-linux-3859397.zip到本地,约130MB大小。$ unzip sdk-tools-linux-3859397.zip$ tree -L 1 tools/tools/├── android├── bin├── emulator├── emulator-check├── lib├── mksdcard├── monitor├── NOTICE.txt├── proguard├── source.properties└── support

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

下载完整电子书


相关推荐

最新文章


© 2020 txtepub下载