android(二)、 应用启动过程
自android 的framework框架启动后,运行一个应用的环境已经准备好了。
比较重要的部分如下:
ActivityManagerService主要负责管理Activity,Service,BroadcastReceiver。
WindowMangerService负责窗口管理,窗口的创建,添加显示,删除。
ActivityThread应用程序主线程代理,负责与外部进行通信;ActivityThread内部有一个ApplicationThread内部类,它是Binder的子类,是ActivityThread对外通信的接口。ActivityThread是应用程序的实际操作者(实际操作Activity,Service,BroadcastReceiver);
ZygoteInit-主要负责进程的创建,android(linux)中一般是fork(COW:Copy-On-Write )一个新进程。
ZygoteConnection-封装了ZygoteInit中LocalServerSocket中的处理请求。
这里就先说一下用户进程。当用户第一次点击手机上应用的图标,会去加载开发者设置的主Activity。
1、首先会Launcher会发送一个创建Activity的信息到ActivityManagerService,ActivityManagerService首先会检测Activity所在的所在的进程是否已经创建,如果没有那么就会发送创建信息到到Process;
Process.ProcessStartResult startResult = Process.start("android.app.ActivityThread",app.processName, uid, uid, gids, debugFlags, mountExternal,app.info.targetSdkVersion, null, null);2、Process收到创建进程的信息后,通过LocalSocket访问LocalServerSocket,向LocalServerSocket(ZygoteInit中)发送创建进程的消息。
3、ZygoteConnection中的LocalServerSocket收到请求后,执行了
pid = Zygote.forkAndSpecialize(parsedArgs.uid, parsedArgs.gid, parsedArgs.gids,
parsedArgs.debugFlags, rlimits, parsedArgs.mountExternal, parsedArgs.seInfo,parsedArgs.niceName);
而后调用了ZygoteInit.invokeStaticMain(ClassLoader loader,String className, String[] argv)
将收到的参数android.app.ActivityThread 用反射的方式调用ActivityThread的main方法,这样用户进程便创建完毕。
4、执行Activity的创建和显示操作步骤。