四. AMS源码分析

AMS
主要负责四大组件的启动、切换和调度以及应用程序的管理和调度工作.
ActivityManager的组成主要分为以下几个部分:

  • 服务代理:
    ActivityManagerProxy实现,用于与Server端提供的系统服务进行进程间通信
  • 服务中枢:
    ActivityManagerNative,继承自Binder并实现了IActivityManager,他提供了服务接口和Binder接口的相互转化,并在内部存储服务代理对象,并提供了getDefault`方法返回服务代理.
  • Client端:
    ActivityManager封装了一部分服务接口给Client端调用.ActivityManager内部通过ActivityManagerNativegetDefault方法,可以得到一个ActivityManagerProxy对象的引用,进而通过该代理类对象调用远程服务的方法.
  • Server端:
    ActivityManagerService实现,提供Server端的系统服务

SystemServer进程如何管理SystemService?
SystemService是一个抽象类,将具体服务的一些公共方法抽离出来(如:onStart()方法),方便SystemServiceManager管理所有的服务;
所有的服务要么直接继承自SystemService,要么定义一个内部类LifeCycle继承自SystemService并在内部类中,将当前服务(如:AMS)类作为一个成员变量;
我们在通过SystemServiceManager调用startService()方法启动服务的时候,就会调用抽象类SystemServiceonStart()方法,最后的实现就是由相应服务去实现.
如:AMSLifeCycle内部类的onStart()方法、BatterServiceonStart()方法.

AMS的启动流程
通过SystemService的启动引导服务方法startBootstrapServices(),然后通过SystemServiceMangerstartService()方法,最终会调用到AMSstart()方法,完成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个进程,不同的进程进间采取了BinderSoket的通信机制,同一个进程中有采用了Handler的通信方式.

  • Launcher进程
    • ServiceManager集合中获取到AMSIBinder对象转化的代理类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集合中取出AMSIBinder对象的代理类ActivityManagerProxy;
    • 通过Binder通信机制和SystemServer进程通信,通过AMS的代理类调用SystemServer进程中的AMS服务;
    • 调用AMS的启动App主页方法realStartActivityLocked(),该方法会获取到App进程ApplicationThread服务的代理类ApplicationThreadProxy;
    • SystemServer进程通过Binder进程间通信机制与App进程通信,通过SystemServer进程中的代理类ApplicationThreadProxy,调用App进程中的ApplicationThread服务的scheduleLaunchActivity()方法;
    • 然后通过App进程中的ApplicationThread发送Handler消息LAUNCHER_ACTIVITYActivityThread,在ActivityThread中调用handleLaunchActivity方法,调用ActivityonCreate()方法.

AMS源码分析
SystemServer进程要启动App进程的首页时,当发现App没有运行在后台,则需要通知Zygote进程去创建一个App进程出来,此时会调用AMSstartProcess() 方法创建进行.

  • (ProcessList)mProcessList @AMS.java
    • AMS类中包含一个ProcessRecord的集合ProcessList,用于管理一个个进程ProcessRecord.
      final ArrayList<ProcessRecord> mLruProcesses = new ArrayList<ProcessRecord>();
    • ProcessRecord是一个进程,里面包含了进程的相关信息.
  • startProcess() @ProcessList.java
    • 启动进程
  • Process.start() @Process.java
    • Process是一个进程ProcessRecord的工具类,相当于我们平时写的Utils,里面包含了静态方法
  • (ZygoteProcess)ZYGOTE_PROCESS.start() @ProcessList.java
    • ZygoteProcess同样是一个工具类,这里会调用到ZygoteProcess.start()方法
  • startViaZygote() @ZygoteProcess.java
  • zygoteSendArgsAndGetResult(openZygoteSocketIfNeeded(abi),zygotePolicyFlags, argsForZygote); @ZygoteProcess.java
  • attemptUsapSendArgsAndGetResult(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)<
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值