Android启动过程分析(2)

1.Zygote 简介
Linux的进程是通过系统调用fork产生,fork出的子进程除了内核中的一些核心的数据结构和父进程不相同外,其余的内存映像都是和父进程共享的。只有当子进程需要去改写这些共享的内存时,操作系统才会为子进程分配一个新的页面,并将的老的页面的数据复制一份到新的页面,这就是所谓的“写时拷贝”,
通常,子进程被fork出来后,会继续执行exec。exec将用一个新的可执行文件的内容替换当前进程的代码段、数据段、堆和栈段,fork加exec是linux启动应用的标准做法,init进程也是这样来启动各种服务的。
Zygote创建应用服务时却只使用fork,没有调用exec。Android应用执行的是Java代码,Java代码的不同才造成应用的区别,而对于运行Java的环境,要求却是一样的。
Zygote初始化时会创建虚拟机,同时把需要的系统类库和资源文件加载到内存里。Zygote fork出子进程后,这个子进程也继承了能正常工作的虚拟机后各种系统资源,接下来子进程只需要装载APK文件中的字节码就可以运行了。这样应用的启动时间将会大大缩短。
2. Zygote进程的初始化
Zygote进程在init进程中以service的方式启动的。
从前面的定义中可以看到Zygote进程的可执行文件是app_process。app_process模块的源文件位于目录frameworks/base/cmds/app_process下,只有一个app_main.cpp。接下来我们来分析下app_process的main函数
(1) 创建AppRuntime对象并保存参数
AppRuntime是在app_process中定义的类,继承了系统的AndroidRuntime类,AndroidRuntime类的主要作用是创建和初始化虚拟机:
代码
(2)解析启动参数:
代码
(3)准备执行ZygoteInit类或者RuntimeInit类的参数:
代码
(4)将本进程的名称改为参数“–nice-name”指定的字符串。缺省情况下niceName的值为”zygote”或者”zygote64”:
代码
(5)启动Java类。如果启动参数带有”–zygote”。执行ZygoteInit类,否则执行通过参数传进来的Java类。
代码
3.启动虚拟机—-AndroidRuntime类
AndroidRuntime类是Android底层很重要的一个类,它负责启动虚拟机以及Java线程。在前面的main()的结尾,调用了AndroidRuntime类的start()函数来执行Java类。Zygote进程运行在Java代码前,还需要初始化整个Java运行环境。我们看看start()函数的执行过程。
(1)打印启动Log:
代码
(2)获取系统目录
系统目录从环境变量ANDROID_ROOT读取。如果没有设置,则默认的设为目录/system,如果手机根目录下没有system目录,Zygote进程会退出。系统目录是在Init进程中创建出来的
代码
(3)启动虚拟机
(4)调用虚函数onVmCreated()
(5) 注册系统的JNI函数
startReg()通过调用register_jni_procs函数将全局数组gRegJNI中的JNI本地函数在虚拟机中注册
(6)准备调用Java类的main()函数的参数。
(7)调用ZygoteInit类的main()方法
代码
调用main()方法前,先通过函数GetStaticMethodID()获得了main()方法的ID,接下来就是使用CallStaticVoidMethod()函数来调用Java层的函数了。至此,Zygote的初始化过程将转到Java层。当然,如果不是启动Zygote,执行的Java类将是RuntimeInit.
4.初始化工作—-ZygoteInit类
ZygoteInit类负责Zygote进程Java层的初始化工作,具体代码如下:
main()方法的主要工作是:
(1) 解析调用的参数
(2) 调用registerZygoteSocket()方法注册Zygote的socket监听端口,用来接收启动应用程序的消息。
调用preload()方法装载系统资源,包括系统预加载类、Framework资源和openGL的资源,这样应用程序被fork处理后,应用程序的内部已经包含了这些系统资源,大大节省了应用的启动时间。
(3)调用startSystemServer()方法启动SystemServer进程。
(4)最后调用runSelectLoop()方法进入监听和接收消息的循环。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值