`
苗振忠
  • 浏览: 56662 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

Android启动流程

 
阅读更多

android启动

当引导程序启动Linux内核后,会加载各种驱动和数据结构,当有了驱动以后,开始启动Android系统同时会加载用户级别的第一个进程init(system\core\init.c)代码如下:

    int main(int argc, char **argv)
{

    // 创建文件夹 挂载
    mount("tmpfs", "/dev", "tmpfs", 0, "mode=0755");
    mkdir("/dev/pts", 0755);

    // 打卡日志
    log_init();

    INFO("reading config file\n");
    // 加载init.rc配置文件
    init_parse_config_file("/init.rc");

} 

加载init.rc文件,会启动一个Zygote进程,此进程是Android系统的一个母进程,用来启动Android的其他服务进程,代码:

service zygote /system/bin/app_process -Xzygote /system/bin --zygote --start-system-server
socket zygote stream 666
onrestart write /sys/android_power/request_state wake
onrestart write /sys/power/state on
onrestart restart media
onrestart restart netd

从c++代码调到java代码:

    int main(int argc, const char* const argv[])
{
    ...
    // Android运行时环境
    AppRuntime runtime;
    ...
    // Next arg is startup classname or "--zygote"
    if (i < argc) {
        arg = argv[i++];
        if (0 == strcmp("--zygote", arg)) {
            bool startSystemServer = (i < argc) ? 
                    strcmp(argv[i], "--start-system-server") == 0 : false;
            setArgv0(argv0, "zygote");
            set_process_name("zygote");
            // 启动java代码
            runtime.start("com.android.internal.os.ZygoteInit",
         ...

}

ZygoteInit.java 代码:

public static void main(String argv[]) { try { VMRuntime.getRuntime().setMinimumHeapSize(5 * 1024 * 1024);

        // 加载Android依赖的类
        preloadClasses();
        //cacheRegisterMaps();
        preloadResources();
        ...

        if (argv[1].equals("true")) {
            // 启动系统服务
            startSystemServer();
        } else if (!argv[1].equals("false")) {
       ...
}


private static boolean startSystemServer()
     ...
        args = new String[] {
            "--setuid=1000",
            "--setgid=1000",
            "--setgroups=1001,1002,1003,1004,1005,1006,1007,1008,1009,1010,1018,3001,3002,3003,3006",
            "--capabilities=130104352,130104352",
            "--rlimit=8,",
            "--runtime-init",
            "--nice-name=system_server",
            "com.android.server.SystemServer",
      ...

        /* Request to fork the system server process */
        // 母进程开始分叉服务 启动SystemServer
        pid = Zygote.forkSystemServer(
                parsedArgs.uid, parsedArgs.gid,
                parsedArgs.gids, debugFlags, rlimits,
                parsedArgs.permittedCapabilities,
                parsedArgs.effectiveCapabilities);
    ..
}

SystemServer.java 代码

public static void main(String[] args) {
    ... 
    // 加载jni库
    System.loadLibrary("android_servers");
    // 调用native方法
    init1(args);
}
native public static void init1(String[] args);

SystemServer 对应的c++代码 comandroidserver_SystemServer.cpp 代码如下:

// 类似java的抽象方法
extern "C" int system_init();

static void android_server_SystemServer_init1(JNIEnv* env, jobject clazz)
{   
    // 转调
    system_init();
}

/*
 * JNI registration.
 */
static JNINativeMethod gMethods[] = {
    /* name, signature, funcPtr */ 
    // 函数指针 把init1方法映射到android_server_SystemServer_init1
    { "init1", "([Ljava/lang/String;)V", (void*) android_server_SystemServer_init1 },
};

systeminit 的实现方法在Systeminit.cpp 代码如下:

extern "C" status_t system_init()
{
    ...
    // 启动硬件的服务
    if (strcmp(propBuf, "1") == 0) {
        // Start the SurfaceFlinger
        SurfaceFlinger::instantiate();
    }



    AndroidRuntime* runtime = AndroidRuntime::getRuntime();

    LOGI("System server: starting Android services.\n");
    // 启动完硬件服务后,又回到Systemserver的init2方法
    runtime->callStatic("com/android/server/SystemServer", "init2");
    ...
}

SystemServer 的init2方法代码:

public static final void init2() {
        Slog.i(TAG, "Entered the Android system server!");
        Thread thr = new ServerThread();
        thr.setName("android.server.ServerThread");
        thr.start();
    }

ServerThread的run方法:

public void run() { ... // 开启Android各种服务并且添加到ServiceManager去管理 Slog.i(TAG, "Device Policy"); devicePolicy = new DevicePolicyManagerService(context); ServiceManager.addService(Context.DEVICEPOLICYSERVICE, ottle =

    ...
    // We now tell the activity manager it is okay to run third party
    // code.  It will call back into us once it has gotten to the state
    // where third party code can really run (but before it has actually
    // started launching the initial applications), for us to complete our
    // initialization.
    // 各种服务开启后调用ActivityManagerService.systemReady
    ((ActivityManagerService)ActivityManagerNative.getDefault())
            .systemReady(new Runnable() {
        public void run() {
            Slog.i(TAG, "Making services ready");

ActivityMangerService的systemReady的方法:

public void systemReady(final Runnable goingCallback) {
        ...
        // 打开第一个Activity
            mMainStack.resumeTopActivityLocked(null);
        }
    }

ActivityStack的resumeTopActivityLocked方法

final boolean resumeTopActivityLocked(ActivityRecord prev) {
        // Find the first activity that is not finishing.
        // 没有已经打开的Activity next为 null
        ActivityRecord next = topRunningActivityLocked(null);

        // Remember how we'll process this pause/resume situation, and ensure
        // that the state is reset however we wind up proceeding.
        final boolean userLeaving = mUserLeaving;
        mUserLeaving = false;

        if (next == null) {
            // There are no more activities!  Let's just start up the
            // Launcher...

            if (mMainStack) {
                // 启动lucher应用的锁屏界面
                return mService.startHomeActivityLocked();
            }
        }

Android系统启动完成,打开了Luncher应用的Home界面。


分享到:
评论

相关推荐

    android启动流程

    android启动流程,以uml图的方式显示了android的启动流程

    Android 启动过程详解

    ### Android启动过程详解 #### 一、概述 Android操作系统启动过程是一个复杂且精细的过程,它涉及到从硬件层面的初始化到最终用户界面的呈现。整个启动流程可以大致分为以下几个阶段: 1. **init进程启动** 2. **...

    android启动流程解析

    android启动流程详解,对启动中所遇到的重要进程进行简单的分析

    android启动流程.xmind

    通过网络资源简要的分析了android启动流程,该流程需要配合我的博客《基于arm的android启动流程概要分析》来看。

    android 核心分析之------Android 启动过程详解

    Android启动过程是一个复杂且有序的流程,涉及多个关键阶段,从硬件初始化到最终的用户界面呈现。这一过程可以分为四大步骤:init进程启动、Native服务启动、SystemServer与Android服务启动以及Home启动。 #### 第...

    Android启动流程(部分)

    http://blog.csdn.net/xiaoru5127/article/details/76585007

    Android 启动过程相关资料

    Android启动过程是一个复杂而有序的系统初始化阶段,涵盖了操作系统内核加载、系统服务启动、用户界面呈现等多个步骤。在这个过程中,Makefile起着至关重要的作用,它是构建Android系统的基石之一。 首先,Android...

    Android 启动流程分析

    总结起来,Android启动流程涉及多个关键步骤,包括内核加载、init进程初始化、Zygote孵化、SystemServer启动以及各种服务的创建。理解这一流程对优化应用性能、调试问题和开发自定义系统都有极大的帮助。通过深入...

    Android启动过程分析

    Android启动过程是操作系统与硬件初始化、系统服务启动及应用程序环境建立的复杂流程。本文将从Init进程的启动入手,详细解析Android设备如何从电源开启到用户界面呈现的整个过程。 #### Init进程启动过程 在...

    Android启动流程app安装和启动原理.docx

    在深入探讨Android应用的安装和启动原理之前,我们先简单回顾一下Android系统的启动流程。当设备启动时,Bootloader引导加载Linux内核,接着init进程启动。init进程是Android系统中的第一个进程,它负责启动一系列的...

    Android启动过程详解[借鉴].pdf

    Android 启动过程详解 Android 启动过程可以分为四个步骤:init 进程启动、Native 服务启动、System Server 启动和 Home 启动。 第一步:init 进程启动 init 进程是 Android 启动的第一个进程,由内核启动的用户...

    android启动流程.pptx

    详细分析了android启动流程,从uboot到Kernel再到android的流程,从汇编到启动第一个进程init结束

    展锐Android11.0开机启动流程介绍V1.0-nowatermark

    本文档对 Android 11.0 平台开机启动流程进行了详细的介绍,涵盖了 Android 架构图、系统启动流程、init 启动流程、Zygote 启动流程、System Server 启动流程等关键部分。 Android 架构图 Android 系统架构图主要...

Global site tag (gtag.js) - Google Analytics