美文网首页
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