Zygote详解
1.Zygote概述
Zygote是Android系统应用中一个相当重要的进程,主要功能是执行Android应用程序。
应用程序每次运行都要重新初始化并启动虚拟机,这个过程会耗费相当长时间。
应用程序运行前,Zygote进程通过共享已运行的虚拟机的代码与内存信息,缩短应用程序运行所耗费的时间。
为什么要研究Zygote?
通常子进程被fork出来后,会继续执行系统调用exec,exec将用一个新的可执行文件的内容替换当前进程的代码段、数据段、堆和栈段。
Zygote运行和init进程运行的区别:
(1)Zygote创建应用程序时只使用了fork,没有调用exec。
(2)Zygote初始化时会创建虚拟机,把需要的系统类库和资源文件加载到内存里。
(3)Zygote fork出子进程后,整个子进程也继承了正常工作的虚拟机和各类系统资源,然后子进程只需要装载APK文件的字节码文件就可以运行了。
2.Zygote孵化进程
系统启动后运行的首个进程init,init进程启动运行系统需要的各种Daemon,启动Zygote进程。
Zygote启动后,初始化运行Dalvik虚拟机——>然后将所需要的类和资源加载到内存中,再调用fork()创建出Zygote子进程,——>接着子进程动态加载并运行Android程序,——>运行的应用程序A会使用Zygote已经初始化并启动运行的Dalvik虚拟机代码,使用已加载至内存中的类和资源来加快运行速度。
3.由app_process运行ZygoteInit class
Zygote不能直接由init进程启动运行,运行Zygote类,必须先生成Dalvik,再在Dalvik虚拟机上装载运行ZygoteInit类,这一过程由app_process完成
app_process先会生成一个Appruntime对象,然后生成Dalvik虚拟机,最后再调用ZygoteInit类的main方法。
3.1 生成AppRuntime对象
3.2 调用Apprutime对象
3.3 创建Dalvik虚拟机
AppRuntime的start()函数通过调用JNI_CreateJavaVM()函数来创建虚拟机
3.4 运行Zygotelnit类
4.ZygoteInit类的功能
我们已经创建好虚拟机,并将ZygoteInit类装载到虚拟机中,ZygoteInit类会被运行
原文始发于微信公众号(安全后厨):Android逆向学习68——Zygote详解
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论