注意是应用程序进程的启动过程,不是应用程序启动过程。应用程序启动之前要保证该应用程序的进程已经启动。
应用程序进程的启动过程如下:
- AMS发送启动应用程序进程请求。
- 首先,AMS会调用startProcessLocked方法,向Zygote进程发送请求。它会创建应用程序进程的用户ID,对用户ID进行创建和赋值。
- 调用Process的start方法。它会调用ZygoteProcess的start方法,而这个方法又会调用startViaZygote方法、zygoteSendArgsAndGetResult方法、openZygoteSocketIfNeeded方法,用于将应用程序进程的启动参数写入ZygoteState中。
- Zygote接收请求并创建应用程序进程。
- Socket连接成功并匹配ABI之后,会返回ZygoteState类型对象。前面也说到了,应用参数会被写入这个对象。这样Zygote进程就会收到一个创建新的应用程序进程的请求,在ZygoteInit的main方法中,会调用runSelectLoop方法。
- 之后,在runSelectLoop方法中,会调用ZygoteConnection的runOnce方法处理数据,会调用readArgumentList方法来获取应用程序进程的启动参数,并将返回的字符串数组args封装到Arguments类型的parsedArgs对象中,调用Zygote的forkAndSpecialize方法来创建应用程序,参数为parsedArgs中存储的参数,如果它的返回值pid为0(说明当前代码逻辑运行在新创建的子进程中),这个时候就会调用handleChildProc方法来处理应用程序进程。
- handleChildProc方法调用ZygoteInit的zygoteInit方法。它又会调用RuntimeInit的applicationInit方法,这个方法又会调用invokeStaticMain方法,它的第一个参数就是android.app.ActivityThread。
- invokeStaticMain方法会通过反射获得android.app.ActivityThread类,并且获得它的main方法,将main方法传入Zygote中的MethodAndArgsCaller类的构造方法中,然后抛出的MethodAndArgsCaller异常会被Zygote的main捕获。
- Zygote的main方法捕获到MethodAndArgsCaller异常,会调用MethodAndArgsCaller的run方法,MethodAndArgsCaller是Zygote.java的静态内部类。
- Zygote.java中的mMethod指的就是ActivityThread的main方法,调用mMethod后,ActivityThread的main方法就会被动态调用,应用程序进程就进入了ctivityThread的main方法中,应用程序进程就创建完成并且运行了主线程的管理类ActivityThread。