美文网首页
Android -Launcher启动流程

Android -Launcher启动流程

作者: 没有了遇见 | 来源:发表于2024-02-17 10:11 被阅读0次

Activity 启动流程
final 变量不能被修改
final 方法不能被重写
final 类不能被继承

流程

ActivityManagerService --->
systemReady--->
startHomeActivityLocked(currentUserId, "systemReady");--->

startHomeActivity()--->ActivityStarter{execute(){startActivity()}---> startActivityUnchecked()---> resumeFocusedStackTopActivityLocked()}

---> ActivityStackSupervisor {{resumeTopActivityUncheckedLocked()}}

--->{ActivityStackSupervisor {
resumeTopActivityUncheckedLocked()--->
resumeTopActivityInnerLocked()--->
startSpecificActivityLocked()--->

}
}
---ActivityStackSupervisor{
startSpecificActivityLocked()-->
mService.startProcessLocked()-->

}

---> ActivityManagerService{
startProcessLocked()-->
startProcessLocked()-->
startProcessLocked()-->
startProcess(app.hostingType, entryPoint,
app, app.startUid, gids, runtimeFlags, mountExternal, app.seInfo,
requiredAbi, instructionSet, invokeWith, app.startTime);

-->
Process.start(entryPoint,
app.processName, uid, uid, gids, runtimeFlags, mountExternal,
app.info.targetSdkVersion, seInfo, requiredAbi, instructionSet,
app.info.dataDir, invokeWith,
new String[] {PROC_START_SEQ_IDENT + app.startSeq});
}
--> Process {start()}

-->ZygoteProcess{start{}---> startViaZygote{}---> openZygoteSocketIfNeeded{}--->{zygoteSendArgsAndGetResult()}}

zygoteSendArgsAndGetResult 向合子进程发送一个参数列表,合子进程启动一个新的子进程并返回子进程的pid。请注意:当前实现将参数列表中的换行符替换为空格。

ZygoteConnection

processOneCommand()

    pid = Zygote.forkAndSpecialize(parsedArgs.uid, parsedArgs.gid, parsedArgs.gids,
            parsedArgs.runtimeFlags, rlimits, parsedArgs.mountExternal, parsedArgs.seInfo,
            parsedArgs.niceName, fdsToClose, fdsToIgnore, parsedArgs.startChildZygote,
            parsedArgs.instructionSet, parsedArgs.appDataDir);

handleChildProc()

  if (parsedArgs.invokeWith != null) {
        WrapperInit.execApplication(parsedArgs.invokeWith,
                parsedArgs.niceName, parsedArgs.targetSdkVersion,
                VMRuntime.getCurrentInstructionSet(),
                pipeFd, parsedArgs.remainingArgs);

        // Should not get here.
        throw new IllegalStateException("WrapperInit.execApplication unexpectedly returned");
    } else {
        if (!isZygote) {
            return ZygoteInit.zygoteInit(parsedArgs.targetSdkVersion, parsedArgs.remainingArgs,
                    null /* classLoader */);
        } else {
            return ZygoteInit.childZygoteInit(parsedArgs.targetSdkVersion,
                    parsedArgs.remainingArgs, null /* classLoader */);
        }
    }

zygoteInit()

    RuntimeInit.redirectLogStreams();

    RuntimeInit.commonInit();
    ZygoteInit.nativeZygoteInit();
    return RuntimeInit.applicationInit(targetSdkVersion, argv, classLoader);        
    
    
    
    
    
    Activity 启动流程

final 变量不能被修改
final 方法不能被重写
final 类不能被继承

流程

ActivityManagerService --->
systemReady--->
startHomeActivityLocked(currentUserId, "systemReady");--->

startHomeActivity()--->ActivityStarter{execute(){startActivity()}---> startActivityUnchecked()---> resumeFocusedStackTopActivityLocked()}

---> ActivityStackSupervisor {{resumeTopActivityUncheckedLocked()}}

--->{ActivityStackSupervisor {
resumeTopActivityUncheckedLocked()--->
resumeTopActivityInnerLocked()--->
startSpecificActivityLocked()--->

}
}
---ActivityStackSupervisor{
startSpecificActivityLocked()-->
mService.startProcessLocked()-->

}

---> ActivityManagerService{
startProcessLocked()-->
startProcessLocked()-->
startProcessLocked()-->
startProcess(app.hostingType, entryPoint,
app, app.startUid, gids, runtimeFlags, mountExternal, app.seInfo,
requiredAbi, instructionSet, invokeWith, app.startTime);

-->
Process.start(entryPoint,
app.processName, uid, uid, gids, runtimeFlags, mountExternal,
app.info.targetSdkVersion, seInfo, requiredAbi, instructionSet,
app.info.dataDir, invokeWith,
new String[] {PROC_START_SEQ_IDENT + app.startSeq});
}
--> Process {start()}

-->ZygoteProcess{start{}---> startViaZygote{}---> openZygoteSocketIfNeeded{}--->{zygoteSendArgsAndGetResult()}}

zygoteSendArgsAndGetResult 向合子进程发送一个参数列表,合子进程启动一个新的子进程并返回子进程的pid。请注意:当前实现将参数列表中的换行符替换为空格。

ZygoteConnection

processOneCommand()

    pid = Zygote.forkAndSpecialize(parsedArgs.uid, parsedArgs.gid, parsedArgs.gids,
            parsedArgs.runtimeFlags, rlimits, parsedArgs.mountExternal, parsedArgs.seInfo,
            parsedArgs.niceName, fdsToClose, fdsToIgnore, parsedArgs.startChildZygote,
            parsedArgs.instructionSet, parsedArgs.appDataDir);

handleChildProc()

  if (parsedArgs.invokeWith != null) {
        WrapperInit.execApplication(parsedArgs.invokeWith,
                parsedArgs.niceName, parsedArgs.targetSdkVersion,
                VMRuntime.getCurrentInstructionSet(),
                pipeFd, parsedArgs.remainingArgs);

        // Should not get here.
        throw new IllegalStateException("WrapperInit.execApplication unexpectedly returned");
    } else {
        if (!isZygote) {
            return ZygoteInit.zygoteInit(parsedArgs.targetSdkVersion, parsedArgs.remainingArgs,
                    null /* classLoader */);
        } else {
            return ZygoteInit.childZygoteInit(parsedArgs.targetSdkVersion,
                    parsedArgs.remainingArgs, null /* classLoader */);
        }
    }

zygoteInit()

    RuntimeInit.redirectLogStreams();

    RuntimeInit.commonInit();
    ZygoteInit.nativeZygoteInit();
    return RuntimeInit.applicationInit(targetSdkVersion, argv, classLoader);        

相关文章

网友评论

      本文标题:Android -Launcher启动流程

      本文链接:https://www.haomeiwen.com/subject/txwuadtx.html