【专题】Android 启动流程相关
适用平台: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 启动
/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);}
更多相关文章
- Android多进程介绍与用法
- Android 双进程守护
- Android内核开发:图解Android系统的启动过程
- Android 面试经验 - Android 进程间的通信
- 为Android内核添加新驱动,并添加到menuconfig菜单【实践简记】
- 如何下载android源码与android内核源码