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的步骤简介:(待续)

android系统开发--HAL层开发基础

Android HAL层,即硬件抽象层,是Google响应厂家“希望不公开源码”的要求推出的新概念 即时kernel层的操作就是对一些IC的读写操作 但是真正的逻辑的操作是在HAL层得操作,但是每一个...

使用Android Studio阅读整个Android源码

之前一直在windows下用source insight阅读Android源码,效果非常好。 后来远程异地服务器,网络限制,一直用ssh + vim,现在主要还是以这种方式。 最近发现一个不错的东...

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

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

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

转自:http://blog.csdn.net/cubelee/article/details/7392552 1.目录树 /framework/base/api  /fra...
  • yhq1913
  • yhq1913
  • 2016年01月01日 20:23
  • 1708

简介Android启动过程

其实吧,大家都不是神,不可能一出生就知道一个事情,都是后天学习的结果。 对于Android启动过程,网上讲的太复杂了,像我们这种菜鸟看都看不明白他说半天说个啥。 所以吧,我决定自己讲讲,简单的讲讲...

Android系统Recovery工作原理之使用update.zip升级过程分析(九)---updater-script脚本语法简介以及执行流程

Android系统Recovery工作原理之使用update.zip升级过程分析(九)---updater-script脚本语法简介以及执行流程           目前...

记录学习过程之六款值得推荐的android(安卓)开源框架简介

学习记录

Android系统Recovery工作原理之使用update.zip升级过程分析(九)---updater-script脚本语法简介以及执行流程

Android系统Recovery工作原理之使用update.zip升级过程分析(九)---updater-script脚本语法简介以及执行流程           目前update...

Android系统Recovery工作原理之使用update.zip升级过程分析(九)---updater-script脚本语法简介以及执行流程

Android系统Recovery工作原理之使用update.zip升级过程分析(九)---updater-script脚本语法简介以及执行流程 转自:http://blog.csd...

Android系统Recovery工作原理之使用update.zip升级过程分析(九)---updater-script脚本语法简介以及执行流程

Android系统Recovery工作原理之使用update.zip升级过程分析(九)---updater-script脚本语法简介以及执行流程...
  • ztguang
  • ztguang
  • 2016年10月17日 22:55
  • 298
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android 启动过程简介
举报原因:
原因补充:

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