Class Overview
AndroidRuntime 是android中一个很重要的组成部分,引导系统(init)会调用到AndroidRuntime 中的start函数,在这个函数里完成启动android的一切工作。
1、首先会创建一个信号管道(blockSigpipe),在这个函数中首先初始化了一个信号集(指针为mask),之后将SIGPIPE设置到这个信号集中,最后作一次信号集的遮罩(联级)。
2、设置默认的系统根目录,如果在环境变量(ANDROID_ROOT)中有设置,则以设置为准,否则默认/system为系统根目录。
3、调用startVm启动android 虚拟机。在这个函数里面主要是对一些参数的解析,和变量的初始化。如虚拟机的运行模式,是否检查dex校验和,设置默认语言类型等等。当这一切都准备就绪了,调用JNI_CreateJavaVM来创建运行JavaVM。如果运行失败,则直接释放所有相关资源,并退出。否则返回一个带入参数 JNIEnv* env。
4、得到env之后,标志着javaVM已经可以初始化完毕了,此时开始注册android的native函数。当然此时不是真正的要将所有函数都注册进来,只不过是注册了一个用于注册的回调函数(javaCreateThreadEtc)而已。
诸如com.x7.program.test这样形式的类)名转变为目录形式(com/x7/program/test),然后开始找这个文件是否存在。找到之后开始查找运行入口(main),一切OK之后调用这个入口函数,运行java程序。而这个关键的入口类就是com.android.internal.os.RuntimeInit。
如果退出,则运行到本步,分别调用DetachCurrentThread以及DestroyJavaVM的函数释放这个线程(运行Java的线程),然后释放所有相关的资源。
对Java开发者而言,最有关系的信息是Android Runtime:
1、Android包括一组核心库(core libraries),他提供了 Java 编程语言的核心库中大多数可用功能。
2、每个 Android 应用程序运行在自己的进程上,有自己的 Dalvik 虚拟机实例。 Dalvik这样是为了使一个设备可以有效地运行多个虚拟机。 Dalvik VM 以被优化占用最小内存的Dalvik Executable (.dex)格式执行文件。VM 是基于寄存器的,并通过一个 Java 语言编译器的编译来运行,而这个Java编译器已经被内置的"dx"工具转成.dex 格式。
3、Dalvik MicrosoftVM 依赖 Linux 内核获得基本功能,如线程处理和低层内存管理。