您的位置:首页 > 移动开发 > Android开发

Android启动过程

2015-11-24 19:07 447 查看
* 第一阶段是Linux的启动: Bootloader,Kernel,Driver等

* 第二阶段是真正的Android的启动

Android启动生命周期流程

第一步:启动Linux:

1. Bootloader

2. Kernel

第二步:Android系统启动:

入口为Init.rc(system\core\rootdir)

1. /system/bin/servicemanager:Binder守护进程;

2. Runtime;

3. Zygote:app_process/App_main;

4. Start VM;

5. System Server;

6. Start Android Services:Register to ServiceManager;

7. Start Launcher.

第三步:应用程序启动:运行PackageManager

流程说明

1. Android的servicemanager文件位于/system/bin/servicemanager中,在系统启动一开始会通过源码为ServiceManager.java的文件实例化一个Daemon Process,用于在后台维护系统的运行;

2. 启动/system/bin下的zygote的时候实际上启动了app_main.cpp,该系统文件CPP位于frameworks\base\cmds\app_process\app_mian.cpp文件中;

3. app_main.cpp调用了AndroidRuntime.cpp,然后AndroidRuntime.cpp通过JNI调用了ZygoteInit.java, ZygoteInit.java又调用了SystemServer.java;

4. SystemServer.java通过JNI调用了com_android_server_systemService.cpp,然后通过运行system_init.cpp反过来调用SystemServer.java中的init2()这个方法,此时在init2()这个方法中调用了runtime->callStatic(“com/android/server/SystemServer”,”init2”)启动ServerThread线程

5. 服务线程ServerThread包含下面的功能:

* PowerManagerService:电源管理;

* ActivityManagerService:组件管理;

* WindowManagerService:窗口管理;

* PackageManagerService:应用程序是通过该Service启动的

* ......

Android Process Interface



ServiceManager

1. 做为一个进程在Android加载之前就被启动;

2, init.rc中看到这个配置项:

service servicemanager

/system/bin/servicemanager

3, ServiceManager是Binder的服务管理守护进程,是Binder的核心,由其使用Binder驱动进行IPC管理;

4, ServiceManager.java是通过Proxy与这个守护进程进行的通讯;

Zygote

init.rc中的配置:

service zygote

/system/bin/app_process -Xzygote

/system/bin --zygote --start-system-server

Zygote是所有Android应用程序的孵化器;

app_process代码位置:

frameworks/base/cmds/app_process/app_main.cpp

app_main.cpp

在main()函数中有如下代码:

if (0 == strcmp("--zygote", arg)) {
bool startSystemServer = (i < argc) ?
strcmp(argv[i], "--start-system-server") == 0 : false;
setArgv0(argv0, "zygote");
set_process_name("zygote");
runtime.start("com.android.internal.os.ZygoteInit",
startSystemServer);
}


追踪到AndroidRuntime,代码位于:

frameworks/base/core/jni/AndroidRuntime.cpp

AndroidRuntime.cpp

在start()函数中有如下代码:

/* start the virtual machine */
if (startVm(&mJavaVM, &env) != 0)
goto bail;
……
env->CallStaticVoidMethod(startClass, startMeth, strArray);


即先启动了虚拟机,然后利用JNI调用了zygoteInit函数;

ZygoteInit.java的路径是:

frameworks/base/core/java/com/android/internal/os/ZygoteInit.java

ZygoteInit.java

ZygoteInit.java的main()函数:

if (argv[1].equals("true")) {
startSystemServer();
} else if (!argv[1].equals("false")) {
throw new RuntimeException(argv[0] + USAGE_STRING);
}
Log.i(TAG, "Accepting command socket connections");
if (ZYGOTE_FORK_MODE) {
runForkMode();
} else {
runSelectLoopMode();
}


ZygoteInit.java解读

前一部分是在启动系统服务,后一部分是虽然是一个条件判断,但ZYGOTE_FORK_MODE被赋了false,所以进行else分支的runSelectLoopMode()函数;

在runSelectLoopMode()函数中,实际上是在一死循环中利用zygoteConnection类通过socket的方式进行消息处理,用于fork出新的zygote,从而以最轻量级的方式实现每个进程一个虚拟机的机制;

startSystemServer()

startSystemServer(),代码位于:

frameworks/base/services/java/com/android/server/systemserver.java;

在systemserver.java的 main()函数中调用了init1(args)这个native函数,利用JNI机制,跟踪frameworks/base/services/jni/com_android_server_systemService.cpp;

执行到frameworks/base/cmds/system_server/library/system_init.cpp

system_init()

if (strcmp(propBuf, "1") == 0) {
// Start the SurfaceFlinger
SurfaceFlinger::instantiate();
}
AndroidRuntime* runtime = AndroidRuntime::getRuntime();
LOGI("System server: starting Android services./n");
runtime->callStatic("com/android/server/SystemServer", "init2");


完成了SurfaceFlinger的实例化,然后利用运行时的callStatic()函数调用了SystemServer的init2()函数

init2()

Init2()函数位于:frameworks/base/services/java/com/android/server/SystemServer.java

具体代码:

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线程中启动各项Android服务
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: