android开机启动流程简单分析.docx
- 文档编号:29856169
- 上传时间:2023-07-27
- 格式:DOCX
- 页数:15
- 大小:231.46KB
android开机启动流程简单分析.docx
《android开机启动流程简单分析.docx》由会员分享,可在线阅读,更多相关《android开机启动流程简单分析.docx(15页珍藏版)》请在冰豆网上搜索。
android开机启动流程简单分析
android开机启动流程简单分析
android启动
当引导程序启动Linux内核后,会加载各种驱动和数据结构,当有了驱动以后,开始启动Android系统同时会加载用户级别的第一个进程init(system\core\init\init.cpp)代码如下:
intmain(intargc,char**argv){
.....
//创建文件夹,挂载
//Getthebasicfilesystemsetupweneedputtogetherintheinitramdisk
//on/andthenwe'llletthercfilefigureouttherest.
if(is_first_stage){
mount("tmpfs","/dev","tmpfs",MS_NOSUID,"mode=0755");
mkdir("/dev/pts",0755);
mkdir("/dev/socket",0755);
mount("devpts","/dev/pts","devpts",0,NULL);
#defineMAKE_STR(x)__STRING(x)
mount("proc","/proc","proc",0,"hidepid=2,gid="MAKE_STR(AID_READPROC));
mount("sysfs","/sys","sysfs",0,NULL);
}
.....
//打印日志,设置log的级别
klog_init();
klog_set_level(KLOG_NOTICE_LEVEL);
.....
Parser&parser=Parser:
:
GetInstance();
parser.AddSectionParser("service",std:
:
make_unique
parser.AddSectionParser("on",std:
:
make_unique
parser.AddSectionParser("import",std:
:
make_unique
//加载init.rc配置文件
parser.ParseConfig("/init.rc");
}
加载init.rc文件,会启动一个Zygote进程,此进程是Android系统的一个母进程,用来启动Android的其他服务进程,代码:
从AndroidL开始,在/system/core/rootdir目录中有4个zygote相关的启动脚本如下图:
在init.rc文件中,有如下代码:
import/init.environ.rc
import/init.usb.rc
import/init.${ro.hardware}.rc
import/init.usb.configfs.rc
import/init.${ro.zygote}.rc
注意到上面的代码import/init.${ro.zygote}.rc,这里会读取ro.zygote这个属性,导入相应的init.rc文件。
ro.zygote的属性可为:
zygote32、zygote64、zygote32_64、zygote64_32。
对于这个属性的解释如下。
init.zygote32.rc:
zygote进程对应的执行程序是app_process(纯32bit模式)
init.zygote64.rc:
zygote进程对应的执行程序是app_process64(纯64bit模式)
init.zygote32_64.rc:
启动两个zygote进程(名为zygote和zygote_secondary),对应的执行程序分别是app_process32(主模式)、app_process64。
init.zygote64_32.rc:
启动两个zygote进程(名为zygote和zygote_secondary),对应的执行程序分别是app_process64(主模式)、app_process32
主流的机型属性都为zygote64_32,我们来看看init.zygote64_32.rc文件:
servicezygote/system/bin/app_process64-Xzygote/system/bin--zygote--start-system-server--socket-name=zygote
classmain
socketzygotestream660rootsystem
onrestartwrite/sys/android_power/request_statewake
onrestartwrite/sys/power/stateon
onrestartrestartaudioserver
onrestartrestartcameraserver
onrestartrestartmedia
onrestartrestartnetd
writepid/dev/cpuset/foreground/tasks
servicezygote_secondary/system/bin/app_process32-Xzygote/system/bin--zygote--socket-name=zygote_secondary
classmain
socketzygote_secondarystream660rootsystem
onrestartrestartzygote
writepid/dev/cpuset/foreground/tasks
在Linux系统中,service通常是一种被称为守护进程(daemon)的程序。
它通常在系统启动时启动,并一直运行于后台,直到系统关闭时终止。
这里会以service方式来启动zygote进程,app_process的代码位于/frameworks/base/cmds/app_process/路径下,该路径下有一个文件app_main.cpp,入口是main函数。
接下来看app_main.cpp函数,这里实现从c++代码调到java代码:
intmain(intargc,char*constargv[])
{
.....
//android运行时环境
AppRuntimeruntime(argv[0],computeArgBlockSize(argc,argv));
//Processcommandlinearguments
//ignoreargv[0]
argc--;
argv++;
.....
if(zygote){
//启动java代码
runtime.start("com.android.internal.os.ZygoteInit",args,zygote);
}elseif(className){
runtime.start("com.android.internal.os.RuntimeInit",args,zygote);
}else{
fprintf(stderr,"Error:
noclassnameor--zygotesupplied.\n");
app_usage();
LOG_ALWAYS_FATAL("app_process:
noclassnameor--zygotesupplied.");
return10;
}
}
ZygoteInit.java代码:
/frameworks/base/core/Java/com/android/internal/os/ZygoteInit.java
publicstaticvoidmain(Stringargv[]){
.....
try{
.....
booleanstartSystemServer=false;
StringsocketName="zygote";
StringabiList=null;
for(inti=1;i if("start-system-server".equals(argv[i])){ startSystemServer=true; }elseif(argv[i].startsWith(ABI_LIST_ARG)){ abiList=argv[i].substring(ABI_LIST_ARG.length()); }elseif(argv[i].startsWith(SOCKET_NAME_ARG)){ socketName=argv[i].substring(SOCKET_NAME_ARG.length()); }else{ thrownewRuntimeException("Unknowncommandlineargument: "+argv[i]); } } ..... //预加载android依赖的文件 preload(); ..... if(startSystemServer){ //启动系统服务 startSystemServer(abiList,socketName); } ..... }catch(MethodAndArgsCallercaller){ caller.run(); }catch(Throwableex){ Log.e(TAG,"Zygotediedwithexception",ex); closeServerSocket(); throwex; } } 看这个类的main方法,最上面根据传入的参数判断是否将startSystemServer这个标记设为true,接着预加载android依赖的文件,最后根据上面设置的标记来判断是否能启动系统服务。 接着看ZygoteInit.java中main方法在最后调用startSystemServer方法具体内容 privatestaticbooleanstartSystemServer(StringabiList,StringsocketName) throwsMethodAndArgsCaller,RuntimeException{ ..... /*Hardcodedcommandlinetostartthesystemserver*/ Stringargs[]={ "--setuid=1000", "--setgid=1000", "--setgroups=1001,1002,1003,1004,1005,1006,1007,1008,1009,1010,1018,1021,1032,3001,3002,3003,3006,3007,3009,3010", "--capabilities="+capabilities+","+capabilities, "--nice-name=system_server", "--runtime-args", "com.android.server.SystemServer", }; ..... try{ parsedArgs=newZygoteConnection.Arguments(args); ZygoteConnection.applyDebuggerSystemProperty(parsedArgs); ZygoteConnection.applyInvokeWithSystemProperty(parsedArgs); //Zygote进程开始fork子进程,启动SystemServer /*Requesttoforkthesystemserverprocess*/ pid=Zygote.forkSystemServer( parsedArgs.uid,parsedArgs.gid, parsedArgs.gids, parsedArgs.debugFlags, null, parsedArgs.permittedCapabilities, parsedArgs.effectiveCapabilities); }catch(IllegalArgumentExceptionex){ thrownewRuntimeException(ex); } ..... } SystemServer.java代码 /frameworks/base/services/java/com/android/server/SystemServer.java /** *Themainentrypointfromzygote. */ publicstaticvoidmain(String[]args){ newSystemServer().run(); } privatevoidrun(){ ...... //Startservices. try{ Trace.traceBegin(Trace.TRACE_TAG_SYSTEM_SERVER,"StartServices"); startBootstrapServices(); //启动核心Service startCoreServices(); //启动其他Service startOtherServices(); }catch(Throwableex){ Slog.e("System","******************************************"); Slog.e("System","************Failurestartingsystemservices",ex); throwex; }finally{ Trace.traceEnd(Trace.TRACE_TAG_SYSTEM_SERVER); } //Loopforever. Looper.loop(); thrownewRuntimeException("Mainthreadloopunexpectedlyexited"); } 启动SystemServer.java的startOtherServices方法 /** *Startsamiscellaneousgrabbagofstuffthathasyettoberefactored *andorganized. */ privatevoidstartOtherServices(){ ..... //Wenowtelltheactivitymanageritisokaytorunthirdparty //code.Itwillcallbackintousonceithasgottentothestate //wherethirdpartycodecanreallyrun(butbeforeithasactually //startedlaunchingtheinitialapplications),forustocompleteour //initialization. mActivityManagerService.systemReady(newRunnable(){ @Override publicvoidrun(){ Slog.i(TAG,"Makingservicesready"); ..... } } ..... } ActivityManagerService.java中的mStackSupervisor.resumeFocusedStackTopActivityLocked() publicvoidsystemReady(finalRunnablegoingCallback){ ..... Slog.i(TAG,"Systemnowready"); EventLog.writeEvent(EventLogTags.BOOT_PROGRESS_AMS_READY, SystemClock.uptimeMillis()); ..... synchronized(this){ //Onlystartupencryption-awarepersistentapps;onceuseris //unlockedwe'llcomebackaroundandstartunawareapps startPersistentApps(PackageManager.MATCH_DIRECT_BOOT_AWARE); ..... //调用ActivityStackSupervisor中的resumeFocusedStackTopActivityLocked方法 mStackSupervisor.resumeFocusedStackTopActivityLocked(); mUserController.sendUserSwitchBroadcastsLocked(-1,currentUserId); } } ActivityStackSupervisor.java中的resumeFocusedStackTopActivityLocked方法 booleanresumeFocusedStackTopActivityLocked(){ returnresumeFocusedStackTopActivityLocked(null,null,null); } booleanresumeFocusedStackTopActivityLocked( ActivityStacktargetStack,ActivityRecordtarget,ActivityOptionstargetOptions){ if(targetStack! =ull&&isFocusedStack(targetStack)){ returntargetStack.resumeTopActivityUncheckedLocked(target,targetOptions); } finalActivityRecordr=mFocusedStack.topRunningActivityLocked(); if(r==null||r.state! =RESUMED){ //调用ActivityStack中的resumeTopActivityUncheckedLocked来保证栈中的顶层Activity被重新启动 mFocusedStack.resumeTopActivityUncheckedLocked(null,null); } returnfalse; } ActivityStack.java中的resumeTopActivityUncheckedLocked方法 booleanresumeTopActivityUncheckedLocked(ActivityRecordprev,ActivityOptionsoptions){ .... booleanresult=false; try{ //Protectagainstrecursion. mStackSupervisor.inResumeTopActivity=true; if(mService.mLockScreenShown==ActivityManagerService.LOCK_SCREEN_LEAVING){ mService.mLockScreenShown=ActivityManagerService.LOCK_SCREEN_HIDDEN; mService.updateSleepIfNeededLocked(); } result=resumeTopActivityInnerLocked(prev,options); }finally{ mStackSupervisor.inResumeTopActivity=false; } returnresult; } privatebooleanresumeTopActivityInnerLocked(ActivityRecordprev,ActivityOptionsoptions){ if(DEBUG_LOCKSCREEN)mService.logLockScreen(""); if(! mService.mBooting&&! mService.mBooted){ //Notreadyyet! returnfalse; } ..... if(next==null){ //Therearenomoreactivities! finalStringreason="noMoreActivities"; finalintreturnTaskType=prevTask==null||! prevTask.isOverHomeStack() ? HOME_ACTIVITY_TYPE: prevTask.getTaskToReturnTo(); if(! mFullscreen&&adjustFocusToNextFocusableStackLocked(returnTaskType,reason)){ //Trytomovefocustothenextvisiblestackwitharunningactivityifthis //stackisnotcoveringtheentirescreen. returnmStackSupervisor.resumeFocusedStackTopActivityLocked( mStackSupervisor.getFocusedStack(),prev,null); } //Let'sjuststartuptheL
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- android 开机 启动 流程 简单 分析
![提示](https://static.bdocx.com/images/bang_tan.gif)