猜你喜欢
最强Android书:架构大剖析

最强Android书:架构大剖析

书籍作者:Jonathan Levin ISBN:9787121318139
书籍语言:简体中文 连载状态:全集
电子书格式:pdf,txt,epub,mobi,azw3 下载次数:4501
创建日期:2021-02-14 发布日期:2021-02-14
运行环境:PC/Windows/Linux/Mac/IOS/iPhone/iPad/Kindle/Android/安卓/平板
内容简介

本书通过实验而不是源码,将Android 系统层层拆解,令读者深刻透彻地掌握Android 系统的内部技术:以init 进程为切入点详细阐述了Android 的启动过程和关键服务;从Android 作为资源协调者和服务提供者的角度,重点分析了servicemanager 和system_server 这两个进程。同时,作者比较了Linux 与Android 系统的区别,并对Android 系统的安全性做了深入的阐述。

本书采用了大量的图表示例和实验,表达新颖清晰,让读者能直观地掌握Android 的技术精髓。

本书适合广大移动开发者及对Android 系统感兴趣的人员阅读。


作者简介

JonathanLevin是一位经验丰富的技术培训师和咨询师,他的关注点是"三大系统"(Windows、Linux和MacOS)以及它们的移动版本(Android和iOS)原理。15年来,Jonathan坚持传播内核工程和修改技术的真知灼见,在DefCON会议上发表了很多技术演讲。他是Technologeeks.com公司的创始人和首席技术官(CTO)这是由一些志趣相投的专家合伙创办的公司,致力于通过技术培训传播知识,通过咨询解决棘手的技术难题。他们的专业领域覆盖软件架构中的实时及其他关键部分、系统/核级编程、调试、逆向工程以及性能优化。

译者简介

崔孝晨,教师,专注于信息安全领域,研究深入。翻译出版了多部著作,包括《黑客大追踪》、《Android安全攻防实战》,并致力于推动安全技术的发展。


编辑推荐

本书作者以研究操作系统并从事相关培训工作为生,是业内著名的操作系统专家、极客、果粉……著有多本操作系统的畅销书。本书是他针对Android系统写的第本书。根据以往读者的反馈,在本书的内容上摒弃了以源代码讲解的方式,而改用实验的方法,直接拉低了学习的门槛——读者无须费力也可根据实验轻松地理解掌握Android内部技术的精髓!如业内众大咖所说:本书是目前了流的Android书,也是学习Android内部技术的优选!

本书被美国中情局,国内部分手机厂商作为内部员工学习教材。

写作特色

√ 抛弃传统以源代码讲解的形式,直接从实验入手,读者无须了解代码也能深入掌握Android技术精髓

√ 各章节相对独立,可以跳跃式阅读

√ 大量使用图表、图片,直观易懂

√ 作者有多年培训经验,针对读者的痛点下工夫,思路清晰、表述到位


前言

关于本书

概览

购买了本书的朋友,毫无疑问你已经意识到了Android 的重要性。这个启动于2003 年的操作系统,在被谷歌收购之后,现在已经成为谷歌最得力的产品。它迎头赶上了苹果公司的iOS操作系统(也有人说是很接近了),不仅取得了移动操作系统领域内的绝对优势(截至本书付印时,它的市场占有率已经达到了令人惊异的82%了),而且还渗透到了其他平台上,成为可穿戴设备、TV 和嵌入式设备上的操作系统。

Android 是开源的,而且是可以免费获得的,这也就意味着任何人都能获得它,并对它进行修改,使之能够运行在任何一种平台上——事实上,这也是它能够力压群雄,占据市场主流的原因。不过,令人吃惊的是,尽管已被广为接受,但是至今仍然没有一本书来完成探究其内部工作原理并将其文档化的任务。前几年有一本名叫《构建嵌入式Android 系统:移植、扩展和定制》1的书,作者是Karim Yaghmour——这本书给出了大量关于该操作系统通用结构的细节信息,但是其着眼点在于如何创建和修改源码,使之能运行在各种新的平台上,而没能给出操作系统本身的结构。事实上,在此书“内部结构入门”一节中,Yaghmour 声称“要想完全理解Android 系统服务的内部结构,无异于蛇吞象”。

我认为这还算是一种保守的说法,这也就是为什么本书需要由好几本书组成而不是只有一本的原因。第1 本(也就是你现在正在读的这本书)主要是从高级用户或者管理员的角度讨论Android。在这一本中,我试图从各种不同的角度,如Android 的设计、文件系统结构、启动顺序、原生服务再加上Linux 基底以及Linux 基底对操作的影响来讨论这一操作系统。这一切都不涉及代码,只是试图尽可能地给你一个大致的概念和鸟瞰图。从某种程度上说,本书可以算作Yaghmour 那本著作的后续之作,Yaghmour 的那本书本身也是极好的资料来源,我强烈建议你找一本来读。

本系列的第2 本(将于不久后出版)将会对Android 讨论得更深,而且会把视线转向Android框架服务(framework)的结构——这显然对开发者更有吸引力:通过使用Java 层上各种丰富的框架,开发者可以拥有把输入设备、传感器、图形图像之类的东西抽象化的强大能力。当然这一抽象化的能力也并非是没有代价的——复杂性隐藏在“水面之下”,只是大多数开发者对此安之若素(更有甚者还满足于这一状态)罢了。不过知识是力量的源泉,深入熟悉各类框架(及其底层实现机制)对于任何想要进行底层开发或者在性能调优、支持更多的硬件、安全研究等方面有所建树的人士都是至关重要的。

Android 是一个不断飞速更新的系统。在本书开始编写时,最新版的Android 系统还是KitKat,然后(尽管中间有过几次跳票)最新版就变成Lollipop 了。而且这一趋势还在不断加快——由于Lollipop 版被发现有不少Bug,谷歌又宣布将要推出Android Marshmallow 版。不过,截至本书付梓时,Lollipop 版显示出了它稳定的一面——所以我也可以骄傲地说,这本书已经反映了最新版……好吧,是截至出版之日。幸运的是,借本书自媒体出版的东风,我可以不断地紧跟Android 系统的更新而修订本书的内容,读者现在看到的这一版已经更新到MarshmallowPreview Release 1 版(2015 年6 月)了。

我还试图从我的上一本书Mac OS X and iOS Internals 中吸取一点“经验教训”。我收到的读者对那本书的主要批评之一是:那本书太技术化了,充斥着大量源码,非开发人员身份的读者读起来实在是太累了。我个人的信条是“读一下源码吧,淡定些!”——因为源码不像自然语言,(几乎)是不会有歧义的,因此也是用来描述系统的正确方式。虽然我还是坚持我的想法不动摇,但在这本书中,我还是在不牺牲细节信息的前提下,尽可能多地改用图表的形式来表达意思。[我把这一做法也用在了Mac OS X and iOS Internals 一书的第2 版上(这一版将于2016 年下半年出版)——这倒也不完全是因为我想通了,心甘情愿地这么做,还有一个重要因素也在促使我这么做,那就是在那本书里更加深入地探讨了Mac OS X 和iOS 系统更底层、更隐秘的部分——这些东西可是没有源码的……]

本书也十分强调动手实践,我从我们的Android 培训课程里抽取了一些动手练习,并把它们改编成了书中的实验。如果你想要对相关章节讨论的主题有深入了解的话,这些实验对你来说无疑是极为重要的。Android 是UNIX(实际上是Linux)的一种衍生品,而学习UNIX 的唯一正确方式是用我们的手指,而不是用我们的眼睛或耳朵。在这些实验里演示了Android 命令行接口(CLI,command-line-interface)中的一些非常有用的命令,以及深入了解操作系统内部结构的技术。更进一步说,有些实验在不同的Android 环境下会产生不同的输出结果——这也使它们非常值得你在自己的手机/平板电脑上亲手做一遍,以体验不同厂商或操作系统版本在架构和实现上的不同之处。

全书内容鸟瞰

本书的内容编排,既可以让你能按部就班地逐页阅读,也能让你随便翻开一页就能读下去。书中的每一章都是独立成章的,在你阅读本书的电子版时,文中所提及的相关主题都是以超链接的形式给出的——直接点击它,你就可以跳转到相关章节进一步阅读,但是对于纸质版的读者,我就只能给出相应的章节编号(引用书中的内容时)或者URL(引用其他资料时)了。我也会在相应的地方附上所引用的AOSP 文件的路径(尽管为了节省空间,是以缩略的形式给出的),要不然本书的主要用途就变成“防身”了……

第1 章介绍了Android 操作系统:介绍了它各个不同版本的演化史(从Froyo 版开始,这是你目前在市场上能找到的最老版本的Android 系统了,一直到Lollipop 版1)。同时,在这一章里(从较高的视角)也通过逐一比较Android 软件栈中的各个层(layout),阐述了Android 的体系架构以及它的Linux 基础。紧接其后,这一章还介绍了Android 的衍生产品——既包括谷歌自己的,也包括其他厂商的(比如亚马逊的FireOS)。最后,这一章将对Android 未来发展方向的设想和思考作为整章的小结。

从第2 章开始,我们开始深入探索各种技术细节——第2 章的主题是Android 的分区和文件系统。我们先讨论Android 使用的分区架构(不幸的是,各家厂商远远没有对此达成一致),以及文件系统——EXT4 和F2FS。然后,我们将探究文件系统中存放的内容——如果你想要知道某个特定的系统目录或文件中存放的是什么数据,这将是非常有用的。此外,本章还会涉及一些内置应用的数据存放目录,如果你对电子取证感兴趣,这些内容无疑也是非常重要的。在这一章中还会讨论Android 受保护的文件系统(OBB 和ASEC)——尽管在系统被root 之后,这些保护措施就会失效。最后,我们还会阐述Linux 伪文件系统(cgroupfs, debugfs, procfs, sysfs等)在系统中扮演的角色。

第3 章是在前一章的基础上展开讨论的——因为涉及分区。它解释了在Android 系统启动过程中,各个分区所起的作用。我们先会讨论Android 的启动镜像(尽管有时会有些不正确地把它称为ROM),以及怎样把它刷到设备的各个启动分区里去。Android 默认使用的Boot Loader也会予以阐述(本书官网上还有一篇从更加技术的角度开展讨论的进阶阅读文章),以及启动镜像的其他一些组件[内核(kernel)、设备树(device tree)和initramfs]也会被详细讨论。本章中的相关实验还演示了如何把这些组件从启动镜像中解出来,修改其中的内容,然后再把它们重新打包回去——制作一个你自己的刷机包(当然安装这种刷机包的前提是:在你的移动设备上Boot Loader 已经解锁了)。此外,在这一章中还讨论了通过无线网络发送更新镜像进行(OTA)升级,以及设备备份、重置和关机的操作过程。

第4 章专门讨论一个进程/init。这个进程和它在UNIX 系统中的同名进程一样,是负责在用户态中启动系统的。我们会详细解释启动的过程,并解释/init.rc 文件中使用的语法。/init 的其他一些作用,比如维护系统属性和监视硬件改变(以ueventd 进程的身份),也会详细地加以讨论。

在第5 章中讨论的是原生服务,也就是列在/init.rc 文件中的,由/init 进程启动的Linux 二进制可执行文件(与之相对应的是Dalvik 级的框架服务,这些服务是以system_server 进程中的线程的形式被加载起来的,我们会在第2 本中讨论这些框架服务)。在这一章中逐个详细介绍了你可以在自己的移动设备上找到的每一个守护进程——说实话,还真不少。

在第6 章中简略介绍了Android 框架服务的大致架构,解释了servicemanager 和system_server 进程在其中所扮演的角色——这两个进程共同构成了其余所有构建在其上的Android 框架服务的基石。Binder 也是这一章里的重头戏,我们会简略地对它进行一番描述,是大部分细节信息还是要留待第2 本讨论补充。我希望这一解释足以让你能更深一步地理解Android 进程间通信和远程过程调用的内部工作机制。

第7 章以Linux 的视角来看待Android,也就是通过/proc 伪文件系统以及使用Linux 系统中的工具,观察Android 系统中的进程及应用。这一章还有一个“一箭双雕”的作用——你可以把这一章讨论的绝大多数工具,用在你自己的Linux 系统原生代码的调试工作中。

作为本卷的最后一章,第8 章是专门用来讨论安全的。这一章在本书的官网上有预览版(只不过在预览版中的编号中,它是第21 章——当时我曾经天真地认为可以在一本书中把所有的问题都讲清楚),在这一章里将逐一详细讨论Android 的所有安全特性——既包括Linux 层上的,也包括Dalvik 虚拟机层上的。同时,在这一章中还有一个小节专门来讲述Android 设备的root问题——既讨论了“被厂商认可的”在设备启动时root 的方式,也讨论了那些通过安全漏洞root设备的方法。

本书使用的排版约定

本书采用如下排版约定:

以filename 这种格式表示文件名。

命令、系统调用名称以及框架类名都是以command(1)、systemCall(2)以及classes 这种格式表示的。命令和系统调用名称后面跟的数字是指:在使用Linux 的man 命令打开的手册中,该命令或系统调用所在的章节编号。

此外,本书还有许多插图、代码清单和输出结果。插图是由系统组件或消息传递流程组成的图片,相对于输出结果,代码清单中给出的一般是内容固定的文件中的内容,而输出结果中给出的则是一连串命令的执行结果——它通常是某个实验的一部分。我制作输出结果的目的是:

显示各条命令的执行顺序及其用法,所以输出结果中一般都是带注释的(如输出结果0-1 所示)。

请注意上面这个输出结果中的细节——用户名(上面这个输出结果中的user)(以及命令行提示符是$还是#)能够告诉你,这条命令是在shell 中就能执行,还是必须要有root 权限才能执行。主机名(上面这个输出结果中的hostname)则可以告诉你这条命令是在哪台设备上执行的——如果它是generic,表示是在一台模拟器中;如果是flounder,表示是在一台Nexus 9(L)中;如果是其他移动设备的名称(s3、s4、kindle 或Nexus 5 之类的),则表示是在一台对应的移动设备中;如果它是Forge,则表示是在作者自己的Linux 计算机上运行的。我尽量避免在书中出现大段的代码(至少在本书中是这样的),在迫不得已的情况下,我也尽量只给出最关键的代码,此外,我也会在代码中加上帮助你理解代码的注释。代码的字体颜色也调整为能够同时兼顾彩色(如果你读的是PDF 版)和黑白(如果你阅读的是纸质版)两种打印方式的颜色。

最后……

本书绝对是个大工程,我像在大海里捞针那样把最重要的代码从Android 源码里挑了出来。但即便是这样,肯定还有人想要亲自查看相关源码。所以,我在每次讨论中都会给出相关的源文件,并且是以超链接的方式给出的(纸质书的读者就只好抱歉了,我会把它们统一放在一个表格里供你们查阅)。有兴趣的读者也可以去谷歌的Android 源码网站, 或者去http://source.android.com/用git 或者repo 命令下载最新版的Android 源码。

这本书是我“一个人的战争”——除了封面设计(封面设计是Dino Tsiopanos 送给我的礼物,Dino 不仅是个很棒的工程师,还是个很棒的画家)。书中的所有内容,包括文字、图片、排版和编辑都是我一个人完成的。幸亏我还可以向我的两位审校Moshe Kravchi 和 Arie Haenel寻求帮助,我真的非常感谢你们二位!Nikolay Elenkov(那本棒极了的Android Security Internals:An In-Depth Guide to Android's Security Architecture1一书的作者)也对本书提出了宝贵的意见和建议。Aviv Greenberg 在出版前的最后一段时间里以最快的速度通览了全书,给了我非常重要的评论。我还要感谢Eddie Cornejo,你不光挑出了很多错别字,还让我有底气说:我(在书中)对所有操作系统的评价都是公正的。最后,我还要感谢Nikola Veljkovic,感谢你帮我修正了书中的许多打字错误。

此外,我还要特别感谢Yoav Chernitz。事实上,我在所有书中都应该感谢你——因为正是在你的鼓励下,我才会走上写书这条道路。或许对于我来说,这一切都是不言自明的,但我还是要把这件事告诉本书的读者,补上在本书的第1 版(更新至Android Marshmallow 版之前的那一版)中,没有对你表示特别感谢的缺憾。出于同样的理由,我还要特别感谢Yobo,因为是你引领我走上了Android 研究之路,是你告诉我Technologeeks 有Linux to Android 和Android Internals 这两门课的培训需求——它们现在已经是最热门的两门课程了,而且也构成了这套书(共两本)的基础。另外,如果不是Ronnie Federbush,我也不会考虑像现在这样,尝试自媒体出版,而且本书的第2 本(即将出版)和Mac OS X and iOS Internals 第2 版也将以这一形式出版。

这里还要特别说一句,我个人最诚挚的感谢要送给Amy,我俩在一起世界才完美,从我上一本书开始(实际上是在所有的事上)你一直给予我无限的支持和鼓励。这是我永远要唠叨,永远不会忘记的感谢!

本书是我用vim 编辑器以符合HTML5 的格式要求全手工输入的(对,我保证,我确实就是这么干的!不过这次也是够了,我想下次我再也不会这么干了),所有的图片全是用SVG(又让我幼小的心灵受到了一次严重的创伤!)或PowerPoint 画的,这也就能够解释为什么这本书花了这么长的时间才面世。不过好消息是本书的第2 本(大概比这一卷厚一倍!)应该也会在不久出版。在书中做索引也是一件极其令人痛苦的事,所以我决定:在更新内容时,就不再做索引了(你只要直接在PDF 里搜索相关内容就行了)。如果你在书中发现了任何格式错误或者技术错误,也请体谅一下我这些辛苦的工作!不过对于技术错误,我提供专门的奖励——每发现一个,就会有一定的奖励进入你的腰包。

我还维护了本书的官方网站,在这个站点上还有更多的进阶阅读材料和一些专门定制开发的工具,网址是:http://NewAndroidBook.com/。本书的勘误表——包括错别字和错误修订(我希望不会有),也会放在这个网站上。

如果你想要在推特上找我,请关注我公司的官推@Technologeeks,那里经常会推送一些我的书的更新以及扩展阅读材料。Technologeeks 公司也提供关于Android、OS X、iOS、Linux 及其他操作系统的专业咨询和培训服务, 所以我也建议你关注一下我公司的网站http://Technologeeks.com/。特别要说一句的是:在我公司提供的培训服务中,关于Android 和OS X/iOS 的培训都是基于我这两本书的。我公司在领英里还有一个Android Kernel Developers群——如果你有兴趣的话,也可以加入这个群,来打个招呼(或是提些问题)。

我衷心希望你能觉得这本书的内容既有意思,又吸引人(好吧,我想应该是在技术书籍中比较吸引人)。在本书的官网上我搭建了一个论坛,恭候您的批评和建议。

现在就让我们正式开始吧!

推荐序一

Android 是当今最主流的移动端操作系统,然而作为安全研究者要找到一本适合入门学习的书籍却并不容易。本人总结其原因有三:第一,Android 操作系统更新周期较短,特别是近两年Android 自4.4.X 更新至7.1 版,它的系统安全特性已经发生了翻天覆地的变化,许多Android书籍自开始撰写到完工就需要几年时间,如果是英文书籍还涉及翻译的时间,通常读者拿到书的时候,内容已经比较过时了。第二,由于Android 系统的复杂性,对作者的技术要求比较高。

作者不仅要熟悉其原生(Native)层,对其Java 层等组件也需要有了解。市面上的很多Android书籍,很少能较好地覆盖每一个面向,或者是只有一个侧重点,这导致读者即便通读全书,也无法了解Android 的全部。第三,很多书籍从Android 源代码入手来讲解原理,虽有足够的深度,但略显乏味,会给读者一种纸上谈兵的感觉,给读者的阅读增添了困难,令他们很难全部读完并完全理解。

《最强Android 书:架构大剖析》是我见过的Android 书籍中,最适合安全研究人员阅读的一本。此书的作者Johnathan Levin 和译者崔孝晨都是本人的朋友,相信与这两位打过交道的朋友都会发现,他们精力非常充沛,虽然已经从事安全研究十几年,但对新技术仍然充满了热情和好奇心。在面对面交流的时候,他们经常对着一个技术点侃侃而谈、乐此不疲。而作者Johnathan Levin 更是在本书中引入“互联网思维”,为本书设立了网站http://newandroidbook.com,并不定期撰写文章,听取读者的反馈和建议,把Android 最新的、读者最想了解的特性分析更新到本书中。以上特性,保证了本书与那些“拿到就过时”的Android 书籍相比,具有明显的优势。

一本好书,光与时俱进、有技术深度还远远不够,如何把一个复杂的操作系统的内部机制和原理,合理有序、循序渐进地传授给读者,也是一个需要推敲的问题,而这就不仅仅是要求作者技术功底深厚那么简单了。Johnathan Levin 多年从事技术培训工作,这些积累的培训经验确保了本书的易读性: 细心的读者很快就能发现,本书的每一章节都相对独立,无论是顺序阅读或者跳着看都没有太大的问题;书中大量使用图表、图片来叙述,让读者更直观地掌握各个知识点,并且通过实验的方式加深对各个知识点的印象,充分掌握一些比较重要的概念。而译者崔孝晨同志更是在确保把原书的含义完整无误地传授给读者的同时,加入了许多中国元素,在表达上更为生动形象——这样的合作,无疑是中国读者的一大福音。

Android 的安全防护机制是多维的,我的团队成员何淇丹、刘耕铭在Mobile Pwn2Own 2016中远程攻破搭载最新Android7.1 的Nexus 6p 设备,从攻破所利用的漏洞来看,很明显,安全研究者需掌握Android 浏览器、框架组件、内核等安全特性并找出Java 层、Web 相关、原生层甚至内核层的漏洞,并串联在一起才能对Android 进行有效地远程攻击、突破沙盒、最终实现提权。本书对Android 安全特性的分析也是一大亮点,很好地覆盖了目前针对Android 的攻击面。

相信通过阅读本书,一定会对您的工作有所帮助。

陈良 科恩实验室高级研究员

2018 年6 月于上海

推荐序二

自2008 年Google 发布Android 的第一版以来,时至今日,无论是在系统特性,用户规模还是生态规模上,它都取得了惊人的进展,获得了移动操作系统领域的绝对优势。Android 是开源的,这对于任何想要一探究竟的人都提供了非常大的便利,但同时由于Android 系统本身日趋复杂,对大家也是个很大的挑战——一不小心就会陷进代码的汪洋大海之中。

Jonathan Levin 作为操作系统领域的专家,依赖自己深厚的技术功底和多年的研究,独辟蹊径地分别从高级用户和开发者的角度来探索Android 系统。读者手上的这本书是从高级用户的角度开始Android 的探索之旅的。这本书我首先接触的是英文版,现在非常高兴看到这本书的中文版面世,能让更多的读者受益。

本书特别适合高级用户(MIUI 称这部分用户为发烧友)学习使用。目前不少手机用户对各种硬件拆机评测很熟悉,这本书有如一个软件拆解,作者有如庖丁解牛一般,把运行在手机中的Android 系统逐层拆解。在简要地介绍了Android 的版本演化历史之后,作者先从分区和文件系统开始,详细介绍了各个分区的作用,各个分区上存储的内容和数据,还用实验详细演示了如何制作一个刷机包。在介绍了这些静态的软件组成之后,作者开始详细探索这些静态的内容是如何动态工作的。书中以关键的init 进程作为切入点,详细阐述分析了Android 的启动过程;接着分析了启动过程中的关键服务:原生服务和Android 框架服务。操作系统有两个重要的角色:资源的协调者和服务的提供者。作者重点分析了servicemanager 和system_server 这两个进程,它们构成了Android 系统所扮演的两个角色的基石。

对Android 系统有一点了解的读者可能知道,Android 是基于Linux 内核的,那么Android和一个常用的Linux 系统有何不同?作者接下来就从一个Linux 用户的视角来观察和分析Android 系统,剥去构筑在Linux 内核之上的那层Android 外衣,让一个熟悉Linux 系统的人跃跃欲试:“我也能构建一个Android 系统”。本书最后概要性地讲述了一些Android 的安全机制,虽然只有短短的一章,但是非常清晰,尤其是对selinux 的描述。从上述的脉络可以看出,作者动静结合,抽丝剥茧一般把运行在手机里的Android 系统清晰地展示在大家眼前。

本书虽然是从高级用户的角度来探索Android 系统的,但也很适合Android 开发者,尤其是Android 系统工程师学习。要想剖析一个系统,得先了解使用它。这本书有如一盏指路明灯,让我们在Android 代码的汪洋大海之中始终明确前进的方向。略有遗憾地是这本书来得有点晚,使我们在学习Android 系统的过程中走过一些弯路,今天的读者可以幸运地站在大师的肩膀上了!在小米MIUI,我们也打算使用其中的部分内容作为内部培训。如果您正好打开本书看到了这篇序,诚邀您一起开始我们的Android 系统探索之旅,这将是一个妙趣横生的旅程。谢谢!

汪文俊,MIUI 系统平台部总经理

2018 年6 月


译者序

市面上关于Android 的书籍可谓汗牛充栋,我甚至都不敢把书名Android Internals 按照惯例译为《深入理解Android 系统》——重名的书太多了。那么为什么还要把这本书介绍给国内的读者呢?因为市面上绝大多数的Android 书籍都是从程序员的视角展开的,入门的门槛相对比较高。尽管开发Android App 的程序员们自然应该对Android 系统有一个深入的理解,但这并不意味着其他人并不需要理解Android 系统。比如,电子取证人员,他们需要对Android 中的文件系统及数据存放位置有一个清晰的认识,以便从中提取相关数据;喜欢折腾的技术发烧友,root 掉系统之后一般都喜欢自己修改一下系统,比如禁用一些开机启动项之类的。如果无需依赖额外的App,只需一个文本编辑器就能完成相关修改,甚至给系统换上自己的开机动画岂不是很酷……诸如此类。但这些人中只有很少的一部分接受过正规的编程训练,因此市面上大部分的书籍对他们来说难度就太大了。

本书的作者Jonathan Levin,也是畅销书Mac OS X and iOS Internals: To the Apple's Core(中文版为《深入解析Mac OS X & iOS 操作系统》)一书的作者。按Jonathan 自己的说法,Mac OSX and iOS Internals: To the Apple's Core 一书的读者反馈中,反映最激烈的问题是:太技术化了!许多读者读起来感到头大!所以在这本后继的Android Internals 中,他把不需要代码就能表达清晰以及与开发人员关系不太紧密的部分放在这一本书中,而把剩下的、与开发紧密相关的部分放在了另一本书中。这一点从本书英文版的副标题“for Power User”就可以看出来。那么什么是“Power User”呢?如果一定要和传统的桌面系统的用户相对应,这个“Power User”就相当于系统管理员(administrator)的角色。相对于普通用户,他需要对系统有更加深入的理解,能对系统进行更加详细的配置,因而也被认为可以拥有较高的权限(比如root)——本书的部分实验确实需要拥有root 权限,且第8 章中也专用了一个小节讨论root 这一主题。

有人问,既然是讲系统内部实现,不讲编程又是如何把它讲清楚的呢?答案是使用实验。本书的内容是根据作者多年讲课的讲义,整理、精选1而来,通过在ADB(Android 调试桥)中执行各种命令的方式(相对于阅读代码),比较直观地向读者揭示Android 内部的工作原理。效果如何呢?别看广告,看疗效。上次曝出的CIA Value7 的相关内容显示,这本书已经被CIA 私下盗版,用于CIA 特工的内部培训了。而可怜的Jonathan Levin 既不敢告CIA 侵权,又不能告WikiLeaks……,只好在本书官网上提供了已经被泄密的2015 年6 月版的英文版的免费下载链接——与其去WikiLeaks 下载,不如上官网下载。不过读者也不必沮丧,自我2015 年10 月开始本书的翻译以来,几乎每个季度都会收到Jonathan Levin 发来的大量更新——其中包括历次Android 系统更新的新内容,以及书中已经发现的一部分错误的更新(包括一些我发现的错误:)),搞的我也不得不多次将译稿做一些必要的返工,目前出版的中文译本是以2016 年11 月底的最新版本为准(更新至Android Marshmallow PR1 版)的,您大可不必担心白花银子。

在本书的翻译过程中,我们力求将原文准确、清晰地翻译成中文。有模糊不清之处,我们尽量通过与作者沟通、阅读源码和实验的方式搞清楚。但各类缩写还是本着忠实原文的原则,沿用原文的写法。如在本书中,Android JellyBean 版会被缩写成J 版或JB 版,Android Lollipop版会被缩写成L 版,Android Marshmallow 版会被缩写成M 版等。

本书由上海公安学院的教师教官完成翻译,第一章由殷方老师翻译,第二章由王宏老师翻译,其余章节由我翻译,全书由我统一校对,并经本书作者Jonathan Levin 及其国内合作培训公司的同志审校。

最后感谢电子工业出版社刘皎老师在本书翻译过程中给予我们的有力帮助,感谢腾讯公司科恩实验室吴石、陈良、赵泽光等老师给本书初稿提出的宝贵意见。

囿于译者水平有限,书中必然存在疏漏之处,敬请读者不吝指正。

崔孝晨

2018 年6 月


目录

关于本书 XIV

第1 章 Android 体系结构的变革之路 1

1.1 Android 系统版本的历史变迁 2

Froyo(冻酸奶) 3

Gingerbread(姜饼人) 3

Honeycomb(蜂巢) 4

Ice Cream Sandwich(冰激凌三明治) 5

JellyBean(果冻豆) 5

KitKat(奇巧) 6

Lollipop(棒棒糖) 7

Marshmallow(棉花糖) 8

Nougat(牛轧糖) 9

1.2 Android 与Linux 11

并非另一个Linux 发布版本 11

然后Android 就登场了 12

与Linux 的异同 13

Android 的框架 15

Dalvik 虚拟机 18

JNI 19

原生二进制可执行文件 20

Bionic 22

Android 的原生库 25

源自其他项目的原生库 27

硬件抽象层 28

Linux 内核 29

1.3 Android 的衍生产品 30

谷歌官方的衍生产品 30

非谷歌官方的衍生品 33

1.4 对前方道路的思考 36

兼容64 位 36

ART(Android 运行时) 37

多画面 38

把Android 用作台式机操作系统 38

Android 和ARA 项目 39

Brillo 40

本章小结 40

参考文献 41

第2 章 Android 的分区和文件系统 43

2.1 分区架构 43

需要许多单独分区的原因 44

GUID 分区表 45

闪存(Flash Storage)系统 46

文件系统 46

Android 设备中的分区 49

2.2 Android 文件系统中存储的内容 53

root 文件系统 53

/system 分区 54

/data 分区 65

/cache 分区 71

/vendor 目录 72

SD 卡 73

2.3 受保护的文件系统 74

OBB:Opaque Binary Blobs 74

ASec:Android 安全存储(Android Secure Storage) 76

2.4 Linux 伪文件系统 78

cgroupfs 78

debugfs 79

functionfs(/dev/usb-ffs/adb) 80

procfs(/proc) 81

pstore(/sys/fs/pstore) 81

selinuxfs(/sys/fs/selinux) 82

sysfs(/sys) 83

本章小结 84

参考文献 84

第3 章 Android 的启动、备份和重置 86

3.1 Android 系统镜像 87

Boot Loader 89

Boot 镜像 93

内核 95

RAM disk 97

/System 和/Data 分区镜像 99

3.2 启动过程 101

固件启动过程 101

内核启动过程 105

3.3 关机和重启 109

3.4 应用的备份和恢复 112

命令行工具 113

本地备份 114

监视备份操作 117

3.5 系统重置(recovery)和升级 119

OTA(Over-The-Air)升级包 121

制作你自己的ROM 124

制作ROM 时可用的网上资源 128

本章小结 130

参考文献 130

第4 章 init 132

4.1 init 的角色和任务 132

系统属性 134

.rc 文件 140

总结:init 的执行流程 146

4.2 init 和USB 150

4.3 init 的其他角色 152

ueventd 153

watchdogd 154

本章小结 154

XIV ┃ 最强Android 书:架构大剖析

本章讨论所涉及的文件 155

第5 章 Android 的守护进程 156

5.1 core 类中的服务 156

adbd 156

servicemanager 160

healthd 161

lmkd(Android L) 165

logd(Android L) 168

vold 173

5.2 网络相关服务 182

netd 182

mdnsd 187

mtpd 187

racoon 188

rild 189

5.3 图形及多媒体服务 190

surfaceflinger 190

bootanimation 192

mediaserver 194

drmserver 196

5.4 其他服务 197

installd 197

keystore 200

debuggerd[64] 204

gatekeeper(Android M) 207

sdcard 208

Zygote[64] 211

本章小结 214

本章讨论涉及的文件 214

参考文献 215

第6 章 框架服务的架构 216

6.1 再探servicemanager 217

6.2 服务调用的模式 222

优点和缺点 224

序列化和Android 接口定义语言(AIDL) 225

6.3 Binder 228

简明历史 228

那么,Binder 究竟是什么 229

使用Binder 230

分析Binder 的当前使用情况 231

6.4 system_server 232

启动及执行流程 232

修改启动时的行为 234

本章小结 237

本章讨论涉及的文件 237

参考文献 237

第7章 从Linux 角度看Android 238

7.1 重温/proc 239

符号链接:cwd、exe 和root 240

fd 243

fdinfo 245

status 247

7.2 用户模式内存管理 254

虚拟内存的分类和生命周期 254

内存的相关术语 258

内存不足时的应对方案 266

7.3 跟踪系统调用 269

toolbox ps 工具 269

wchan 和syscall 文件 270

strace 工具 271

本章小结 272

参考文献 272

第8 章 Android 安全性 274

8.1 移动安全威胁建模 275

攻击向量 275

攻击之道 278

8.2 Linux 层上的安全措施 281

Android 使用Linux 权限的方式 281

Linux 权能 289

SELinux 294

其他值得注意的特性 301

8.3 Dalvik 层上的安全措施 305

Dalvik 层上的权限 305

Dalvik 代码签名 310

8.4 用户层上的安全措施 312

锁屏机制 312

支持多用户 316

密钥管理 318

证书管理 318

密钥和私钥管理 322

8.5 存储安全 323

加密/data 分区 323

基于文件的加密(Nougat 7.1) 326

Direct Boot (Nougat 的新特性) 326

启动过程中加强验证 327

8.6 Root Android 设备 328

在设备启动环节中root 329

利用安全漏洞root 331

Root 对安全的影响 332

本章小结 334

参考文献 334

产品特色