Android 基础一

176 阅读4分钟

系统架构

Andorid 系统架构分为5层

  1. App层:用户直接接触的一层,用户使用的APP都在这一层,如果phone,email、Message等等

  2. java FrameWork层:应用层主要和该层交互,调用API。很多Manager、Service都在这层工作,如AM,AMS,PM,PMS,Zygote进程等等

  3. Andoird运行环境和系统库层:他是由两块构成,ART主要负责,预编和及时编译、GC以及调试相管,系统库主要是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进程孵化而来的。
  1. 硬件抽象层HAL:为不同硬件提供标准接口,比不同的震动马达,通信芯片,蓝牙等。
  2. Linux内核层:Andorid平台是基于Linux内核的,
  • 启动kernel的swapper(pid=0),该进程又被称为idle进程,他是kernel第一个启动的进程,处理Display,内存管理,初始化进程,camera driver,binder driver
  • 启动ktheradd进程,他是kernel所有内核进程的鼻祖

系统启动架构图:

image.png

补充

syscall: navite和kernel之间有一层调用

JIN: java和c/c++之间有一层调用

小结疑问

  1. init的孵化出的进程是啥意思?

  2. kernel的swapper和ktheradd一个是进程一个是内核进程有什么区别么?为什么不是先启动内核进程?

  3. syscall和JIN到底是怎么实现的呢,通过了哪些步骤,原理是啥?

Binder

Andorid系统进程间IPC通信方式之一,Linux 还有socket,管道等IPC通信

  1. 什么要用binder? CS(Client-Service)通信方式广泛应用,Linux这么多里面只有socket是,但是socket传输效率低,开销大,需要一套新的通信,Binder就诞生了,一套CS方式,传输过程只需要一次拷贝,为发送添加UID/PID身份,支持实名和匿名安全性高。

BinderIPC 通信原理

image.png

  1. 32位的操作系统虚拟内存空间是2的32次方也就是4GB,针对于Linux系统分给内核1GB用户3GB

  2. copy_from_user() //将数据从用户空间拷贝到内核空间,copy_to_user() //将数据从内核空间拷贝到用户空间

  3. 核心通信原理内存映射:Binder IPC 机制中涉及到的内存映射通过 mmap() 来实现,mmap() 是操作系统中一种内存映射的方法,内存建立映射修改互相响应---减少数据拷贝次数

流程: 首先 Binder 驱动在内核空间创建一个数据接收缓存区;接着在内核空间开辟一块内核缓存区,建立内核缓存区内核中数据接收缓存区之间的映射关系,以及内核中数据接收缓存区接收进程用户空间地址的映射关系; 发送方进程通过系统调用 copyfromuser() 将数据 copy 到内核中的内核缓存区,由于内核缓存区和接收进程的用户空间存在内存映射,因此也就相当于把数据发送到了接收进程的用户空间,这样便完成了一次进程间的通信。

小结:1. CS通信为什么广泛应用

Binder模型

image.png

image.png

这两张图,大概理清了他们四个的关系。

  1. binder驱动:binder机制的,核心主要处理Client和Service的请求
  2. Client:发起方
  3. Service:处理方
  4. serviceManager:存储所有Service,它也是最特殊的Server

小结:open、mmap,ioctl,是怎么实现的,Binder内部还有更复杂的处理流程

Socket

也是CS通信,主要用户fw和native交互

类加载器

  1. Bootstrap ClassLoader
  2. Extension ClassLoader
  3. App ClassLoader
  4. 双亲委托机制:app接收到一个类给父级,一直到boot开始检查加载,原因:安全

Android activity启动流程

image.png

image.png

Activity 启动相关知识

  1. init进程:init是所有linux程序的起点,是Zygote的父进程。
  2. Zygote进程:Zygote是所有Java进程的父进程,所有的App进程都是由Zygote进程fork生成的
  3. SystemServer进程:System Server是Zygote孵化的第一个进程。SystemServer负责启动和管理整个Java framework,包含AMS,PMS等服务
  4. Launcher:Zygote进程孵化的第一个App进程是Launcher
  • 在系统架构就解释了init进程和zygote进程关系
  • binder还是ap进程和fw进程的主要方式,zygote使用的是socket方式

Activity启动模式

  1. Single standard 每次启动都在栈内创建一个新的
  2. Single top 栈顶复用
  3. Single task 栈内复用
  4. Single instance 每次调用新建一个栈,一般用来

Activity生命周期

image.png

Frament生命周期

image.png

Frament通信

Activity到Fragment

  1. setArguments Fragment到Activity
  2. 实现接口 Fragment到Fragment
  3. FragmentManager

Service

Service生命周期

Service启动模式

image.png