博客架构
- 一、AMS是什么
- 二、AMS功能
- 三、AMS研究意义
- 四、AMS启动全局观
- 1、从框架看应用启动
- 2、从类图看zygote启动
- 五、巨人肩膀
一、AMS是什么
全称:ActivityManagerService,是SystemService系统服务中的重要服务之一。主要负责系统中四大组件的启动、切换、调度及应用进程的管理和调度等工作,其职责与操作系统中的进程管理和调度模块相类似。
ActivityManagerService extends ActivityManagerNative implements Watchdog.Monitor, BatteryStatsImpl.BatteryCallback
从系统运行的角度看,AMS可以分为Client端和Service端:Client端运行在各个app进程,app进程实现了具体的Activity,Service等,告诉系统我要那些Activity,Service等,并且调用系统接口来完成显示;Service端运行在SystemServer进程,是系统级别的ActivityManagerService的具体实现,其响应Client端的系统调用请求,并且管理Client端各个app进程的生命周期。
本质:客户端使用ActivityManager类。由于AMS是系统核心服务,很多API不能开放供客户端使用,所以设计者没有让ActivityManager直接加入AMS家族。在ActivityManager类内部通过调用AMN的getDefault函数得到一个ActivityManagerProxy对象,通过它可与AMS通信
二、AMS功能
AMS主要负责系统中四大组件的启动、切换、调度及应用进程的管理和调度等工作,其职责与操作系统中的进程管理和调度模块相类似
Android 11以参数形式引入了ATMS(ActivityTaskManagerService)
从ActivityTaskManagerService的类注释System service for managing activities and their containers (task, stacks, displays,… ).可以清楚的看出:它是一个系统服务,用来管理activitys和它们的容器(如task, stacks, displays)
而AMS则只负责其它三大基本组件的管理。
一直在思考为什么要这么重?还没有仔细看源码,但是,有一点可以肯定,就是给AMS减负,让其职责更单一。
三、AMS研究意义
1.启动性能优化
实际上性能优化的解决思路一直不变,难点就在于设计的知识点比较多,需要多对各个小知识点有深入理解。
2.代码质量提升
写出高质量代码,这个程序猿的终身追求,不仅仅是针对源码的理解,还有很多可以需要提升的,觉得这块可以结合最近推出的客户端工业化和XX去做个总结。
四、AMS启动全局观
1、从框架看应用启动
谈到AMS的启动四大组件,就不可避免的要谈到AMS服务的创建与开启,而AMS的创建开启又要从Android系统启动开始谈起,因为系统是在第一次创建SystemServer进程时启动AMS服务。如下图
如图是从五个层面来看安卓启动,实际上,对于第一层的Loader我觉得叫Rom层应该更为贴切。
第一ROM层:按下电源键时,引导芯片代码会从固定在ROM的汇编语言开始执行,引导BootLoader到RAM。
第二内核层:创建Idel进程,各个驱动的初始化。
第三Framework Native层:创建init进程(用户空间鼻祖),并fork Zygote进程。
第四Framework Java层:Zygote进程(Java进程的鼻祖)竖跨framework的Native和Java层。
第五应用层:此处是应用的进程,由zygote进程fork!
上图此处应该是有问题。Zygote进程fork出来应用进程,zygote是所有进程的父亲,SystemServer是服务所有应用进程的服务进程。
zygote进程-fork->app进程
SystemSever进程–>server—>app进程
2、从类图看zygote启动
使用Sublime查看源码,或者在线查看。
1.init.cpp main()方法:
2.init.zygote32.rc
service zygote /system/bin/app_process -Xzygote /system/bin --zygote --start-system-server //启动服务zygote,服务的位置在 /system/bin/app_process
class main
priority -20
user root
group root readproc reserved_disk
socket zygote stream 660 root system
socket usap_pool_primary stream 660 root system
onrestart exec_background - system system -- /system/bin/vdc volume abort_fuse
onrestart write /sys/power/state on
onrestart restart audioserver
onrestart restart cameraserver
onrestart restart media
onrestart restart netd
onrestart restart wificond
writepid /dev/cpuset/foreground/tasks
下面我们查看app_process。位置是 /system/bin/app_process
五、巨人肩膀