android架构_android架构师 - CSDN
精华内容
参与话题
  • Android 系统架构

    千次阅读 2019-06-26 11:08:07
    Android 是一种基于 Linux 的开放源代码软件栈,为广泛的设备和机型而创建。下图所示为 Android 平台的主要组件。 Linux 内核 Android 平台的基础是 Linux 内核。例如,Android Runtime (ART) 依靠 Linux 内核来...

    可以查看 https://developer.android.com/guide/platform

    Android 是一种基于 Linux 的开放源代码软件栈,为广泛的设备和机型而创建。下图所示为 Android 平台的主要组件。

    image.png

    Linux 内核

    Android 平台的基础是 Linux 内核。例如,Android Runtime (ART) 依靠 Linux 内核来执行底层功能,例如线程和低层内存管理。
    使用 Linux 内核可让 Android 利用主要安全功能,并且允许设备制造商为著名的内核开发硬件驱动程序。


    硬件抽象层 (HAL)

    硬件抽象层 (HAL) 提供标准界面,向更高级别的 Java API 框架显示设备硬件功能。HAL 包含多个库模块,其中每个模块都为特定类型的硬件组件实现一个界面,例如相机或蓝牙模块。当框架 API 要求访问设备硬件时,Android 系统将为该硬件组件加载库模块。


    Android Runtime

    对于运行 Android 5.0(API 级别 21)或更高版本的设备,每个应用都在其自己的进程中运行,并且有其自己的 Android Runtime (ART) 实例。ART 编写为通过执行 DEX 文件在低内存设备上运行多个虚拟机,DEX 文件是一种专为 Android 设计的字节码格式,经过优化,使用的内存很少。编译工具链(例如 Jack)将 Java 源代码编译为 DEX 字节码,使其可在 Android 平台上运行。

    ART 的部分主要功能包括:

    预先 (AOT) 和即时 (JIT) 编译
    优化的垃圾回收 (GC)
    更好的调试支持,包括专用采样分析器、详细的诊断异常和崩溃报告,并且能够设置监视点以监控特定字段
    在 Android 版本 5.0(API 级别 21)之前,Dalvik 是 Android Runtime。如果您的应用在 ART 上运行效果很好,那么它应该也可在 Dalvik 上运行,但反过来不一定。

    Android 还包含一套核心运行时库,可提供 Java API 框架使用的 Java 编程语言大部分功能,包括一些 Java 8 语言功能。

    原生 C/C++ 库

    许多核心 Android 系统组件和服务(例如 ART 和 HAL)构建自原生代码,需要以 C 和 C++ 编写的原生库。Android 平台提供 Java 框架 API 以向应用显示其中部分原生库的功能。例如,您可以通过 Android 框架的 Java OpenGL API 访问 OpenGL ES,以支持在应用中绘制和操作 2D 和 3D 图形。

    如果开发的是需要 C 或 C++ 代码的应用,可以使用 Android NDK 直接从原生代码访问某些原生平台库。


    Java API 框架

    您可通过以 Java 语言编写的 API 使用 Android OS 的整个功能集。这些 API 形成创建 Android 应用所需的构建块,它们可简化核心模块化系统组件和服务的重复使用,包括以下组件和服务:

    丰富、可扩展的视图系统,可用以构建应用的 UI,包括列表、网格、文本框、按钮甚至可嵌入的网络浏览器
    资源管理器,用于访问非代码资源,例如本地化的字符串、图形和布局文件
    通知管理器,可让所有应用在状态栏中显示自定义提醒
    Activity 管理器,用于管理应用的生命周期,提供常见的导航返回栈
    内容提供程序,可让应用访问其他应用(例如“联系人”应用)中的数据或者共享其自己的数据
    开发者可以完全访问 Android 系统应用使用的框架 API。

    系统应用

    Android 随附一套用于电子邮件、短信、日历、互联网浏览和联系人等的核心应用。平台随附的应用与用户可以选择安装的应用一样,没有特殊状态。因此第三方应用可成为用户的默认网络浏览器、短信 Messenger 甚至默认键盘(有一些例外,例如系统的“设置”应用)。

    系统应用可用作用户的应用,以及提供开发者可从其自己的应用访问的主要功能。例如,如果您的应用要发短信,您无需自己构建该功能,可以改为调用已安装的短信应用向您指定的接收者发送消息。

    展开全文
  • Android 系统架构详解

    千次阅读 2019-04-12 14:01:25
    本文作为Android系统架构的开篇,起到提纲挈领的作用,从系统整体架构角度概要讲解Android系统的核心技术点,带领大家初探Android系统全貌以及内部运作机制。虽然Android系统非常庞大且错综复杂,需要具备全面的技术...

    引言

     

    本文作为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层架构图很经典,但为了更进一步透视Android系统架构,本文更多的是以进程的视角,以分层的架构来诠释Android系统的全貌,阐述Android内部的环环相扣的内在联系。

    系统启动架构图

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

    关于Loader层:

    • Boot ROM: 当手机处于关机状态时,长按Power键开机,引导芯片开始从固化在 ROM里的预设代码开始执行,然后加载引导程序到 RAM;

    • Boot Loader:这是启动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进程是所有内核进程的鼻祖。

    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/)

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

    Binder驱动篇:

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

    Binder使用篇:

    1 如何使用Binder Native层、Framwrok层自定义Binder服务
    2 如何使用AIDL App层自定义Binder服务

    3.2 Socket

    Socket通信方式也是C/S架构,比Binder简单很多。在Android系统中采用Socket通信方式的主要有:

    • zygote:用于孵化进程,system_server创建进程是通过socket向zygote进程发起请求;

    • installd:用于安装App的守护进程,上层PackageManagerService很多实现最终都是交给它来完成;

    • lmkd:lowmemorykiller的守护进程,Java层的LowMemoryKiller最终都是由lmkd来完成;

    • adbd:这个也不用说,用于服务adb;

    • logcatd:这个不用说,用于服务logcat;

    • vold:即volume Daemon,是存储类的守护进程,用于负责如USB、Sdcard等存储设备的事件处理。

    等等还有很多,这里不一一列举,Socket方式更多的用于Android framework层与native层之间的通信。Socket通信方式相对于binder比较简单,这里省略。

    3.3 Handler

    Binder/Socket用于进程间通信,而Handler消息机制用于同进程的线程间通信,Handler消息机制是由一组MessageQueue、Message、Looper、Handler共同组成的,为了方便且称之为Handler消息机制。

    有人可能会疑惑,为何Binder/Socket用于进程间通信,能否用于线程间通信呢?答案是肯定,对于两个具有独立地址空间的进程通信都可以,当然也能用于共享内存空间的两个线程间通信,这就好比杀鸡用牛刀。接着可能还有人会疑惑,那handler消息机制能否用于进程间通信?答案是不能,Handler只能用于共享内存地址空间的两个线程间通信,即同进程的两个线程间通信。很多时候,Handler是工作线程向UI主线程发送消息,即App应用中只有主线程能更新UI,其他工作线程往往是完成相应工作后,通过Handler告知主线程需要做出相应地UI更新操作,Handler分发相应的消息给UI主线程去完成,如下图:

    由于工作线程与主线程共享地址空间,即Handler实例对象mHandler位于线程间共享的内存堆上,工作线程与主线程都能直接使用该对象,只需要注意多线程的同步问题。工作线程通过mHandler向其成员变量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系统原理、架构分析的原创文章。

    建议阅读群体: 适合于正从事或者有兴趣研究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/

    Android系统中极其重要进程:init, zygote, system_server, servicemanager 进程:

    序号 进程启动 概述
    1 init进程 Linux系统中用户空间的第一个进程, Init.main
    2 zygote进程 所有App进程的父进程, ZygoteInit.main
    3 system_server进程(上篇) 系统各大服务的载体, forkSystemServer过程
    4 system_server进程(下篇) 系统各大服务的载体, SystemServer.main
    5 servicemanager进程 binder服务的大管家, 守护进程循环运行在binder_loop
    6 App进程 通过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的场景以及机理
    2 Input系统—ANR原理分析 input触发ANR的原理
    3 理解Android ANR的信息收集过程 AMS.appNotResponding过程分析,收集traces
    4 解读Java进程的Trace文件 kill -3 信息收集过程
    5 Native进程之Trace原理 debuggerd -b 信息收集过程
    6 WatchDog工作原理 WatchDog触发机制
    7 理解Java Crash处理流程 AMS.handleApplicationCrash过程分析
    8 理解Native Crash处理流程 debuggerd守护进程
    9 global reference限制策略 global reference

    4.3 Android进程系列

    进程/线程是操作系统的魂,各种服务、组件、子系统都是依附于具体的进程实体。深入理解进程机制对于掌握Android系统整体架构和运转机制是非常有必要的,是系统工程师的基本功,下面列举进程相关的文章:

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

    4.4 四大组件系列

    对于App来说,Android应用的四大组件Activity,Service,Broadcast Receiver, Content Provider最为核心,接下分别展开介绍:

    序号 文章名 类别
    1 startActivity启动过程分析 Activity
    2 简述Activity生命周期 Activity
    3 startService启动过程分析 Service
    4 bindService启动过程分析 Service
    5 以Binder视角来看Service启动 Service
    6 Android Broadcast广播机制分析 Broadcast
    7 理解ContentProvider原理 ContentProvider
    8 ContentProvider引用计数 ContentProvider
    9 Activity与Service生命周期 Activity&&Service
    10 简述Activity与Window关系 Activity&&Window
    11 四大组件之综述 AMS
    12 四大组件之ServiceRecord Service
    13 四大组件之BroadcastRecord Broadcast
    14 四大组件之ContentProviderRecord ContentProvider
    15 理解Android Context Context
    16 理解Application创建过程 Application
    17 unbindService流程分析 Service
    18 四大组件之ActivityRecord Activity
    19 AMS总结(一) AMS

    4.5 图形系统系列

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

    序号 文章名 类别
    1 WindowManager启动篇(http://gityuan.com/2017/01/08/windowmanger/) Window
    2 WMS之启动窗口篇(http://gityuan.com/2017/01/15/wms_starting_window/) Window
    3 以Window视角来看startActivity(http://gityuan.com/2017/01/22/start-activity-wms/) Window
    4 Android图形系统概述(http://gityuan.com/2017/02/05/graphic_arch/) SurfaceFlinger
    5 SurfaceFlinger启动篇(http://gityuan.com/2017/02/11/surface_flinger/) SurfaceFlinger
    6 SurfaceFlinger绘图篇(http://gityuan.com/2017/02/18/surface_flinger_2/) SurfaceFlinger
    7 Choreographer原理(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://gityuan.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 内存&&存储篇

    • 内存篇

      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/) build
    2 理解Android.bp(http://gityuan.com/2018/06/02/android-bp/) build
    2 性能工具Systrace(http://gityuan.com/2016/01/17/systrace/) systrace
    3 Android内存分析命令(http://gityuan.com/2016/01/02/memory-analysis-command/) Memory
    4 ps进程命令(http://gityuan.com/2015/10/11/ps-command/) Process
    5 Am命令用法(http://gityuan.com/2016/02/27/am-command/) Am
    6 Pm命令用法(http://gityuan.com/2016/02/28/pm-command/) Pm
    7 调试系列1:bugreport源码篇(http://gityuan.com/2016/06/10/bugreport/) bugreport
    8 调试系列2:bugreport实战篇(http://gityuan.com/2016/06/11/bugreport-2/) bugreport
    9 dumpsys命令用法(http://gityuan.com/2016/05/14/dumpsys-command/) dumpsys
    10 Android logd日志原理(http://gityuan.com/2018/01/27/android-log/) logd
    11 介绍gdb调试工具(http://gityuan.com/2017/09/09/gdb/) gdb
    12 介绍addr2line调试命令(http://gityuan.com/2017/09/02/addr2line/) addr2line

    4.9 实战篇

    下面列举处理过的部分较为典型的案例,供大家参考:

    序号 文章名 类别
    1 Binder Driver缺陷导致定屏的案例(http://gityuan.com/2018/05/12/binder-driver-bug/) binder
    2 深度解读ArrayMap优势与缺陷(http://gityuan.com/2019/01/13/arraymap/) ArrayMap
    3 数组越界导致系统重启的案例(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层,通过Binder、Socket、Handler等打通跨进程、跨线程的信息交换。只有真正阅读并理解系统核心架构的设计,解决问题和设计方案才能做到心中无剑胜有剑,才能做到知其然知其所以然。当修炼到此,恭喜你对系统有了更高一个层次的理解,正如太极剑法,忘记了所有招式,也就练成了太极剑法。

    再回过头去看看那些API,看到的将不再是一行行代码、一个个接口的调用,而是各种信息的传递与交互工作,而是背后成千上万个小蝌蚪的动态执行流。记得《侠客行》里面的龙木二岛主终其一生也无法参透太玄经,石破天却短短数日练成绝世神功,究其根源是龙木二岛主以静态视角去解读太玄经,而石破天把墙壁的图案想象成无数游动的蝌蚪,最终成就绝世神功。一言以蔽之,程序代码是死的,系统运转是活的,要以动态视角去理解系统架构。

    作者:袁辉辉,安卓知名博主Gityuan,现就职于手机厂商,热衷于研究Android系统架构与内核技术,对Android系统框架有着深刻理解与丰富的实战经验。

    转载地址:https://mp.weixin.qq.com/s?__biz=MjM5MjAwODM4MA==&mid=2650717962&idx=4&sn=d2d68b759ba53c392b5e56acb171e6ba&chksm=bea6ced989d147cfaa6ca7544209fc520f7de260a82bf8ba418a88ec2f46a91afb03e16343e9&mpshare=1&scene=23&srcid=0412B6lHrCvWrHkLTCfgtMBv#rd

    展开全文
  • Android体系架构

    万次阅读 2018-09-12 19:43:53
    Android 是一种基于 ...与其他操作系统一样,Android也采用分层的架构设计,从高到低分别是系统应用层(System Apps),Java API 框架层(Java API Framework),Android系统运行层(包括Android Runtime和原生态...

    Android 是一种基于 Linux 的开放源代码软件栈,主要应用于ARM平台,但不仅限于ARM,通过编译控制,在X86等体系结构的机器上同样可以运行。

    与其他操作系统一样,Android也采用分层的架构设计,从高到低分别是系统应用层(System Apps),Java API 框架层(Java API Framework),Android系统运行层(包括Android Runtime和原生态的C/C++库 Native C/C++ Libraries)、硬件抽象层(Hardware Abstraction Layer)、Linux内核层(Linux Kernel)。如下图所示:

    下面由下至上分别介绍各层

     1、Linux内核层

    Android是基于Linux内核的(Linux内核提供了安全性、内存管理、进程管理、网络协议和驱动模型等核心系统服务),Linux内核层为各种硬件提供了驱动程序,如显示驱动、相机驱动、蓝牙驱动、电池管理等等。

    2、硬件抽象层(Hardware Abstraction Layer)

    Android的硬件抽象层,简单来说,就是对Linux内核驱动程序的封装,向上提供接口,屏蔽低层的实现细节。HAL 可定义一个标准接口以供硬件供应商实现,这可让 Android 忽略较低级别的驱动程序实现。

    3、Android系统运行层

    这一层包括Android Runtime和原生态的C/C++库。

    通过C或者C++库为Android系统提供主要的特性支持,例如Surface Manager管理访问显示子系统和从多模块应用中无缝整合2D和3D的图形,WebKit提供了浏览器支持等。可以使用 Android NDK 直接从访问某些原生态库。

    Android运行时,其中包括了ART虚拟机(Android 5.0之前是Dalvik虚拟机,ART模式与Dalvik模式最大的不同在于,在启用ART模式后,系统在安装应用的时候会进行一次预编译,在安装应用程序时会先将代码转换为机器语言存储在本地,这样在运行程序时就不会每次都进行一次编译了,执行效率也大大提升。如果您的应用在 ART 上运行效果很好,那么它应该也可在 Dalvik 上运行,但反过来不一定。),每个Java程序都运行在ART虚拟机上,该虚拟机专门针对移动设备进行了定制,每个应用都有其自己的 Android Runtime (ART) 实例。此外,Android运行时还包含一套核心运行时库,可提供 Java API 框架使用的 Java 编程语言大部分功能,包括一些 Java 8 语言功能。

    4、Java API 框架层

    这一层主要提供了构建应用程序时可能用到的各种API,开发者通过这一层的API构建自己的APP,这一层也是APP开发人员必须要掌握的内容。

    5、系统应用层

    所有安装在手机上的系统应用都属于这一层,用户自己开发的应用也属于这一层。

    (张伟:2018年8月29日)

    (转载时请注明来源)

    展开全文
  • Android层次架构

    千次阅读 2018-10-15 09:41:28
    Android其本质就是在标准的Linux系统上增加了Java虚拟机Dalvik,并在Dalvik虚拟机上搭建了一个JAVA的application framework,所有的应用程序都是基于JAVA的application framework之上。 Android主要应用于ARM平台,...

     

    Android其本质就是在标准的Linux系统上增加了Java虚拟机Dalvik,并在Dalvik虚拟机上搭建了一个JAVA的application framework,所有的应用程序都是基于JAVA的application framework之上。
    Android主要应用于ARM平台,但不仅限于ARM,通过编译控制,在X86、MAC等体系结构的机器上同样可以运行。

    android分为四个层,从高层到低层分别是应用程序层、应用程序框架层、系统运行库层和linux核心层。
    蓝 色的代表java程序,黄色的代码为运行JAVA程序而实现的虚拟机,绿色部分为C/C++语言编写的程序库,红色的代码内核(linux内 核+driver)。在Application Framework之下,由C/C++的程序库组成,通过JNI完成从JAVA到C的调用。

    1) 应用程序
    所有的应用程序都是使用JAVA语言编写的,每一个应用程序由一个或者多个活动组成,活动必须以Activity类为超类,活动类似于操作系统上的进程,但是活动比操作系统的进程要更为灵活,与进程类似的是,活动在多种状态之间进行切换。
    利用JAVA的跨平台性质,基于Android框架开发的应用程序可以不用编译运行于任何一台安装有android系统的平台,这点正是Android的精髓所在。

    2) 应用程序框架
    应用程序的架构设计简化了组件的重用;任何一个应用程序都可以发布它的功能块并且任何其它的应用程序都可以使用其所发布的功能块(不过得遵循框架的安全性限制)。帮助程序员快速的开发程序,并且该应用程序重用机制也使用户可以方便的替换程序组件。
    隐藏在每个应用后面的是一系列的服务和系统, 其中包括;
     a.丰富而又可扩展的视图(Views),可以用来构建应用程序, 它包括列表(lists),网格(grids),文本框(text boxes),按钮(buttons), 甚至可嵌入的web浏览器。
     b.内容提供器(Content Providers)使得应用程序可以访问另一个应用程序的数据(如联系人数据库), 或者共享它们自己的数据。
     c.资源管理器(Resource Manager)提供非代码资源的访问,如本地字符串,图形,和布局文件(layout files)。
     d.通知管理器(Notification Manager)使得应用程序可以在状态栏中显示自定义的提示信息。
     e.活动管理器(Activity Manager)用来管理应用程序生命周期并提供常用的导航回退功能。

    3) 系统运行库
     a)程序库
        Android包含一些C/C++库,这些库能被Android系统中不同的组件使用。它们通过Android应用程序框架为开发者提供服务。
        以下是一些核心库:
        主要包括基本的C库、以及多媒体库以支持各种多媒体格式、位图和矢量字体、2D和3D图形引擎、浏览器、数据库支持。
     1.Bionic系统C库。
     2.媒体库,基于PacketVideo OpenCORE。
     3.Surface Manager 顾名思义,用于管理Surface。
     4.Webkit,LibWebCore 浏览器,基于Webkit引擎。
     5.SGL 底层的2D图形引擎
     6.3D libraries 基于OpenGL ES 1.0 APIs实现
     7.FreeType 位图(bitmap)和矢量(vector)字体显示。
     8.SQLite 一个对于所有应用程序可用,功能强劲的轻型关系型数据库引擎。
     
       另外这里还有一个硬件抽象层。其实Android并非所有的设备驱动都放在linux内核里面,有一部分实现在用户空间,
       这么做的主要原因是可以避开Linux所遵循的GPL协议,一般情况下如果要将Android移植到其他硬件去运行,
       只需要实现这部分代码即可。包括:显示器驱动,声音,相机,GPS,GSM等等。
     
      b)Android 运行库
      Android 包括了一个核心库,该核心库提供了JAVA编程语言核心库的大多数功能。
      每一个 Android应用程序都在它自己的进程中运行,都拥有一个独立的Dalvik虚拟机实例。
      Dalvik被设计成一个设备可以同时高效地运行多个虚拟系统。    
      Dalvik虚拟机执行(.dex)的Dalvik可执行文件,该格式文件针对小内存使用做了优化。
      同时虚拟机是基于寄存器的,所有的类都经由JAVA编译器编译,然后通过SDK中的 "dx" 工具转化成.dex格式由虚拟机执行。
      Dalvik虚拟机依赖于linux内核的一些功能,比如线程机制和底层内存管理机制。
      
    4) Linux 内核
    Android 的核心系统服务依赖于 Linux 2.6 内核 ,如安全性,内存管理,进程管理, 网络协议栈和驱动模型。 
    Linux 内核也同时作为硬件和软件栈之间的抽象层。其外还对其做了部分修改,主要涉及两部分修改:
       a)Binder   
      (IPC):提供有效的进程间通信,虽然linux内核本身已经提供了这些功能,但Android系统很多服务都需要用到该功能,为了某种原因
      其实现了自己的一套。
       b)电源管理:为手持设备节省能耗。

     

    最后在谈谈Android所采用的语言,其应用开发采用java语言,我们所说的java一般包含三个部分:
    a) java语言:即其语法,其写代码的程式
    b) java虚拟机:为了实现一次编译到处可以运行的原则,java在编译连接以后并没有产生目标机器语言,而是采用了Java bytecode
        这种Java共用指令,这时就需要一个虚拟机来执行改指令。
    c) 库:跟我们常用的C语言一样提供一些常用的库
    后两者结合就是Java Runtime Environment。

    展开全文
  • Android项目组件化架构

    万次阅读 多人点赞 2018-07-12 08:54:24
    转自:https://blog.csdn.net/weihuangcool/article/details/78109422前言用android studio开发的同学应该都知道...在刚接触android studio时,它的这种架构引出了我一个想法------我们的app也可以使用这样的架构,...
  • Android 项目最新架构

    千次阅读 2017-11-01 15:12:23
    0.前言为了帮助开发着打造一款优秀的APP,Google可谓费尽心力,推出了各种诸如MVP,MVVM等等项目架构的思路,帮助开发者更加高效的开发,尽管这样,Google还是接着推出了一个新的项目架构,以便给予开发者更多的选择...
  • Android架构组件-WorkManager

    万次阅读 2018-09-02 12:03:52
    使用WorkManager安排任务 WorkManager API可以轻松指定可延迟的异步任务以及何时运行,这些API可让您创建任务并将其交给WorkManager,以便立即或在适当的时间运行。例如,应用程序可能需要不时从网络下载新资源。...
  • Android技术架构演进与未来

    千次阅读 2019-03-22 11:47:25
    经授权转载自公众号Android达摩院(id:AndroidAcademy) 引言 众所周知,Android是谷歌开发的一款基于Linux的开源操作系统,每年迭代一次大版本升级。 小米、华为、OPPO、VIVO、三星等各大厂商对Android原生系统...
  • Android系统框架总结(好文)

    万次阅读 2018-08-15 15:47:06
    Android框架图 Android应用程序框架 UI基本开发 Fragment 安全策略 在Android中,安全涵盖了应用程序的部署和执行.对于部署来 说,Android应用程序必须被赋予一个数字证书才允许被安装到某个设备中.对 于运行来...
  • android系统架构图及各层介绍

    万次阅读 2018-09-05 10:01:54
    此技术文档主要是从基础了解Android系统架构,便于对以后开发形成一些基本应用架构。    android的系统架构采用了分层架构的思想,如图1所示。从上层到底层共包括四层,分别是应用程序程序层、应用框架层、系统...
  • Android架构组件-App架构指南

    万次阅读 多人点赞 2018-09-02 12:04:25
    与传统的桌面应用程序不同,Android应用程序的结构要复杂得多,在大多数情况下,它们只在桌面快捷启动方式中有一个入口,并且作为单个进程运行。一个典型的Android应用程序是由多个 app组件(Android四大组件) 构成的...
  • Android 架构师成长之路

    千次阅读 多人点赞 2019-06-25 15:06:42
    前言 ...其中,稳坐榜首的仍然是Java编程语言,...从普遍的企业的角度来看,存在的问题是:后台被认为是技术核心,客户端却被认为技术含量不高,甚至小企业会让后台人员顺便开发简单的客户端,或者让后台的架构师管理...
  • Android架构文章集合

    2016-12-18 15:38:33
    安卓架构文章合集(a collection of android Architecture) fork from :https://github.com/Juude/Awesome-Android-Architecture!!! 博客原地址: 简书博客 github地址: ...
  • Android 架构组件(一)——Lifecycle

    万次阅读 多人点赞 2019-01-17 10:28:10
    Android 架构组件(一)——Lifecycle-Aware Components 有一天“谷歌开发者”官微推送了《正式发布 Android 架构组件 1.0 稳定版 | 附带中文介绍视频》,发现这种架构足够秒杀MVP、MVVM,虽然之前的Google I/...
  • 很多朋友都或多或少经历过很多面试,而有的人拿到了自己心仪的offer,有的人却被拒之门外。那么今天小编整理了一份面试经常会问到的题目,希望可以帮助到更多的人。 本文讲解: 我们为什么要选择离职 ...
  • 近几年,Android 开发的套路日趋成熟,越来越多的 Android 工程师获得了「高级」的称号,也有不少人在参与公司的 App 从无到有再到火爆的整个开发过程中,顺理成章地拿到了 Leader 职位。 但对于自己的水平,多数人...
  • Android架构设计模式总结(MVX)

    千次阅读 2019-01-04 21:46:44
    Android架构设计模式总结(MVX)一、安卓软件架构设计的目的通过设计使程序模块化,做到模块内部的高聚合和模块之间的低耦合。这样做的好处是使得程序在开发的过程中,开发人员只需要专注于一点,提高程序开发的效率...
  • Android架构组件(三)——ViewModel

    万次阅读 多人点赞 2019-01-17 10:23:26
    Android架构组件(三)——ViewModel 上一篇文章讲到了Android架构组件之LiveData(Android架构组件(二)——LiveData),现在我们再来看看另一个成员ViewModel。 ViewModel是什么?  ViewModel...
  • Android架构设计规范

    千次阅读 2017-04-01 17:57:41
    命名规范 包名全部采用小写 常量、枚举等均采用大写形式,用下划线区分各单词。使用static final private static final String TAG = "XXXX" 类名、接口名、枚举名。第一个和后面的单词都要第一个字母大写 ...
  • android架构设计之插件化、组件化

    万次阅读 多人点赞 2019-04-28 08:55:25
    如今移动app市场已经是百花齐放,其中有不乏有很多大型公司、巨型公司都是通过app创业发展起来的;app类型更加丰富,有电子商务、有视频、有社交、有工具等等,基本上涵盖了各行各业每个角落,为了更加具有竞争力app...
1 2 3 4 5 ... 20
收藏数 155,955
精华内容 62,382
关键字:

android架构