适用平台:MTK

文章内容包括Android启动流程相关知识

Android 开机启动流程可以分为三个部分,硬件启动,内核启动,Android启动。


硬件启动包括了

Pre-Loader,UBOOT


内核启动

linux kernel


Android启动

init

services

zygote

system server

server manager

home launcher


1 首先来看 内核启动

文件<project root path>/kernel/init/main.c

内核进程寻找并启动init进程。

init进程是linux kernel起来之后启动的第一个用户进程,执行了目录创建挂载、rc文件解析执行、环境设置、启动服务、socket监听等动作。

USER PID PPID VSIZE RSS WCHAN PC NAME
root 1 0 924 568 c018b9f4 0001c040 S /init


2 再来看Android 启动

【专题】Android 启动流程相关_第1张图片


/system/bin/servicemanager 启动

路径:frameworks/base/cmds/servicemanager/service_manager.c

intmain(intargc,char**argv){structbinder_state*bs;void*svcmgr=BINDER_SERVICE_MANAGER;bs=binder_open(128*1024);if(binder_become_context_manager(bs)){ALOGE("cannotbecomecontextmanager(%s)\n",strerror(errno));return-1;}svcmgr_handle=svcmgr;binder_loop(bs,svcmgr_handler);return0;}

Zygote启动

路径:frameworks/base/cmds/system_server/app_process/app_main.cpp

intmain(){AppRuntimeruntime;if(zygote){runtime.start("com.android.internal.os.ZygoteInit",startSystemServer?"start-system-server":"");}}classAppRuntime:publicAndroidRuntime{}

zygoteInit

路径:frameworks\base\core\java\com\android\internal\os\ZygoteInit.java

publicstaticvoidmain(Stringargv[]){if(argv[1].equals("start-system-server")){startSystemServer();}elseif(!argv[1].equals("")){thrownewRuntimeException(argv[0]+USAGE_STRING);}}

SystemServer

路径:frameworks\base\services\java\com\android\server\SystemServer.java

publicstaticvoidmain(String[]args){System.loadLibrary("android_servers");init1(args);}nativepublicstaticvoidinit1(String[]args);

init1()

路径:frameworks/base/services/jni/com_android_server_SystemServer.cpp

staticvoidandroid_server_SystemServer_init1(JNIEnv*env,jobjectclazz){system_init();}/**JNIregistration.*/staticJNINativeMethodgMethods[]={/*name,signature,funcPtr*/{"init1","([Ljava/lang/String;)V",(void*)android_server_SystemServer_init1},};

system_init()

路径:frameworks/base/cmds/system_server/library/system_init.cpp

JNIEnv*env=runtime->getJNIEnv();jclassclazz=env->FindClass("com/android/server/SystemServer");jmethodIDmethodId=env->GetStaticMethodID(clazz,"init2","()V");env->CallStaticVoidMethod(clazz,methodId);

init2()

路径:frameworks\base\services\java\com\android\server\SystemServer.java

wm=WindowManagerService.main(context,power,display,inputManager,uiHandler,wmHandler,factoryTest!=SystemServer.FACTORY_TEST_LOW_LEVEL,!firstBoot,onlyCore);ActivityManagerService.self().setWindowManager(wm);ActivityManagerService.self().systemReady(...);

systemReady()

路径: 路径: frameworks/base/services/java/com/android/server/am/ActivityManagerService.java

publicvoidsystemReady(finalRunnablegoingCallback){mMainStack.resumeTopActivityLocked(null);}

Home Launcher 启动

resumeTopActivityLocked()

路径:frameworks/base/services/java/com/android/server/am/ActivityStack.java

finalbooleanresumeTopActivityLocked(ActivityRecordprev,Bundleoptions){mService.startHomeActivityLocked(0);}

startHomeActivityLocked()

路径:frameworks/base/services/java/com/android/server/am/ActivityManagerService.java

booleanstartHomeActivityLocked(intuserId){Intentintent=newIntent(mTopAction,mTopData!=null?Uri.parse(mTopData):null);....intent.setFlags(intent.getFlags()|Intent.FLAG_ACTIVITY_NEW_TASK);mMainStack.startActivityLocked(null,intent,null,aInfo,null,null,0,0,0,0,null,false,null);}

更多相关文章

  1. Android多进程介绍与用法
  2. Android 双进程守护
  3. Android内核开发:图解Android系统的启动过程
  4. Android 面试经验 - Android 进程间的通信
  5. 为Android内核添加新驱动,并添加到menuconfig菜单【实践简记】
  6. 如何下载android源码与android内核源码

随机推荐

  1. Android(安卓)- Android(安卓)Studio修改
  2. android camera 源码分析(基于应用)
  3. 【Android】状态栏通知Notification、Not
  4. andio:android 音频的代码层次关系
  5. Android(安卓)的 SDK Manager 无法启动
  6. android 程序开发的插件化 模块化方法 之
  7. Android(安卓)恢复出厂设置(recovery)
  8. Android(安卓)ClassLoader解析(2) - Andr
  9. Android(安卓)cupcake源代码获取和编译 f
  10. 学习笔记:原生(android,ios)使用阿里iconf