首页 体育世界 正文

ps5,把握 Android 系统架构,看这两篇就可以了!| 工艺企鹅号,年终工作总结

Android体系巨大且扑朔迷离,本文作者Gityuan将带领我们初探Android体系全体架构,一窥其全貌。

作者 | 袁辉辉

本文经授权转载自Android达摩院(ID:gityuanblog)

导言

本文作为Android体系架构的开篇,起到纲举目张的效果,从体系全体架构视点概要解说Android体系的中心技能点,带领我们初探Android体系全貌以及内部运作机制。尽管Android体系十分巨大且扑朔迷离,需求具有全面的技能栈,但全体架构规划明晰。Android底层内核空间以Linux Kernel作为柱石,上层用户空间由Native体系库、虚拟机作业环境、结构层组成,经过体系调用(Syscall)连通体系的内核空间与用户空间。关于用户空间首要选用C++和Java代码编写,经过JNI技能打通用户空间的Java层和Native层(C++/C),然后连通整个体系。

为了能让我们全体上大致了解Android体系触及的常识层面,先鱼刺卡在嗓子怎么办来看一张Google官方供给的经典分层架构图,从下往上顺次分为Linux内核、HAL、体系Native库和Android作业时环境、Java结构层以及运用层这5层架构,其间每一层都包含许多的子模块或子体系。

上图选用静态分层办法的架构区分,众所周知,程序代码是死的,体系作业是活的,各模块代码作业在不同的进程(线程)中,彼此之间进行着各种错终杂乱的信息传递与交互流,从这个视点来说此图并没能表现Android整个体系的内部架构、作业机理,以及各个模块之间是怎么联接与合作作业的。为了更深化地掌握Android整个架构思维以及各个模块在Android体系所在的位置与价值,方案以Android体系发动进程为主线,以进程的视角来诠释Android M体系全貌,全方位的深度分析各个模块功用,争夺各个击破。这样才干犹如庖丁解牛,处理、分析问题则能挥洒自如。

Android架构

Google供给的5层架构图很经典,但为了更进一步透视Aps5,掌握 Android 体系架构,看这两篇就可以了!| 工艺企鹅号,年终作业总结ndroid体系架构,本文更多的是以进程的视角,以分层的架构来诠释Android体系的全貌,论述Android内部的环环相扣的内在联络。

体系发动架构图

图解:Android体系发动进程由上图从下往上的一个进程是由Boot Loader引导开机,然后顺次进入 -> Kernel -> Native -> Framework -> App,接来下扼要说说每个进程:

关于Loader层:

  • Boot ROM: 当手机处于关机状况时,长按Power键开机,引导芯片开端从固化在 ROM里的预设代码开端履行,然后加载引导程序到 RAM;
  • Boot Loader:这是启ps5,掌握 Android 体系架构,看这两篇就可以了!| 工艺企鹅号,年终作业总结动Android体系之前的引导程序,首要是检查RAM,初始化硬件参数等功用。

2.1 Linux内核层

Android渠道的根底是Linux内核,比方ART虚拟机终究调用底层Linux内核来履行功用。Linux内核的安全机制为Android供给相应的保证,也答应设备制造商为内核开发硬件驱动程序。

  • 发动Kernel的swapper进程(pid=0):该进程又称为idle进程, 体系初始化进程Kernel由无到有创始的第一个进程, 用于初始化进程办理、内存办理,加载Display,Camera Driver,Binder Driver等相关作业;
  • 发动kthreadd进程(pid=2):是Linux体系的内核进程,会创立内核作业线程kworkder,软中止线程ksoftirqd,thermal等内核看护进程。 kthreadd进程是一切内核进程的鼻ps5,掌握 Android 体系架构,看这两篇就可以了!| 工艺企鹅号,年终作业总结祖。

2.2 硬件笼统层 (HAL)

硬件笼统层 (HAL) 供给标准接口,HAL包含多个库模块,其间每个模块都为特定类型的硬件组件完结一组接口,比方WIFI/蓝牙模块,当结构API恳求拜访设备硬件时,Android体系将为该硬件加载相应的库模块。

2.3 Android Runtime & 体系库

每个运用都在其自己的进程中作业,都有自己的虚拟机实例。ART经过履行DEX文件可在设备作业多个虚拟机,DEX文件是一种专为Android规划的字节码格式文件,经过优化,运用内存很少。ART首要功用包含:预先(AOT)和即时(JIT)编译,优化的废物收回(GC),以及调试相关的支撑。

这儿的Native体系库首要包含init孵化来的用户空间的看护进程、HAL层以及开机动画等。发动init进程(pid=1),是Linux体系的用户进程, init进程是一切用户进程的开山祖师。

  • init进程会孵化出ueventd、logd、healthd、installd、adbd、lmkd等用户看护进程;
  • init进程还发动 servicemanager(binder效劳管家)、 bootanim(开机动画)等重要效劳
  • init进程孵化出Zygote进程,Zygote进程是Android体系的第一个Java进程(即虚拟机进程), Zygote是一切Java进程的父进程,Zygote进程自身是由init进程孵化而来的。

2.4 Framework层

  • Zygote进程,是由init进程经过解析init.rc文件后fork生成的,Zygote进程首要包含:
  • 加载ZygoteInit类,注册Zygote Socket效劳端套接字
  • 加载虚拟机
  • 提早加载类preloadClasses
  • 提早加载资源preloadResouces
  • System Server进程,是由Zygote进程fork而来, SystemServer是Zygote孵化的第一个进程,System Server担任发动和办理整个Java framework,包含ActivityManager,WindowManager,PackageManager,PowerManager等效劳。
  • Media Server进程,是由init进程fork而来,担任发动和办理整个C++ framework,包含AudioFlinger,Camera Service等效劳。

2.5 App层

  • Zygote进程孵化出的第一个App进程是Launcher,这是用户看到的桌面App;
  • Zygote进程还会创立Browser,Phone,Email等App进程,每个App至少作业在一个进程上。
  • 一切的App进程都是由Zygote进程fork生成的。

2.6 Syscall && JNI

  • Native与Kernel之间有一层体系调用(SysCall)层,见Linux体系灌篮之灿烂生计调用(Syscall)原理;
  • Java层与Native(C/C++)层之间的枢纽JNI,见Android JNI原理分析。

通讯办法

不管是Android体系,仍是各种Linux衍生体系,各个组件、模块往往作业在各种不同的进程和线程内,这儿就必定触及进程/线程之间的通讯。关于IPC(Inter-Process Communication, 进程间通讯),Linux现有管道、音讯行列、同享内存、套接字、信号量、信号这些IPC机制,Android额定还有Binder IPC机制,Android OS中的Zygote进程的IPC选用的是Socket机制,在上层system server、media server以及上层App之间更上龙多的是选用Binder IPC办法来完结跨进程间的通讯。关于Android上层架构中,许多时分是在同一个进程的线程之间需求彼此通讯,例如同一个进程的主线程与作业线程之间的通讯,往往选用的Handler音讯机制。

想深化了解Android内核层架构,必须先深化了解Linux现有的IPC机制;关于Android上层架构,则最常用的通讯办法是Binder、Socket、Handler,当然也有少数其他的IPC办法,比方杀进程Process.killProcess()选用的是signal办法。下面说说Binder、Socket、Handler:

3.1 Binder

Binder作为Android体系供给的一种IPC机制,不管从体系开发仍是运用开发,都是Android体系中最重要的组成,也是最难了解的一块常识点,想了解为什么Android要选用Binder作为IPC机制? 可检查我在知乎上的答复(https://www.zhihu.com/question/39440766/answer/89210950)。深化了解Binder机制,最好的办法便是阅览源码,借用Linux开山祖师Linus Torvalds曾说过的一句话:Read The Fucking Source Code。下面扼要说说Binder IPC原理。

Binder IPC原理

Binder通讯选用c/s架构,从组件视角来说,包含Client、Server、ServiceManager以及binder驱动,其间ServiceManager用于办理体系中的各种效劳。

想进一步了解Binder,可检查Binder系列—开篇(http://gityuan.com/2015/10/31/binder-prepare/),Binder系列花费了13篇文章的篇幅,从源码视点动身来叙述Driver、Native、Framework、App四个层面的整个完好流程。依据有些读者反应这个系列仍是欠好了解,这个binder触及的层次跨度比较大,常识量比较广,主张我们先知道binder是用于进程间通讯,有个大致概念就可以先去学习体系根本常识,等后边有必定功力再进一步深化研讨Binder机制。

Binder原理篇(详细文章地址可详见:http://gityuan.com/android/)

序号文章慕容承慕紫名概述0Binder系列—开篇Binder概述1Binder系列3—发动Service ManagerServiceManager看护进程 注册和查询效劳2Binder系列4—获取Service Manager获取署理目标BpServiceManager3Binder系列5—注册效劳(addService)注册Media效劳玄灵界4Binder系列6—获取效劳(getService)获取Media署理,以及DeathRecipient5Binder系列7—framework层分析framework层效劳注册和查询,Binder注册6了解Binder线程池的办理Binder的startThreadPool进程7完全了解Android Binder通讯架构startService为主线8Binder系列10—总结Binder的简略总结9Binder IPC的权限操控clearCallingIdentity/restoreCallingIdentity10Binder逝世告诉机制之linkToDeathBinder逝世告诉机制

Binder驱动篇:

1Binder Driver初探驱动open/mmap/ioctl,以及binder结构体2Binder Driver再探Binder通讯协议,内存机制

Binder运用篇:

1怎么运用BinderNative层、Framwrok层自定义Binder效劳2怎么运用AIDLApp层自定义Binder效劳

3.2 Socket

Socket通讯办法也是C/S架构,比Binder简略许多。在Android体系中选用Socket通讯办法的首要有:

  • zygote:用于孵化进程,system_server创立进程是经过socket向zygote进程主张恳求;
  • installd:用于装置App的看护进程,上层PackageMa老井nagerService许多完结终究都是交给它来完结;
  • lmkd:lowmemorykiller的看护进程,Java层的LowMemoryKiller终究都是由lmkd来完结;
  • adbd:这个也不用说,用于效劳adb;
  • logcatd:这个不用说,用于效劳logcat;
  • vold:即volume Daemon,是存储类的看护进程,用于担任如USB、Sdcard等存储设备的事情处理。

等等还有许多,这儿不一一罗列,Socket办法更多的用于Android framework层与native层之间的通讯。Socket通讯办法相关于binder比较简略,这儿省掉。

3.3 Handler

Bind才智之圣甲虫像er/Socket用于进程间通讯,而Handler音讯机制用于同进程的线程间通讯,Handler音讯机制是由一组MessageQueue、Message、Looper、Handler一起组成的,为了便利且称之为Handler音讯机制。

有人或许会疑问,为何Binder/Socket用于进程间通讯,能否用于线程direction间通讯呢?答案是必定,关于两个具有独立地址空间的进程通讯都可以,当然也能用于同享内存空间的两个线程间通讯,这就比方杀鸡用牛刀。接着或许还有人会疑问,那handler音讯机制能否用于进程间通讯?答案是不能,Handler只能用于同享内存地址空间的两个线程间通讯,即同进程的两个线程间通讯。许多时分,Handler是作业线程向UI主线程发送音讯,即App运用中只要主线程能更新UI,其他作业线程往往是完结相应作业后,经过Handler奉告主线程需求做出相应地UI更新操作,Handler分发相应的音讯给UI主线程去完结,如下图:

因为作业线程与主线程同享地址空间,即Handler实例目标mHandler坐落线程间同享的内存堆上,作业线程与主线程都能直接运用该目标,只需求注意多线程的同步问题。作业线程经过m车标志大全Handler向其成员变量MessageQueue中添加新Message,主线程一向处于loop()办法内,当收到新的Message时依照必定规矩分发给相应的handleMessage()办法来处理。所以说,Handler音讯机制用于同进程的线程间通讯,其中心是线程间同享内存空间,而不同进程具有不同的地址空间,也就不能用handler来完结进程间通讯。

上图仅仅Handler音讯机制的一种处理流程,是不是只能作业线程向UI主线程发音讯呢,其实不然,可所以UI线程向作业线程发送音讯,也可所以多个作业线程之间经过handler发送音讯。更多关于Handler音讯机制文章:

  • Android音讯机制-Handler(framework篇)(http://gityuan.com/2015/12/26/handler-message-framework/)
  • Android音讯机制-Handler(native篇)(http://gityuan.com/2015/12/27/handler-message-native/)
  • Android音讯机制3-Handler(实战)(http://gityuan.com/2016/01/01/handler-message-usage/)

要了解framework层源码,掌握这3种根本的进程/线程间通讯办法是十分有必要,当然Linux还有不少其他的IPC机制,比方同享内存、信号、信号量,在源码中也有表现,假如想全面完全地掌握Android体系,仍是需求对每一种IPC机制都有所了解。

中心提纲

博主关于Android从体系底层一路到上层都有自己的了解和沉积,经过前面临体系发动的介绍,信任我们对Android体系有了一个全体观。接下来需抓中心、理思路,争夺各个击破。后续将继续更新和完善整个纲要,不限于进程、内存、IO、体系效劳架构以及分析实战等文章。

当然本站有一些文章没来得及进一步加工,有时间依据我们的反应,不断修正和完善一切文章,争夺给文章,再进一步精简非中心代码,添加可视化图表以及文字的结论性分析。根据Android 6.0的源码,专心于共享Android体系原理、架构分析的ps5,掌握 Android 体系架构,看这两篇就可以了!| 工艺企鹅号,年终作业总结原创文章。

主张阅览集体: 合适于正从事或许有爱好研讨Android体系的工程师或许技能爱好者,也合适Android App高级工程师;关于没有入门或许刚入门的App工程师阅览或许会有点困难,主张先阅览更根底的材料,再来阅览本站博客。

看到Android整个体系架构是如此巨大的, 该问怎么学习Android体系, 以下是我自己的Android的学习和研讨论,仅供参阅怎么自学Android(http://gityuan.com/2016/04/24/how-to-study-android/)。

从收拾上来罗列一下Android体系的中心常识点概览:

4.1 体系发动系列

Android体系发动-概述:

链接地址:http://gityuan.com/2016/02/01/android-booting/

Andro桐庐天气预报id体系中极其重要进程:init, zygote, system_server, servicemanager 进程:

序号进程发动概述1init进程Linux体系中用户空间的第一个进程, Init.main2zygote进程一切App进程的父进程, ZygoteInit.main3system_server进程(上篇)体系各大效劳的载体, forkSystemServer进程4system_server进程(下篇)体系各大效劳的载体, SystemServer.main5servicemanager进程binder效劳的大管家, 看护进程循环作业在binder_loop6App进程经过Process.start发动App进程, ActivityThread.main

再来看看看护进程(也便是进程名一般以d为后缀,比方logd,此处d是指daemon的简称), 下面介绍部分看护进程:

  • debuggerd
  • installd
  • lmkd
  • logd

4.2 体系稳定性系列

Android体系稳定性首要是反常溃散(crash)和履行超时(timeout):

链接地址:http://gityuan.com/2016/06/19/stability_summary/

序号文章名概述1了解Android ANR的触发原理触发ANR的场景以及机理2Input体系—ANR原理分析input触发ANR的原理3了解Android ANR的信息搜集进程AMS.appNotResponding进程分析,搜集traces4解读Java进程的Trace文件kill -3 信息搜集进程5Native进程之Trace原理debuggerd -b 信息搜集进程6WatchDog作业原理WatchDog触发机制7了解Java Crash处理流程AMS.handleApplicationCrash进程分析8了解Native Crash处理流程debuggerd看护进程9global reference约束战略global reference

4.3 Android进程系列

进程/线程是操作体系的魂,各种效劳、组件、子体系都是依附于详细的进程实体。深化了解进程机制关于掌握Android体系全体架构和作业机制是十分有必要的,是体系工程师的根本功,下面罗列进程相关的文章:

序号文章名概述1了解Android进程创立流程Process.start进程分析2了解杀进程的完结原理Process.killProcess进程分析3Android四大组件与进程发动的联络AMS.startProcessLocked过ps5,掌握 Android 体系架构,看这两篇就可以了!| 工艺企鹅号,年终作业总结程分析组件与进程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运用的四大组件Activity,Service,Broadcast Receiver, Content Provider最为中心快穿辣文,接下别离打开介绍:

序号文章名类别1startActivity发动进程分析Activity2简述Activity生命周期Activity3startService发动进程分析Service4bindService发动进程分析Service5以Binder视角来看Service发动Service6Android Broadcast播送机制分析Broadcast7了解ContentProvider原理ContentProvider8ContentProvider引证计数ContentProvider9Activity与Service生命周期Activity&&Service10简述Activi毛岸红ty与Window联络Activity&&Window11四大组件之总述AMS12四大迷仙镇案组件之ServiceRecor马冬梅dService13四大组件之BroadcastRecordBroadcast14四大组件之ContentProviderRecordContentProvider15了解Android ContextContext16了解Application创立进程Application17unbindService流程分析Service18四大组件之ActivityRecordActivity19AMS总结(一)AMS

4.5 图形体系系列

图形也是整个体系十分杂乱且重要的一个系列,触及WindowManager,SurfaceFlinger效劳。

序号文章名类别1WindowManager发动篇(http://gityuan.com/2017/01/08/windowmanger/)Window2WMS之发动窗口篇(http://gityuan.com/2017/01/15/wms_starting_window/)Window3以Window视角来看startActivity(http://gityuan.com/2017/01/22/start-activity-wms/)Window4Android图形体系概述(http://gityuan.com/2017/02/05/graphic_arch/)SurfaceFlinger5SurfaceFlinger启江宏杰动篇(h搬搬网ttp://gityuan.com/2017/02/11/surface_flinger/)SurfaceFlinger6SurfaceFlinger绘图篇(http://gityuan.com/2017/02/18/surface_flinger_2/)SurfaceFlinger7Choreographer原理(http://gityuan.com/2017/02/25/choreographer/)Choreographer

4.6 体系效劳篇

再则便是在整个架构中有许多的效劳,都是根据Binder来交互的,Android体系效劳的注册进程也是在此之上的构建的。方案针对部分中心效劳来要点分析:

  • AMS效劳
  • AMS发动进程(一)(http://gityuan.com/2016/02/21/activity-manager-service/)
  • 更多组件篇[见末节4.3]
  • Input体系
  • Input体系—发动篇(http://gityuan.com/2016/12/10/input-manager/)
  • Input体系—InputReader线程(http://g膺ityuan.com/2016/12/11/input-reader/)
  • Input体系—InputDispatcher线程(http://gityuan.com/2016/12/17/input-dispatcher/)
  • Input体系—UI线程(http://gityuan.com/2016/12/24/input-ui/)
  • Input体系—进程交互(http://gityuan.com/2016/12/31/input-ipc/)
  • Input体系—ANR原理分析(http://gityuan.com/2017/01/01/input-anr/)
  • PKMS效劳
  • PackageManager发动篇(http://gityuan.com/2016/11/06/packagemanagerservice)
  • Installd看护进程(http://gityuan.com/2016/11/13/android-installd)
  • Alarm效劳
  • 了解AlarmManager机制(http://gityuan.com/2017/03/12/alarm_manager_service/)
  • JobScheduler效劳
  • 了解JobScheduler机制(http://gityuan.com/2017/03/10/job_scheduler_service/)
  • BatteryService
  • Android耗电统计算法(http://gityuan.com/2016/01/10/power_rank/)
  • PMS效劳
  • DropBox效劳
  • DropBoxManager发动篇(http://gityuan.com/2016/06/12/DropBoxManagerService/)
  • UserManagerService
  • 多用户办理UserManager(http://gityuan.com/2016/11/20/user_manager/)

4.7 内存&&存储篇

  • 内存ps5,掌握 Android 体系架构,看这两篇就可以了!| 工艺企鹅号,年终作业总结篇
  • Android LowMemoryKiller原理分析(http://gityuan.com/2016/09/17/android-lowmemorykiller/)
  • Linux内存办理(http://gityuan.com/2015/10/30/kernel-memory/)
  • Android内存分析指令(http://gityuan.com/2016/01/02/memory-analysis-command/)
  • 存储篇
  • Android存储体系之源码篇:http://gityuan.com/2016/07/17/android-io/
  • Android存储体系之架构篇:http://gityuan.com/2016/07/23/android-io-arch
  • Linux驱动篇
  • 敬请期待
  • dalvik/art
  • 解读Java进程的Trace文件:http://gityuan.com/2016/11/26/art-trace/

4.8 东西篇

再来说说Android相关的一些常用指令和东西以及调试手法。

序号文章名类别1了解Android编译指令(http://gityuan.com/2016/03/19/android-build/)build2了解Android.bp(http://gityuan.com/2018/06/02/android-bp/)build2功能东西Systrace(http://gityuan.com/2016/01/17/systrace/)systrace3Android内存分析指令(http://gityuan.com/2016/01/02/memory-analysis-command/)Memory4ps进程指令(http://gityuan.com/2015/10/11/ps-command/)Process5Am指令用法(http://gityuan.com/2016/02/27/am-command/)Am6Pm指令用法(http://gityuan.com/2016/02/28/pm-command/)Pm7调试系列1:bugreport源码篇(http://gityuan.com/2016/06/10/bugreport/)bugreport8调试系列2:bugreport实战篇(http://gityuan.com/2016/06/11/bugreport-2/)bugreport9dumpsys指令用法(http://gityuan.com/2016/05/14/dumpsys-command/)dumpsys10Android logd日志原理(http://gityuan.com/2018/01/27/android-log/)logd11介绍gdb调试东西(http://gityuan.com/2017/09/09/gdb/)gdb12介绍addr2line调试指令(http://gityuan.com/2017/09/02/addr2line/)addr2line

4.9 实战篇

下面罗列处理过的部分较为典型的事例,供我们参阅:

序号文章名类别1Binder Driver缺点导致定屏的事例(http://gityuan.com/2018/05/12/binder-driver-bug/)binder2深度解读ArrayMap优势与缺点(http://gityuan.com/2019/01/13/arraymap/)ArrayMap3数组越界导致体系重启的事例(http://gityuan.com/2018/02/10/reboot-locked-method/)数组越界4一行Log引发多线程并发问题的事例(http://gityuan.com/2018/02/03/log-fc/)多线程并发5跑monkey压力测验进程的冻屏事例(http://gityuan.com/2018/02/17/monkey-deadlock/)monkey冻屏6深度分析APP保活事例(http://gityuan.com/2018/02/24/process-keep-forever/)保活

结束语

Android体系之博学多才,包含Linux内核、Native、虚拟机、Framework,经过体系调用连通内核与用户空间,经过JNI打通用户空间的Java层和Native层,经过Bindps5,掌握 Android 体系架构,看这两篇就可以了!| 工艺企鹅号,年终作业总结er、Socket、Handler等打通跨进程、跨线程的信息交流。只要真实阅览并了解体系中心架构的规划,处理问题和规划方案才干做到心中无剑胜有剑,才干做到知其然知其所以然。当修炼到此,祝贺你对体系有了更高一个层次的了解,正如太极剑法,忘记了一切招式,也就练成了太极剑法。

再回过头去看看那些API,看到的将不再是一行行代码、一个个接口的调用,而是各种信息的传递与交互作业,而是背面不计其数个小蝌蚪的动态履行流。记住《侠客行》里边的龙木二岛主终其一生也无法参黄褐斑透太玄经,石破天却短短数日练成绝世神功,究其根源是龙木二岛主以静态视角去解读太玄经,而石破天把墙面的图画幻想成很多游动的蝌蚪,终究成果绝世神功。一言以蔽之,程序代码是死的,体系作业是活的,要以动态视角去了解体系架构。

作者:袁辉辉,安卓闻名博主Gityuan,现就职于手机厂商,热衷于研讨Android体系架构与内核技能,对Android体系结构有着深刻了解与丰厚的实战经验。

声明:本文为作者投稿,版权归对方一切,如需转载请联络原作者。