AndroidRuntime 流程

  从 Android 4.4 开始,Google 开发者引进了新的 Android 运行环境 ART(意思就是 Android
Runtime。Android 官方页面的介绍中,也将其称作新的虚拟机),以替代旧的 Dalvik VM。它现在是实验选项,系统默认的运行环境仍然是
Dalvik。

  ART 的机制与 Dalvik 不同。在 Dalvik 下,应用每次运行的时候,字节码都需要通过即时编译器转换为机器码,这会拖慢应用的运行效率,而在
ART
环境中,应用在第一次安装的时候,字节码就会预先编译成机器码,使其成为真正的本地应用。这个过程叫做预编译(AOT,Ahead-Of-Time)。这样的话,应用的启动和执行都会变得更加快速。

  预编译也会带来一些缺点。一方面,机器码占用的存储空间更大;另一方面,应用的安装时间会变长。

  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)而已。

  5、正式开始启动VM(该线程将一直运行下去,直到VM退出),此时是一个标准的C程序加载java的方法,首先将java的类(诸如com.x7.program.test这样形式的类)名转变为目录形式(com/x7/program/test),然后开始找这个文件是否存在。找到之后开始查找运行入口(main),一切OK之后调用这个入口函数,运行java程序。而这个关键的入口类就是com.android.internal.os.RuntimeInit。

  6、其实在第5步最后的时候线程是否退出已经取决于所调用的java程序了,如果退出,则运行到本步,分别调用DetachCurrentThread以及DestroyJavaVM的函数释放这个线程(运行Java的线程),然后释放所有相关的资源。

AndroidRuntime 流程,布布扣,bubuko.com

时间: 2024-12-25 00:54:04

AndroidRuntime 流程的相关文章

【转】 Android的NDK开发(1)————Android JNI简介与调用流程

原文网址:http://blog.csdn.net/conowen/article/details/7521340 ******************************************************************************************** * author:[email protected]大钟                                                                      

System进程的启动流程第二部分

继System进程的启动流程第一部分,我们接着分析com.android.server.SystemServer的main函数.如下: public class SystemServer { ...... native public static void init1(String[] args); ...... public static void main(String[] args) { ...... init1(args); ...... } public static final vo

Android系统启动流程分析

随着Android版本的升级,aosp项目中的代码也有了些变化,本文基于Android 7.0分析Android系统启动流程. 简单来说Android系统启动大体如下: init进程 和所有Linux系统一样,Android系统的启动同样是从init进程启动.init进程会解析init.rc文件(关于init.rc中的语法,可以参见我之前写的深入分析AIL语言及init.rc文件),加载相关目录,并启动相关服务 init进程在/system/core/init/init.c init.rc文件在

android代码启动流程2

上回 说到,开始调用 ZygoteInit  main 函数,main 函数: registerZygoteServer:注册一个 zygote server socket,所有来自客户端的连接都通过 socket 方式连接: preload:预加载系统的类库和资源,这样其他程序启动将不再加载系统资源,只需加载自己程序的资源,这样就达到系统资源在程序之间共享: startSystemServer: private static boolean startSystemServer() throws

Android5 Zygote 与 SystemServer 启动流程分析

Android5 Zygote 与 SystemServer 启动流程分析 Android5 Zygote 与 SystemServer 启动流程分析 前言 zygote 进程 解析 zygoterc 启动 SystemServer 执行 ZygoteInitrunSelectLoop SystemServer 启动过程 Zygote 的 fork 本地方法分析 forkSystemServer ZygoteHookspreFork 创建 system_server 进程 ZygoteHooks

Tiny4412 Android 启动流程

Android系统的启动主要包括三个阶段: ①BootLoader启动 ②Linux Kernel启动 ③Android系统启动 前面我们大致分析了前面两个步骤,即u-boot和内核的启动流程(内核启动流程待完善-_-!!),这次就来分析以下Linux内核启动之后是怎样挂载起Android这个"根文件系统"的.Android系统在Linux内核上运行了一系列的系统服务. 和Linux系统类似,Android系统中第一个被启动的进程也是init进程,它的PID为0.Android系统的i

Android 框架启动流程

As we all know,Android手机系统本质上是一个基于Linux的应用程序,它以Linux系统为内核.因此系统的启动过程包括Linux内核启动和Android框架启动两个阶段. Linux内核启动 1.装载引导程序bootloader Linux内核启动时首先装载执行bootloader引导程序,装载完成后进入内核程序. 2.加载Linux内核 Linux内核加载主要包括初始化kernel核心(内存初始化,打开中断,初始化进程表等).初始化驱动.启动内核后台(daemons)线程.

Zygote进程的启动流程

Zygote进程时由Android系统的第一个进程init启动起来的.init进程时在内核加载完成之后就启动起来的,它在启动的过程中,会读取根目录下的一个脚本文件init.rc,以便可以将其他需要开机启动的进程也一起启动起来. Zygote进程在脚本文件init.rc中的启动脚本如下: service zygote /system/bin/app_process -Xzygote /system/bin --zygote --start-system-server socket zygote s

平述factory reset ——从main system到重引导流程

关于Android或linux的引导流程,网上大都是从开机开始讲述的,或者直接跳过bootloader引导阶段,直接从init进程开始说起.这里我从手机正常运行状态开始,到重启状态以及重启之后的状态略做陈述,意在给读者展开一个更加直白的整机引导框架. 一.device重启之前 在手机的"setting–>备份与重置->恢复出厂设置"里可以找到该设置,一旦执行了该设置,我们的手机便会恢复到原出厂设置状态,当然里面的用户数据.我们自行安装的应用等都将被全部清除(有些选项是可选择