Android 深入系统完全讲解
Posted 程序员入门进阶
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android 深入系统完全讲解相关的知识,希望对你有一定的参考价值。
3 Zygote 虚拟机的流程,学习方法
说完了 init 的启动过程,我们来说说 Zygote 的启动过程。
这里我们看下整个的步骤,主要完成了:
1 startVM() 创建虚拟机
2 startReg() 注册 JNI 方法
3 preload()预加载通用类,这里主要是 framework-res.apk 这样子理解非常重要
4 startSystemServer 启动系统服务进程,非常重要
5 等待 fork 创建新的进程
我们来看下代码:
这里我们要看到的是 else ,我们很多命令跑起来是用的这个,可以启动对应的 jar 包的具体类。
比如/system/bin/am ,大家打开可以看看它的内容,我们后面会讲到这个。
于是我们来到了 androidRuntime.cpp,因为 runtime 是这个具体实现的,而我们的 AppRuntime 是继承的这个类。
创建完成虚拟机后,注册了对应的本地实现,后面的 Java 就可以解析执行了。
进入 Java 世界,调用这个静态方法,这个是我们参数带来的,就是 ZygoteInit,于是我们可以进入 Java 世界了。
于是我们来到了 frameworks\\base\\core\\java\\com\\android\\internal\\os\\ZygoteInit.java ,打开看
它的 main 方法。
这里顺便讲一下,我们这么来理解,就是我们用 C 语言实现了一个解析一套定义格式的内容,然后对应的有一些 C 的实现让它可以操作硬件,最终显示出来。
我们把这个定义的解析这一套格式叫做 Java 虚拟机,这里就是 Android 虚拟机,而能够解析的格式就是 DEX,也就是我们 APK 里面解压出来的文件。这样子去理解会好很多。
这里就是预加载资源,为所有后续的应用进程提供系统资源。我遵循不纠结细节,直接跟踪路线,细节交给自己学习,如果你看一本书,还是要让将非常详细,你是没法进阶的。Fork子进程时候可以快速的把父进程加载的内容复用,于是这里加载一些应用都会用到的资源。
frameworks/base/config/preloaded-classes,细节跟踪方法就可以看到。
我们一般的做法就是找一些大概原理,路径,然后在阅读代码中掌握。
完成创建系统服务之后,进入等待事件,主要是一些重启消息,还有关键的就是接受到系统给的创建进程任务。zygoteServer.runSelectLoop(abiList);
那么这里就看到我们的 SystemServer 出现了,于是我们下一节来学习这个的过程。虚拟机的学习方法,可以先去了解 Java 虚拟机,然后再学习 Android 的虚拟机,始终记得这个就是实现了一套机制,解析具体格式,需要内存管理,语法解析,执行等。通过这个抽象,就能确定你在学什么,否则会学的迷失。
以上是关于Android 深入系统完全讲解的主要内容,如果未能解决你的问题,请参考以下文章