Android技术知识Android开发Android开发经验谈

拒绝摆烂,Android AMS应该打卡学习的n件事

2023-03-15  本文已影响0人  谁动了我的代码

AMS(ActivityManagerService)介绍

从java角度来看,ams就是一个java对象,实现了Ibinder接口,所以它是一个用于进程之间通信的接口,这个对象初始化是在systemServer.java 的run()方法里面

public Lifecycle(Context context) { 
    super(context); 
    mService = new ActivityManagerService(context);
 }

AMS是什么?

  1. 从java角度来看,ams就是一个java对象,实现了Ibinder接口,所以它是一个用于进程之间通信的 接口,这个对象初始化是在systemServer.java 的run()方法里面
  2. AMS是一个服务 ActivityManagerService从名字就可以看出,它是一个服务,用来管理Activity,而且是一个系统服务, 就是包管理服务,电池管理服务,震动管理服务等。
  3. AMS是一个Binder ams实现了Ibinder接口,所以它是一个Binder,这意味着他不但可以用于进程间通信,还是一个线程,因为一个Binder就是一个线程。

启动流程

  1. 执行action:zygote 进程就在这里启动
  1. 检测并重启需要的进程
  2. 接收子进程的SIGCHLD信号,执行响应的方法

引申问题:

本文正文内容

SystemServer 进程的创建时机

SystemServer 进程的创建过程

怎样理解Zygote 进程与SystemServer 进程的关系?

怎么通过代码区别父子进程?

java
    if(pid == 0){//子进程域
         //子进程执行逻辑
     }
Copy

SystemServer 进程的执行时机:

java
  //forkSystemServer 
   return handleSystemServerProcess(parsedArags);

Copy

源码阅读细节:有个方法是搜不到的

    extern int register_com_android_internal_os_Zygote(JNIEnv *env);
Copy

SystemServer 进程的执行过程:

    java
    if(pid == 0){//此时在SystemServer 进程中
         …………
         return handleSystemServerProcess(parsedArgs);    
     }
Copy

zygoteInit() 干了什么?

Binder 线程池是如何启动的?

java
    com_android_internal_os_ZygoteInit_nativeZygoteInit()
Copy
java
     gCurRuntime->onZygoteInit();
Copy
java
     virtual void onZygoteInit()
     {
         sp<ProcessState> proc = ProcessState::self();
         ALOGV("App process: Starting thread poll.\n");
         proc->startThreadPool();
     }
Copy

SystemServer.main() 执行过程

java
    cl = Class.forName(classname,true,classLoader);
Copy
m = cl.getMethod("main", new Class[] { String[].class });
Copy
return new MethodAndArgsCaller(m, argv);


Copy
java
    static class MethodAndArgsCaller implements Runnable {//开启子线程执行
         public void run() {
             try {
                 // 通过反射真正执行 SystemServer.main() 
                 mMethod.invoke(null, new Object[] { mArgs });
             }
         }


Copy
java
    if(startSystemServer){
         Runnable r = forkSystemServer(xxxxx);
         if(r != null){//如果是Zygote 进程,r 才为空;
             r.run();
             return;
         }
     }


Copy

SystemServer().run() 干了什么?

    mSystemServiceManager.startBootPhase(t, SystemService.PHASE_WAIT_FOR_DEFAULT_DISPLAY);


Copy
    public static void main(String[] args) {//SystemServer.main()
             new SystemServer().run();
         }


Copy
  createSystemContext();

Copy

  mSystemServiceManager = new SystemServiceManager(mSystemContext);

Copy

    //引导服务:AMS
     startBootstrapServices(t);


Copy
    //核心服务:系统所需要的
     startCoreServices(t);


Copy
    //其他服务:WMS等
     startOtherServices(t);

文末

AMS的主要作用:

上一篇下一篇

猜你喜欢

热点阅读