系统架构
Andorid 系统架构分为5层
-
App层:用户直接接触的一层,用户使用的APP都在这一层,如果phone,email、Message等等
-
java FrameWork层:应用层主要和该层交互,调用API。很多Manager、Service都在这层工作,如AM,AMS,PM,PMS,Zygote进程等等
-
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进程孵化而来的。
- 硬件抽象层HAL:为不同硬件提供标准接口,比不同的震动马达,通信芯片,蓝牙等。
- Linux内核层:Andorid平台是基于Linux内核的,
- 启动kernel的swapper(pid=0),该进程又被称为idle进程,他是kernel第一个启动的进程,处理Display,内存管理,初始化进程,camera driver,binder driver
- 启动ktheradd进程,他是kernel所有内核进程的鼻祖
系统启动架构图:
补充
syscall: navite和kernel之间有一层调用
JIN: java和c/c++之间有一层调用
小结疑问:
-
init的孵化出的进程是啥意思?
-
kernel的swapper和ktheradd一个是进程一个是内核进程有什么区别么?为什么不是先启动内核进程?
-
syscall和JIN到底是怎么实现的呢,通过了哪些步骤,原理是啥?
Binder
Andorid系统进程间IPC通信方式之一,Linux 还有socket,管道等IPC通信
- 什么要用binder? CS(Client-Service)通信方式广泛应用,Linux这么多里面只有socket是,但是socket传输效率低,开销大,需要一套新的通信,Binder就诞生了,一套CS方式,传输过程只需要一次拷贝,为发送添加UID/PID身份,支持实名和匿名安全性高。
BinderIPC 通信原理
-
32位的操作系统虚拟内存空间是2的32次方也就是4GB,针对于Linux系统分给内核1GB用户3GB
-
copy_from_user() //将数据从用户空间拷贝到内核空间,copy_to_user() //将数据从内核空间拷贝到用户空间
-
核心通信原理内存映射:Binder IPC 机制中涉及到的内存映射通过 mmap() 来实现,mmap() 是操作系统中一种内存映射的方法,内存建立映射修改互相响应---减少数据拷贝次数
流程: 首先 Binder 驱动在内核空间创建一个数据接收缓存区;接着在内核空间开辟一块内核缓存区,建立内核缓存区和内核中数据接收缓存区之间的映射关系,以及内核中数据接收缓存区和接收进程用户空间地址的映射关系; 发送方进程通过系统调用 copyfromuser() 将数据 copy 到内核中的内核缓存区,由于内核缓存区和接收进程的用户空间存在内存映射,因此也就相当于把数据发送到了接收进程的用户空间,这样便完成了一次进程间的通信。
小结:1. CS通信为什么广泛应用
Binder模型
这两张图,大概理清了他们四个的关系。
- binder驱动:binder机制的,核心主要处理Client和Service的请求
- Client:发起方
- Service:处理方
- serviceManager:存储所有Service,它也是最特殊的Server
小结:open、mmap,ioctl,是怎么实现的,Binder内部还有更复杂的处理流程
Socket
也是CS通信,主要用户fw和native交互
类加载器
- Bootstrap ClassLoader
- Extension ClassLoader
- App ClassLoader
- 双亲委托机制:app接收到一个类给父级,一直到boot开始检查加载,原因:安全
Android activity启动流程
Activity 启动相关知识
- init进程:init是所有linux程序的起点,是Zygote的父进程。
- Zygote进程:Zygote是所有Java进程的父进程,所有的App进程都是由Zygote进程fork生成的
- SystemServer进程:System Server是Zygote孵化的第一个进程。SystemServer负责启动和管理整个Java framework,包含AMS,PMS等服务
- Launcher:Zygote进程孵化的第一个App进程是Launcher
- 在系统架构就解释了init进程和zygote进程关系
- binder还是ap进程和fw进程的主要方式,zygote使用的是socket方式
Activity启动模式
- Single standard 每次启动都在栈内创建一个新的
- Single top 栈顶复用
- Single task 栈内复用
- Single instance 每次调用新建一个栈,一般用来
Activity生命周期
Frament生命周期
Frament通信
Activity到Fragment
- setArguments Fragment到Activity
- 实现接口 Fragment到Fragment
- FragmentManager