今天推荐的是小米系统工程师 Gityuan 的专栏,解读 Android 系统架构,整个专栏最终将会有接近110篇深度技术解析,出版成书大概是两本500页左右的书籍厚度。

专栏介绍:这几年我对Android自下而上有了很多了解和沉淀,可以将自己的知识进行存档和再学习,从而加深对Android架构的理解。通过系统启动的介绍,相信大家对Android系统有一个整体的看法。接下来需要把握核心,管理思路,力求相互突破。从源代码的角度,带领大家看到Android系统架构;从App到框架,原生,甚至Linux内核;自上而下理解Android架构设计。

关于作者:Gityuan,安卓系统工程师,曾供职于IBM和联想,目前供职于小米MIUI系统集团

文章总数:深度技术分析近110篇,已出版书籍约2本,厚约500页。

专栏定位:基于Android 6.0的源代码,重点分享Android系统原理和架构分析的原创文章。

建议阅读群:适合从事或有兴趣研究Android系统的工程师或爱好者,也适合Android App的高级工程师;对于没有入门或者刚开始阅读的App程序员来说可能比较难,可能也不是很适合。

以下是专栏的第一篇文章《Android系统深度学习的开场》:文章中提到的一些蓝标文章是专栏文章,目前还不能点开,但订阅专栏后可以查看。

一.导言

Android系统非常庞大复杂,底层基于Linux,上层基于包含虚拟机和Native层的Java层,通过Syscall连接系统的内核空和用户空。用户空之间主要使用C++和Java代码,用户空之间通过JNI技术开放Java层和Native层,从而进行集成。

Google官方提供了一个经典的四层架构图,从下至上分为四层:Linux内核、系统库和Android运行时环境、框架层和应用层。每一层包含大量的子模块或子系统。只是像砖头一样分层,并没有表达出整个Android系统的内部架构、运行机制,以及各个模块是如何协同工作的。为了更深入的了解Android的整体架构以及各模块在Android系统中的地位和价值,计划以Android系统的启动流程为主线,从流程的角度解读Android M系统的全貌,全面分析各模块的功能,争取每一次突破。这样,我们就可以像解决问题、分析问题一样有技巧、有技巧。

第二,安卓架构

Google提供的4层架构图非常经典,但为了进一步看到Android系统架构,本文从流程和分层架构的角度解读了Android系统的全貌,并阐述了Android内部的链接。

系统启动架构图

插图:

Android系统启动过程是上图中自下而上的过程:loader-->:Kernel-->;原生->;框架->;App,下面简单说一下各个流程:

2.1装载机层

开机rom:手机关机时,按住Power键开机,开机芯片从固化在ROM中的预设代码开始执行,然后将开机程序加载到ram中;;

Boot Loader:这是安卓系统启动前的引导程序,主要检查ram,初始化硬件参数等功能。

2.2 Kernel层

内核层是指Android内核层,刚开始进入Android系统。

启动Kernel的swapper进程:这个进程也称为空闲进程,系统初始化进程中由Kernel发起的第一个进程用于初始化进程管理、内存管理、加载Display、Camera Driver、Binder Driver等相关工作;

启动kthreadd进程:是Linux系统的内核进程,会创建内核工作线程kworkder、软中断线程ksoftirqd、热等内核守护进程。kthreadd进程是所有内核进程的创始人。

2.3 Native层

这里的Native层主要包括init影线的user空之间的守护进程,HAL层和引导动画。启动init进程是Linux系统的一个用户进程,init进程是所有用户进程的发起者。

用户守护进程,如ueventd,logd,healthd,installd,adbd,lmkd等将由init进程孵化。

初始化过程还会启动一些重要的服务,比如servicemanager和bootanim

合子进程是从init进程孵化出来的,init进程是Android系统中第一个Java进程。合子是所有Java进程的父进程,合子进程本身是从init进程孵化出来的。

2.4 Framework层

合子过程由init过程解析init.rc fork后生成,合子过程主要包括:

加载合子套接字类,注册合子套接字服务器套接字;

加载虚拟机;

预加载类;

预加载资源.

系统服务器进程来自合子进程分叉。系统服务器是受精卵孵化的第一个过程。系统服务器负责启动和管理整个Java框架,包括ActivityManager、PowerManager等服务。

媒体服务器进程来自init进程分叉,负责启动和管理整个C++框架,包括AudioFlinger、Camera Service和其他服务。

2.5 App层

合子进程孵化的第一个App进程是启动器,是用户看到的桌面App;

合子进程还创建浏览器、电话、电子邮件和其他应用程序进程,每个应用程序至少运行一个进程。

所有的App进程都是由合子进程叉生成的。

2.6 Syscall && JNI

本机和内核之间有一个SysCall层,参见Linux Syscall原理;

Java层和Native层的链接JNI可以在Android JNI的原理分析中找到。

三、通信方式

无论是Android系统还是各种Linux衍生系统,各种组件和模块往往运行在各种进程和线程中,这就不可避免地涉及到进程/线程之间的通信。关于IPC,Linux有现有的管道、消息队列、共享内存、socket、信号量、信号等IPC机制,Android另外有Binder IPC机制,Android OS中合子进程的IPC采用Socket机制。在上层系统服务器、媒体服务器和上层App中,使用Binder IPC完成进程间通信。在Android上层架构中,经常需要同一个进程的线程之间进行通信,比如同一个进程的主线程和工作线程之间的通信,经常采用Handler消息机制。

要深入了解Android内核层架构,首先要深入了解Linux现有的IPC机制;对于Android上层架构,最常用的通信方式是Binder、Socket、Handler,但也有少数其他的IPC方式,比如用信号杀死Process.killProcess等。我们来谈谈Binder、Socket和Handler:

3.1粘合剂

Binder作为Android系统提供的IPC机制,是Android系统最重要的组成部分,也是最难理解的知识点。Android为什么要采用Binder作为IPC机制?你可以在知乎上查我的答案。深入理解Binder机制最好的方法就是阅读源代码,借用Linux鼻祖Linus Torvalds曾经说过的一句话:阅读该死的源代码。下面简单说说Binder IPC原理。

粘合剂IPC原理

Binder通信采用c/s架构。从组件的角度来看,它包括客户机、服务器、服务管理器和绑定驱动程序。ServiceManager用于管理系统中的各种服务。

如果想了解更多关于Binder的内容,可以查看Binder系列。一开始,Binder系列花了13篇文章,从驱动、原生、框架、App四个层面讲述了整个过程。根据部分读者反馈,这个系列还是比较难理解。这个活页夹涉及的层次跨度大,知识面广。建议你知道binder是用来进行进程间通信的,可以有个大概的概念。先学习系统的基础知识,有一定的技能后再进一步学习binder。

基本原理

序号文章名概述0Binder系列—开篇Binder概述1Binder系列3—启动Service ManagerServiceManager守护进程 注册和查询服务2Binder系列4—获取Service Manager获取代理对象BpServiceManager3Binder系列5—注册服务注册Media服务4Binder系列6—获取服务获取Media代理,以及DeathRecipient5Binder系列7—framework层分析framework层服务注册和查询,Binder注册6进程的 Binder 线程池工作过程Binder的startThreadPool过程7彻底理解Android Binder通信架构startService为主线8Binder系列10—总结Binder的简单总结9Binder IPC的权限控制clearCallingIdentity/restoreCallingIdentity10Binder死亡通知机制之linkToDeathBinder死亡通知机制

驱动文章:

序号文章名概述1Binder系列1—Binder Driver初探驱动open/mmap/ioctl,以及binder结构体2Binder系列2—Binder Driver再探Binder通信协议,内存机制

二手物品:

序号文章名概述1Binder系列8—如何使用BinderNative层、Framwrok层自定义Binder服务2Binder系列9—如何使用AIDLApp层自定义Binder服务3.2 Socket

套接字通信模式也是C/S架构,比Binder简单很多。Android系统中Socket通信的主要方法如下:

受精卵:用于孵化过程。当系统进程system_server孵化进程时,通过socket向合子进程发送请求。

Installd:用来安装App的守护进程,很多上层PackageManagerService的实现最后都交给了它;

Lmkd:lowmorykiller的守护进程,Java层的lowmorykiller最终由LMKD完成;

Adbd:不用说,这是用来服务亚行的;

Logcatd:不用说,这是用来伺候logcat的;

Vold:即volume Daemon,是存储类的守护进程,负责USB、sd卡等存储设备的事件处理。

诸如此类,这里不一一列举。Socket更多用于Android框架层和原生层的通信。相对于binder,Socket通讯很简单,所以没有写过相关文章。为了成为一个系统,下次再补。

3.3处理器

Binder/Socket用于进程间通信,而Handler Message机制用于进程间通信。处理程序消息机制由一组消息队列、消息、循环程序和处理程序组成,为方便起见,称为处理程序消息机制。

有些人可能会想,为什么用Binder/Socket进行进程间通信,能否用于线程间通信。答案是肯定的,可以用于地址独立的两个进程之间的通信空,也可以用于内存共享的两个线程之间的通信空,就像金刀杀鸡。那么有些人可能会怀疑处理器消息机制是否可以用于进程间通信。答案是否定的,Handler只能用于共享内存地址空的两个线程之间的通信,即同一个进程的两个线程之间的通信。很多时候,Handler是一个向UI主线程发送消息的工作线程,也就是说在App应用中只有主线程可以更新UI,其他工作线程往往会通过Handler告诉主线程,在完成相应的工作后需要进行相应的UI更新操作,Handler将相应的消息分发给UI主线程完成,如下图所示:

因为工作线程和主线程共享地址空,也就是Handler实例对象mHandler位于线程共享的内存堆上,所以工作线程和主线程都可以直接使用这个对象,只需要注意多线程的同步。工作线程通过mHandler向其成员变量MessageQueue添加一条新消息,主线程始终处于loop方法中。当接收到一个新的消息时,它会根据特定的处理规则被分发到相应的handleMessage方法。所以handler消息机制与进程进行线程间通信的核心是线程间的共享内存空,但是不同的进程有不同的地址空,所以无法使用Handler实现进程间通信。

上图只是处理程序消息机制的一个处理流程。有没有可能只有工作线程可以向UI主线程发送消息?实际上,可以是UI线程向工作线程发送消息,也可以是多个工作线程通过处理程序发送消息。关于处理程序消息机制的更多文章:

安卓消息机制——处理器

安卓消息机制——处理程序

安卓消息机制3-Handler

要理解框架层的源代码,需要掌握这三种进程和线程之间的基本通信方式。当然,Linux也有很多其他的IPC机制,比如共享内存、信号、信号量,这些也都体现在源代码中。想要彻底掌握Android系统,还是需要了解每一个IPCd机制。

四.核心大纲

在过去的一年里,Android自下而上有了很多的理解和沉淀,但是比较零散,不系统。给自己制定一个计划,把自己的知识存档并重新学习,加深对Android架构的理解。通过系统启动的介绍,相信大家对Android系统有一个整体的看法。接下来需要把握核心,管理思路,力求相互突破。

计划:很多文章还没来得及进一步加工。有读者给我反馈大章的源代码,看着很困。放心,文章会不断更新升级的。前期打算一边写专栏,一边整理系统所有核心技术点;

后期工作会有时间根据大家的反馈和自我验证对所有文章进行修改完善,争取文章,进一步精简非核心代码,增加可视化图表和文字的结论性分析。

专栏定位:基于Android 6.0的源代码,重点分享Android系统原理和架构分析的原创文章。

建议阅读群:适合从事或有兴趣研究Android系统的工程师或爱好者,也适合Android app的高级工程师;对于没有入门或者刚开始阅读的App程序员来说可能比较难,可能也不是很适合。

看到Android整个系统架构这么庞大,应该问一下如何学习Android系统?以下是我自己对Android的学习和研究理论,仅供参考:如何自学Android。

4.1系统启动系列

Android系统启动-概述:

Android系统中极其重要的进程:init、zygot、system _ server、servicemanager进程:

序号进程启动概述1init进程Linux系统中用户空间的第一个进程, Init.main2zygote进程所有App进程的父进程, ZygoteInit.main3system_server进程系统各大服务的载体, forkSystemServer过程4system_server进程系统各大服务的载体, SystemServer.main5servicemanager进程binder服务的大管家, 守护进程循环运行在binder_loop6app进程通过Process.start启动App进程, ActivityThread.main

让我们来看看守护进程。先介绍下面几个部分,然后增加后缀。

调试

已安装

lmkd

4.2系统稳定性系列

Android系统稳定性主要是异常崩溃和执行超时。安卓系统稳定性简介:

序号文章名概述1理解Android ANR的触发原理触发ANR的场景以及机理2Input系统—ANR原理分析input触发ANR的原理3理解Android ANR的信息收集过程AMS.appNotResponding过程分析,收集traces4ART虚拟机之Trace原理kill -3 信息收集过程5Native进程之Trace原理debuggerd -b 信息收集过程6WatchDog工作原理WatchDog触发机制7理解Java Crash处理流程AMS.handleApplicationCrash过程分析8理解Native Crash处理流程debuggerd守护进程4.3 Android进程系列

流程对于系统来说非常重要,各种服务和组件的载体都依赖于流程。对流程理解的越深入,就越能更好的掌握整个系统架构。因此,让我们首先来看看流程相关性:

序号文章名概述1理解Android进程创建流程Process.start过程分析2理解杀进程的实现原理Process.killProcess过程分析3Android四大组件与进程启动的关系AMS.startProcessLocked过程分析组件与进程4Android进程绝杀技--forceStopforce-stop过程分析彻底移除组件与杀进程5理解Android线程创建流程3种不同线程的创建过程6彻底理解Android Binder通信架构以start-service为线,阐述进程间通信机理7理解Binder线程池的管理Zygote fork的进程都默认开启binder线程池8Android进程生命周期与ADJ进程adj, processState以及lmk9Android LowMemoryKiller原理分析lmk原理分析10进程优先级进程nice,thread priority以及scheduler11Android进程调度之adj算法updateOomAdjLocked过程12Android进程整理整理系统的所有进程/线程4.4 四大组件系列

对于App来说,Android应用的四大组件:活动、服务、广播接收器和内容提供商是核心,然后分别介绍:

序号文章名类别1startActivity启动过程分析Activity2简述Activity生命周期Activity3startService启动过程分析Service4bindService启动过程分析Service5以Binder视角来看Service启动Service6Android Broadcast广播机制分析Broadcast7理解ContentProvider原理ContentProvider8ContentProvider引用计数ContentProvider9Activity与Service生命周期Activity&&Service10简述Activity与Window关系Activity&&Window11四大组件之综述AMS12四大组件之ServiceRecordService13四大组件之BroadcastRecordBroadcast14四大组件之ContentProviderRecordContentProvider15理解Android ContextContext16理解Application创建过程Application17Android类加载器ClassLoaderclassloader4.5 图形系统系列

图形也是整个系统非常复杂重要的一个系列,涉及到WindowManager,SurfaceFlinger。

序号文章名类别1WindowManager启动篇Window2WMS之启动窗口篇Window3以Window视角来看startActivityWindow4Android图形系统概述SurfaceFlinger5SurfaceFlinger启动篇SurfaceFlinger6SurfaceFlinger绘图篇SurfaceFlinger7Choreographer原理Choreographer4.6 系统服务篇

而且整个架构中有大量的服务,都是基于Binder进行交互的。计划重点关注一些核心服务:

系统服务的注册流程见Android系统服务的注册方式

医疗辅助队服务

医疗辅助队启动程序

更多组件

输入系统

输入系统-启动章节

输入系统-—输入线程

输入系统-—InputDispatcher线程

输入系统-用户界面线程

输入系统-过程交互

输入系统分析——ANR原理

PKMS服务

PackageManager启动文章

Installd守护程序

报警服务

理解警报管理器机制

作业调度程序服务

理解作业调度机制

电池服务

安卓功耗统计算法

项目管理系统服务

DropBox服务

DropBoxManager启动

用户管理服务

多用户管理用户管理器

请期待更多的服务介绍...

4.7 内存&&存储篇

记忆文章

安卓低内存打印机原理分析

Linux内存管理

Android内存分析命令

存储物品

Android存储系统源代码

安卓存储系统架构

Linux驱动程序

敬请关注

达尔维克/艺术

ART虚拟机的跟踪原理

4.8 工具篇

最后说说一些与Android相关的常用命令、工具和调试方法。

序号文章名类别1理解Android编译命令build2性能工具Systracesystrace3Android内存分析命令Memory4ps进程命令Process5Am命令用法Am6Pm命令用法Pm7调试系列1:bugreport源码篇bugreport8调试系列2:bugreport实战篇bugreport9dumpsys命令用法dumpsys

计划:继续补充完善整个大纲,不限于关于进程、内存、IO、系统服务框架、整体架构以及各种系统分析和实战的文章。

这个栏目会不断更新,互相突破。本文最新更新时间为2017年8月29日。

一本书100元出版需要500页左右,两本至少超过150元。作者可以得到的版税可能是8-10元。如果做成网上专栏,读者阅读更方便,作者可以获得更多稿费。扫描下面的二维码,关注订阅。

最后推荐其他有趣的栏目,选一个自己喜欢的。如果你对某一领域有深入的研究,欢迎开设自己的专栏分享你的观点

1.《android系统 Android开发工程师进阶指南:深入研究Android系统开篇》援引自互联网,旨在传递更多网络信息知识,仅代表作者本人观点,与本网站无关,侵删请联系页脚下方联系方式。

2.《android系统 Android开发工程师进阶指南:深入研究Android系统开篇》仅供读者参考,本网站未对该内容进行证实,对其原创性、真实性、完整性、及时性不作任何保证。

3.文章转载时请保留本站内容来源地址,https://www.lu-xu.com/guonei/1799556.html