AMS
主要负责四大组件的启动、切换和调度以及应用程序的管理和调度工作.
ActivityManager的组成主要分为以下几个部分:
- 服务代理:
由ActivityManagerProxy实现,用于与Server端提供的系统服务进行进程间通信 - 服务中枢:
ActivityManagerNative,继承自Binder并实现了IActivityManager,他提供了服务接口和Binder接口的相互转化,并在内部存储服务代理对象,并提供了getDefault`方法返回服务代理. - Client端:
由ActivityManager封装了一部分服务接口给Client端调用.ActivityManager内部通过ActivityManagerNative的getDefault方法,可以得到一个ActivityManagerProxy对象的引用,进而通过该代理类对象调用远程服务的方法. - Server端:
由ActivityManagerService实现,提供Server端的系统服务
SystemServer进程如何管理SystemService?
SystemService是一个抽象类,将具体服务的一些公共方法抽离出来(如:onStart()方法),方便SystemServiceManager管理所有的服务;
所有的服务要么直接继承自SystemService,要么定义一个内部类LifeCycle继承自SystemService并在内部类中,将当前服务(如:AMS)类作为一个成员变量;
我们在通过SystemServiceManager调用startService()方法启动服务的时候,就会调用抽象类SystemService的onStart()方法,最后的实现就是由相应服务去实现.
如:AMS的LifeCycle内部类的onStart()方法、BatterService的onStart()方法.
AMS的启动流程
通过SystemService的启动引导服务方法startBootstrapServices(),然后通过SystemServiceManger的startService()方法,最终会调用到AMS的start()方法,完成AMS的启动.
AMS启动时实现了哪些功能: @AMS.start()
mProcessCpuThread.start();//启动CPU监控线程mBatteryStatsService.publish();//注册电池状态和权限管理服务mProcessCpuInitLatch.await();//等待mProcessCpuInitLatch完成初始化,释放锁,初始化期间禁止访问
SystemServer中启动AMS也完成了一些初始化任务:
mActivityManagerService.initPowerManagement();//初始化电源管理mActivityManagerService.setSystemProcess();//设置为系统进程- 将一些服务添加到ServiceManager进程集合中,如:GraphicsBinder、DbBinder、ProcessInfoService、PermissionController等.
由于AMS管理的服务很多,四大组件都是通过AMS来管理的;所以将Activity的管理抽离出来交给ATMS来管理,但是AMS同时会管理ATMS,通过在AMS中持有ATMS的成员变量.
public ActivityTaskManagerService mActivityTaskManager;
App的启动流程
App的启动流程中涉及到4个进程,不同的进程进间采取了Binder和Soket的通信机制,同一个进程中有采用了Handler的通信方式.
- Launcher进程
- 从
ServiceManager集合中获取到AMS的IBinder对象转化的代理类ActivityManagerProxy,通过Binder通信机制,向SystemServer进程中的AMS服务发送启动app主页面的请求startActivity().
- 从
- SystemServer进程
- 接收到
Launcher进程发送过来的启动app首页的请求;
若app已经存在于后台,直接通过SystemServer进程去启动我们的app进程中的主页;
若app不存在,此时SystemServer进程需要向Zygote进程发送soket消息,请求创建app进程.
- 接收到
- Zygote进程
- 通过
ZygoteServer接收SystemServer进程发送来的创建App进程的soket消息,通过fork创建App进程.
- 通过
- App进程
App进程创建成功后,从ServiceManager集合中取出AMS的IBinder对象的代理类ActivityManagerProxy;- 通过
Binder通信机制和SystemServer进程通信,通过AMS的代理类调用SystemServer进程中的AMS服务; - 调用
AMS的启动App主页方法realStartActivityLocked(),该方法会获取到App进程ApplicationThread服务的代理类ApplicationThreadProxy; SystemServer进程通过Binder进程间通信机制与App进程通信,通过SystemServer进程中的代理类ApplicationThreadProxy,调用App进程中的ApplicationThread服务的scheduleLaunchActivity()方法;- 然后通过
App进程中的ApplicationThread发送Handler消息LAUNCHER_ACTIVITY给ActivityThread,在ActivityThread中调用handleLaunchActivity方法,调用Activity的onCreate()方法.
AMS源码分析
SystemServer进程要启动App进程的首页时,当发现App没有运行在后台,则需要通知Zygote进程去创建一个App进程出来,此时会调用AMS的startProcess() 方法创建进行.
- (ProcessList)
mProcessList@AMS.java- AMS类中包含一个ProcessRecord的集合ProcessList,用于管理一个个进程ProcessRecord.
final ArrayList<ProcessRecord> mLruProcesses = new ArrayList<ProcessRecord>(); - ProcessRecord是一个进程,里面包含了进程的相关信息.
- AMS类中包含一个ProcessRecord的集合ProcessList,用于管理一个个进程ProcessRecord.
startProcess()@ProcessList.java- 启动进程
Process.start()@Process.java- Process是一个进程ProcessRecord的工具类,相当于我们平时写的Utils,里面包含了静态方法
(ZygoteProcess)ZYGOTE_PROCESS.start()@ProcessList.java- ZygoteProcess同样是一个工具类,这里会调用到ZygoteProcess.start()方法
startViaZygote()@ZygoteProcess.javazygoteSendArgsAndGetResult(openZygoteSocketIfNeeded(abi),zygotePolicyFlags, argsForZygote); @ZygoteProcess.javaattemptUsapSendArgsAndGetResult(zygoteState, msgStr); @ZygoteProcess.java- 通过
Socket获取到输出流和输出流,发送和接收消息(目标:ZygoteServer)
- 通过
(BufferWriter)usapWriter.write(msgStr);- 通过sokect将拼接好的命令通过字符流发送给Zygote服务器(ZygoteServer)
- ZygoteServer接收到sokect消息后,在connection.
processOneCommand(this)方法中,会去解析参数msgStr->args,然后通过fork创建进程:
pid = Zygote.forkAndSpecialize() - 进程创建成功后,会将pid和usingWrapper这两个参数发送给客户端,以便下面通过输入流读取这两个参数:
(DataOutputStream)mSocketOutStream.writeInt(pid);
(DataOutputStream)mSocketOutStream.writeBoolean(usingWrapper); - result.pid = (DataInputStream)usapReader.readInt();
- 通过读取soket返回消息中的pid,判断进程是否创建成功
try (LocalSocket usapSessionSocket = zygoteState.getUsapSessionSocket()) { final BufferedWriter usapWriter = new BufferedWriter( new OutputStreamWriter(usapSessionSocket.getOutputStream()), Zygote.SOCKET_BUFFER_SIZE); final DataInputStream usapReader = new DataInputStream(usapSessionSocket.getInputStream()); //通过输出流写入拼接的命令 usapWriter.write(msgStr)<

最低0.47元/天 解锁文章
1147

被折叠的 条评论
为什么被折叠?



