android开机启动流程简单分析.docx

上传人:b****5 文档编号:29856169 上传时间:2023-07-27 格式:DOCX 页数:15 大小:231.46KB
下载 相关 举报
android开机启动流程简单分析.docx_第1页
第1页 / 共15页
android开机启动流程简单分析.docx_第2页
第2页 / 共15页
android开机启动流程简单分析.docx_第3页
第3页 / 共15页
android开机启动流程简单分析.docx_第4页
第4页 / 共15页
android开机启动流程简单分析.docx_第5页
第5页 / 共15页
点击查看更多>>
下载资源
资源描述

android开机启动流程简单分析.docx

《android开机启动流程简单分析.docx》由会员分享,可在线阅读,更多相关《android开机启动流程简单分析.docx(15页珍藏版)》请在冰豆网上搜索。

android开机启动流程简单分析.docx

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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 农林牧渔 > 林学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1