Android 启动过程简介

原创 2012年03月22日 15:06:29

        从某个方面来讲,我们可以将安卓看成是LINUX之上的一种XWINDOW。所以系统启动的过程难免要先从linux kernel开始讲起。当然linux kernel的启动不是我们这里需要讨论的问题。

       本人最近试图在framework层添加一个自己的service,之前研究了一下但还不是特别清楚。故以此理清思路。也希望能够给同样在研究这部分的朋友好的提示。由于Android系统非常的庞大。所以要清晰的明白这些东西,一定要好好的研究它的实现机制。

概述

        Android系统在启动时首先会启动Linux基础系统,然后引导加载Linux Kernel并启动初始化进程(Init)。接着启动Linux守护进程。在启动Linux守护进程的同时还需要启动Zygote进程。包括初始化一个Dalvik虚拟机实例。装载Socket请求所需的类和监听。创建虚拟机实例来管理应用程序的进程。

      在Zygote之后需要初始化runtime进程。在这个过程中主要进行服务管理器的初始化和注册。

详解

       第一步:initial进程(System\core\init)
       init进程,它是一个由内核启动的用户级进程。内核自行启动之后,就通过启动一个用户级程序init的方式完成引导进程。在第一个进程中会读取init.rc。在这个文件中会启动servicemanager,zygote……等基本的服务。
       在init.c@system/core/init。会调用parse_config_file(init.rc)解析脚本文件init.rc。(init.rc是Android init language。具体的描述在./readme.txt)此处具体如何让解析的还需要进行研究。

      Android在开机启动后,经过一系列的加载流程,将进入frameworks\base\cmds\app_process\app_main.cpp进而执行main()方法。

    188    if (zygote) {
    189         runtime.start("com.android.internal.os.ZygoteInit",
    190                 startSystemServer ? "start-system-server" : "");
    191     } else if (className) {
    192         // Remainder of args get passed to startup class main()
    193         runtime.mClassName = className;
    194         runtime.mArgC = argc - i;
    195         runtime.mArgV = argv + i;
    196         runtime.start("com.android.internal.os.RuntimeInit",
    197                 application ? "application" : "tool");
    198     } else {
    199         fprintf(stderr, "Error: no class name or --zygote supplied.\n");
    200         app_usage();
    201         LOG_ALWAYS_FATAL("app_process: no class name or --zygote supplied.");
    202         return 10;
    203     }

        (在frameworks\base\core\jni文件夹下存在com_android_internel_os_ZygoteInit.cpp文件。在此文件中通过register_com_android_internel_os_ZygoteInit函数调用AndroidRuntime::registerNativeMethods函数。)

最终会调用到frameworks/base/core/jni/AndroidRuntime.cpp的start()方法。事实上,Android API与本地方法的注册关联就是在AndroidRuntime.cpp模块里完成的。

Android  framework层的API函数对应的本地方法映射和注册原理简析:

        Android启动之后,本地方法的注册关联是在调用AndroidRuntime::startReg过程中完成的。在AndroidRuntime的静态数组gRegJNI[]存储了各个framework子模块本地方法关联信息。数组gRegJNI[]的每一个元素存储了各个模块的注册相关的函数指针,这个函数指针的功能是把子模块中众多的本地函数关联添加进系统中。子模块中的众多本地函数也是通过子模块的静态数组被上述函数指针指向的函数作为参数来使用。注册的关联具体是通过在startReg中调用register_jni_process方法把静态数组gRegJNI[]数组存储的各个framework子模块本地方法关联信息注册到系统中。

        具体的注册JNI的步骤简介:(待续)

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

android6.0源码分析之Runtime的初始化

Android运行时是android中至关重要的,它是在Init进程和Zygote进程的中间进行初始化的,本文将分析其具体的初始化过程,并将分析非Zygore模式下的RuntimeInit过程.

Android Activity启动机制流程和四种启动模式

Activity启动大致流程: 无论是通过Launcher来启动Activity,还是通过Activity内部调用startActivity接口来启动新的Activity,都通过Binder进程间通信...

Android系统启动流程

转自http://blog.csdn.net/lizhiguo0532/article/details/7017503 Android系统启动流程 -- bootloader 摘要:本文讲解A...

android开机启动流程简单分析

android启动 当引导程序启动Linux内核后,会加载各种驱动和数据结构,当有了驱动以后,开始启动Android系统同时会加载用户级别的第一个进程init(system\core\init\i...
  • H_Gao
  • H_Gao
  • 2017-02-14 19:42
  • 732

Android的BUG,一个频繁重启问题

使用过Android的同学,尤其是用过山寨pad,应该对Android的重启问题印象深刻吧。Android由于其设计的复杂性,可能会使得系统在不经意时陷入异常状态,因此Android设计了一套看门狗机...

Android系统启动流程(一)解析init进程启动过程

作为“Android框架层”这个大系列中的第一个系列,我们首先要了解的是Android系统启动流程,在这个流程中会涉及到很多重要的知识点,这个系列我们就来一一讲解它们,这一篇我们就来学习init进程。

[RK3288][Android6.0] 调试笔记 --- 通过adb安装APK时间很长问题

Platform: Rockchip OS: Android 6.0 Kernel: 3.10.92 使用adb安装apk [kris@:~/Downloads]$ adb install...

Android系统启动过程简介(上)

本文转载整理自:http://www.linuxidc.com/Linux/2011-10/45067.htm 一、 简介 在Linux内核启动后,init 1(1号进程)将作为第一个用户空间...

Android——Framework目录分析及系统启动过程以及目录简介

转自:http://blog.csdn.net/cubelee/article/details/7392552 1.目录树 /framework/base/api  /fra...

简介Android启动过程

其实吧,大家都不是神,不可能一出生就知道一个事情,都是后天学习的结果。 对于Android启动过程,网上讲的太复杂了,像我们这种菜鸟看都看不明白他说半天说个啥。 所以吧,我决定自己讲讲,简单的讲讲...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)