美文网首页
Android 系统

Android 系统

作者: Dream_Book | 来源:发表于2020-01-08 17:09 被阅读0次
    Android系统
    11335240-f4923cc40cfd7996.png

    1、Application应用层

    上层应用,比如我们编写的项目、系统应用。主要有java / kotlin语言编写。

    2、FrameWork应用框架层

    为开发人员提供了可以开发应用程序所需要的API.
    • ActivityManager
      负责管理所有应用程序中的Activity,它掌握所有Activity的情况,具有所有调度Activity生命周期的能力,简单来说,ActivityManager是管理和掌控所有的Activity.
    • WindowManager
      控制窗口的显示、隐藏以及窗口的层序,简单来说,它就是管理窗口的,大多数和View有关系的都要和它打交道。
    • NotificationManager
      使得应用程序可以在状态栏中显示自定义的提示信息
    • PackageManager
      管理所有安装在Android系统中的应用程序
    • TelephonyManager
      管理所有的移动设备功能
    • ResourceManager
      提供应用程序使用的各种非代码资源,如本地化字符串、图片、布局文件、颜色文件等
    • LocationManager
      提供地理位置以及定位功能服务
    • ContentPaoviders
      使得不同应用程序之间可以共享数据
    • ViewSystem
      构建应用程序的基本组件
    • XMPPService
      可扩展通讯和表示协议。前身为Jabber,提供即时通信服务。例如推送功能,Google Talk
    Framework层才真正是Java语言实现的层,在这层里定义的API都是用Java语言编写

    3、Native Library层+Android Runtime

    系统运行库层分为两部分,分别是C/C++程序库和Android运行时库。

    • AndroidRuntime

    运行时库又分为核心库ART,核心库提供了Java语言核心库的大多数功能,这样开发者可以使用Java语言来编写Android应用。

    • JVM - Dalvik - ART

    相较于JVM,Dalvik虚拟机是专门为移动设备定制的,允许在有限的内存中同时运行多个虚拟机的实例,并且每一个Dalvik 应用作为一个独立的Linux 进程执行。独立的进程可以防止在虚拟机崩溃的时候所有程序都被关闭。而替代Dalvik虚拟机的ART 的机制与Dalvik 不同。在Dalvik下,应用每次运行的时候,字节码都需要通过即时编译器转换为机器码,这会拖慢应用的运行效率,而在ART 环境中,应用在第一次安装的时候,字节码就会预先编译成机器码,使其成为真正的本地应用。

    4、HAL层(定义了HIDL接口,硬件抽象层)

    将控制硬件的动作放在硬件抽象层中。

    5、Linux Kernel

    Android 的核心系统服务基于Linux 内核,在此基础上添加了部分Android专用的驱动。系统的安全性、内存管理、进程管理、网络协议栈和驱动模型等都依赖于该内核。


    Android系统进程角度-gityuan

    Zygote是什么?

    Zygote进程又称受精卵进程。

    Zygote为什么叫受精卵进程?

    因为Android中所有的应用进程都是由Zygote进程孵化出来的。

    为什么所有进程都是由Zygote孵化?

    1. Zygote进程在启动的时候会创建一个虚拟机实例,因此通过Zygote进程创建的子进程都会继承这个虚拟机实例,App中的JAVA代码可以得到翻译执行。
    2. 进程与进程之间需要跨进程通信,由Zygote进程作为父进程还可以获得一个Binder线程池,这样进程之间就可以使用Binder进行跨进程通信了。
    3. 由Zygote进程作为父进程,子进程可以获得一个消息循环。

    Zygote都孵化了那些进程(做了什么)?

    • 启动SystemServer进程
      SystemServer 进程,是zygote 进程启动的过程中,孵化出来的第一个进程。
    • 孵化应用进程
      相机APP、短信APP...

    Zygote的启动流程?

    启动流程
    • Init进程(Linux内核启动的第一个用户级进程)通过解析配置文件需要启动app_process程序。在app_main的main函数中做了更名为zygote的操作。
    • 创建AppRuntime(为AndroidRuntime的子类)创建虚拟机、注册JNI函数后通过JNI调用ZygoteInit进入Java世界
    • 创建名为zygote的LocalServerSocket,通过这函数他可以响应子孙后代的请求同时zygote
    • preloadClasses:执行时间比较长,这是导致Android系统启动慢的原因之一,
    • preloadResources:主要加载framework-res.apk中的资源,在UI编程中常常饮用的com.android.R.***资源是系统默认资源是由zygote记载的。
    • fork出SystemServer
    • 通过runSelectLoop循环处理进程创建请求,一旦接收到请求启用runOnce函数fork出子进程

    注:

    • startVm这里调用JNI的函数创建虚拟机,这个函数主要设置一些创建时的参数。
    • startReg给创建的虚拟机注册一些JNI函数,因为进入Java世界后这些原本用Native方式实现的函数必须提前注册才可以正常的在java世界使用。
    • registerZygoteSocket:Zygote在系统中没有使用Binder而是使用Socket,这个函数正式为了建立这个Socket
    • Zygote再从startSystemServer返回之后会调用runSelectLoopMode启用在registerZygoteSocket中注册的socket.

    SystemServer进程,Zygote生死与共?

    • setSignalHandler函数,在Zygoth进程forkz子进程前调用,其中设置了信号处理函数,在信号处理函数中有判断pid为SystemServer的死亡信号,Zygote会杀死自己。
    • SystemServer进程启动后会关闭从Zygote那里继承的socket,与Binder通信系统建立联系

    SystemServer中运行的进程公共有六十多种,主要包括:
    ActivityManagerService(AMS)
    WindowManagerService(WMS)
    PackagManagerService(PMS)...;
    这些系统服务都是以一个线程的方式存在Systemserver进程中。

    1836169-0d9a175153a9cf03.png

    相关文章

      网友评论

          本文标题:Android 系统

          本文链接:https://www.haomeiwen.com/subject/ncfzoctx.html