Android系统-开篇

anyi234 8年前
   <blockquote>     <p>基于Android 6.0源码,深入剖析Android系统架构,争取各个击破,解决和分析问题,方能入庖丁解牛,游刃有余。</p>    </blockquote>    <h2>一、Android概述</h2>    <p>Android系统非常庞大,底层是采用Linux作为基底,上层采用带有虚拟机的Java层,通过通过JNI技术,将上下打通,融为一体。下图是Google提供的一张经典的4层架构图,从下往上,依次分为Linux内核,系统库和Android Runtime,应用框架层,应用程序层这4层架构,每一层都包含大量的子模块或子系统。</p>    <p><img alt="Android系统-开篇" src="https://simg.open-open.com/show/caee07ad9295be3d40456c0b100d174c.png" width="727" height="600"></p>    <p>为了能够更深入地掌握Android整个架构思想,以及每块之间是如何衔接与配合工作的,计划以Android系统启动过程为主线,来详细展开对Android全方位的分析,争取各个击破。</p>    <h2>二、系统启动</h2>    <p>Google提供的4层架构图,是非常经典,但只是如垒砖般的方式,简单地分层,而不足表达Android整个系统的启动过程,环环相扣的连接关系,本文更多的是以进程的视角,以分层的架构来诠释Android系统的全貌。</p>    <p>系统启动架构图</p>    <p><img alt="Android系统-开篇" src="https://simg.open-open.com/show/ad81c47cfc296034e1601ad0a60d6c9d.jpg" width="890" height="767"></p>    <p>图解:Android系统启动过程由上图从下往上的一个过程:Loader -> Kernel -> Native -> Framework ->App,接来下简要说说每个过程:</p>    <h3>2.1 Loader层</h3>    <ul>     <li>Boot ROM: 当手机处于关机状态时,长按Power键开机,引导芯片开始从固化在<code>ROM</code>里的预设出代码开始执行,然后加载引导程序到<code>RAM</code>;</li>     <li>Boot Loader:这是启动Android系统之前的引导程序,主要是检查RAM,初始化硬件参数等功能。</li>    </ul>    <h3>2.2 Kernel层</h3>    <p>到这里才刚刚开始进入Android系统.</p>    <ul>     <li>启动Kernel的0号进程:初始化进程管理、内存管理,加载Display,Camera Driver,Binder Driver等相关工作;</li>     <li>启动kthreadd进程(pid=2):是Linux系统的内核进程,会创建内核工作线程kworkder,软中断线程ksoftirqd,thermal等内核守护进程。<code>kthreadd进程是所有内核进程的鼻祖</code>。</li>    </ul>    <h3>2.3 Native层</h3>    <p>启动init进程(pid=1),是Linux系统的用户进程,<code>init进程是所有用户进程的鼻祖</code>。</p>    <ul>     <li>init进程启动<code>Media Server</code>(多媒体服务)、<code>servicemanager</code>(binder服务管家)、<code>bootanim</code>(开机动画)等重要服务</li>     <li>init进程还会孵化出installd(用于App安装)、ueventd、adbd、lmkd(用于内存管理)等用户守护进程;</li>     <li>init进程孵化出Zygote进程,Zygote进程是Android系统的首个Java进程,<code>Zygote是所有Java进程的父进程</code>,Zygote进程本身是由init进程孵化而来的。</li>    </ul>    <h3>2.4 Framework层</h3>    <ul>     <li>Zygote进程,是由init进程通过解析init.rc文件后fork生成的,Zygote进程主要包含:      <ul>       <li>加载ZygoteInit类,注册Zygote Socket服务端套接字;</li>       <li>加载虚拟机;</li>       <li>preloadClasses;</li>       <li>preloadResouces;</li>      </ul> </li>     <li>Zygote进程fork出System Server进程,<code>System Server是Zygote孵化的第一个进程</code>,地位非常重要;</li>     <li>System Server进程:负责启动和管理整个Java framework,包含ActivityManager,PowerManager等服务。</li>     <li>Media Server进程:负责启动和管理整个C++ framework,包含AudioFlinger,Camera Service等服务。</li>    </ul>    <h3>2.5 App层</h3>    <ul>     <li>Zygote进程孵化出的第一个App进程是Launcher,这是用户看到的桌面App;</li>     <li>Zygote进程还会创建Browser,Phone,Email等App进程,每个App至少运行在一个进程上。</li>    </ul>    <p>所有的App进程都是由Zygote进程fork生成的。</p>    <h2>三、计划提纲</h2>    <p>2016年新的一年已经开始了,首先祝大家、也祝自己在新的一年诸事顺心,事业蒸蒸日上。在过去的一年,对于Android从底层一路到上层有不少自己的理解和沉淀,但总体较零散,未成体系。借着今天(元旦假日的最后一天),给自己的新的一年提前做一个计划,把知识进行归档整理与再学习,从而加深对Android架构的理解。通过前面对系统启动的介绍,相信大家对Android已然“知全貌”,那么接下来需要“抓核心,理思路”。</p>    <p>(1)在整个开机流程中,有几个非常重要的进程,分别是<code>init</code>、<code>Zygote</code>、<code>system_server</code>进程。接下来,计划用三篇文章来分别阐述:</p>    <ul>     <li><a href="http://www.open-open.com/lib/view/open1463014428697.html">Android系统启动—init篇</a></li>     <li><a href="http://www.open-open.com/lib/view/open1456803765078.html">Android系统启动—Zygote篇</a></li>     <li>Android系统启动—SystemServer篇      <ul>       <li><a href="http://www.open-open.com/lib/view/open1463014614192.html">SystemServer上篇</a></li>       <li><a href="http://www.open-open.com/lib/view/open1463014879470.html">SystemServer下篇</a></li>      </ul> </li>    </ul>    <p>(2)再则就是在整个架构中有大量的服务,都是基于Binder来交互的,为了搞清楚binder,用了13篇文章来讲解<a href="/misc/goto?guid=4959673002146492905">Binder</a>,从binder驱动到应用层整个完整的流程。针对比较核心服务来重点分析,计划分别用文章来对核心服务展开剖析:</p>    <ul>     <li>Android服务篇-ActivityManagerService      <ul>       <li><a href="/misc/goto?guid=4959673002239464124">AMS启动过程(一)</a></li>      </ul> </li>     <li>Android服务篇-PackageManagerService</li>     <li>Android服务篇-PowerManagerService</li>     <li>Android服务篇-BatteryService      <ul>       <li><a href="/misc/goto?guid=4959673002328964138">Android耗电统计算法</a></li>      </ul> </li>     <li>Android服务篇-WindowManagerService</li>    </ul>    <p>当然graphic也是一大块难啃的模块,也是需要整理的,先留个空位吧。</p>    <p>(3)对于App来说,Android应用的四大组件Activity,Service,Broadcast Receiver, Content Provider最为核心,那么我们需要分别展开对其他的分解:</p>    <ul>     <li>Android组件-Activity</li>     <li>Android组件-Service      <ul>       <li><a href="/misc/goto?guid=4959673002407051523">startService流程分析</a></li>      </ul> </li>     <li>Android组件-Broadcast Receiver</li>     <li>Android组件-Content Provider</li>    </ul>    <p>(4)有了这些,中间还缺少关于虚拟机ART的介绍,会需要对ART分析,后续还需要开展对ART虚拟机的一系列文章。另外,从架构中还有很多一块没有提及,那便是Linux Kernel,这部分内容,计划从进程,内存,IO的视角展开分析。</p>    <ul>     <li>Linux内核-进程篇      <ul>       <li><a href="/misc/goto?guid=4959673002489956143">进程的优先级</a></li>      </ul> </li>     <li>Linux内核-内存篇</li>     <li>Linux内核-IO篇</li>     <li>Linux内核-驱动篇</li>    </ul>    <p>(5)最后,对整个架构回顾,从性能角度谈谈如何优化的问题,这是一个很大的话题涉及面之广,会贯穿整个过程。</p>    <p>先写这么多,后续再不断更新与完善。</p>    <p>via:<a href="/misc/goto?guid=4959669985108446736">http://gityuan.com/2016/01/30/android-boot/</a></p>