zygoteinit.java_源码跟踪之启动流程:从ZygoteInit到onCreate
Instrumentation
SDK版本名稱: Pie
API Level: 28
一、源碼調用時序圖
1. Activity的啟動流程
說明:其中ActivityThread中執行的scheduleTransaction方法在其父類ClientTransactionHandler中,發送了ActivityThread.H.EXECUTE_TRANSACTION,ActivityThread接收后執行了LaunchActivityItem#execute()
Activity的啟動流程.jpg
2.ActivityManagerService的啟動流程
說明:其中RunnableInit通過類名反射了main方法,封裝成Runnable返回,最終在ZygoteInit#main中執行run()。
ActivityManagerService的啟動流程.jpg
3.ActivityThread的啟動流程
說明:圖中省略了ZygoteConnection獲取MethodAndArgsCaller的步驟,其步驟可參加ActivityManagerService的啟動流程,也是經過WrapperInit拿到的。
ActivityThread的啟動流程 .jpg
二、流程總結
ZygoteInit#main方法中啟動一個SystemServer和一個ZygoteServer。
SystemServer中通過SystemServiceManager執行onStart()的方式啟動了ActivityManagerService,使用ServiceManager對其進行持久化管理。
ZygoteServer中啟動了一個名為“zygote”的LocalSocket類型的socket服務。使用死循環去處理socket鏈接。
應用沒有啟動時,從Launcher進入應用,Activity中的startActivity()方法最終調用了ActivityManagerService#startProcessLocked。
這個方法中將ActivityThread的類名參數通過socket鏈接到ZygoteInit中啟動的ZygoteServer。
ZygoteServer死循環中得到參數后,通過ZygoteConnection#processOneCommand返回一個MethodAndArgsCaller類型的Runnable,在ZygoteInit#main中執行。
(26版本會在ZygoteInit#main方法中捕獲MethodAndArgsCaller類型的異常,然后捕獲執行。兩種寫法的目的都是為了清除方法調用的堆棧信息)
ActivityThread#main方法中調用其attach方法,將創建好的ApplicationThread傳給ActivityManagerService#,AMS保留參數給ProcessRecord后續使用。
應用已經啟動時,Activity中的startActivity()方法調用了ActivityManagerService#startActivityAsUser,執行ActivityStarter#execute
這個方法最終調用ActivityStackSupervisor#realStartActivityLocked,以ActivityThread.mAppThread為參數創建LaunchActivityItem。然后執行AcitivityThread#scheduleTransaction方法,發送ActivityThread.H.EXECUTE_TRANSACTION。
ActivityThread接收到消息后執行LaunchActivityItem#execute,調用ActivityThread#handleLaunchActivity,最終調用ActivityThread#performLaunchActivity。
performLaunchActivity()方法通過Instrumentation#newActivity得到要啟動的Activity,然后調用其attach()方法。
而后,會調用Instrumentation#callActivityOnCreate,最終調用到Activity#onCreate
三、相關文章:
四、流程記錄
代碼跟蹤記錄,只保留了關鍵代碼,其余代碼用...替代。
java類名可點擊,將跳轉到Android社區的sdk源代碼文件。
跟蹤記錄的意義在于,在需要研究流程中某個環節細節問題時,可以快速定位。
private Instrumentation mInstrumentation;
public void startActivity(...) {
...
startActivityForResult(...);
...
}
public void startActivityForResult(...) {
...
mInstrumentation.execStartActivity(...);
...
}
final void performCreate(...) {
...
onCreate(...);
...
}
public ActivityResult execStartActivity(...) {
...
int result = ActivityManager.getService().startActivity(...)
...
}
public void callActivityOnCreate(...) {
...
activity.performCreate(...);
...
}
private static final Singleton IActivityManagerSingleton = () -> {
final IBinder b = ServiceManager.getService(Context.ACTIVITY_SERVICE);
...
return am;
};
public static IActivityManager getService() {
return IActivityManagerSingleton.get();
}
public static IBinder getService(String name) {
...
IBinder service = sCache.get(name);
...
}
public static void initServiceCache(Map cache) {
...
sCache.putAll(cache);
}
ActivityStartController(ActivityManagerService service) {
this(...,new DefaultFactory(..)));
}
@VisibleForTesting
ActivityStartController(...,Factory factory) {
...
mFactory = factory;
...
}
ActivityStarter obtainStarter(...) {
return mFactory.obtain().setIntent(intent).setReason(reason);
}
private ActivityStack mTargetStack;
static class DefaultFactory implements Factory {
...
public ActivityStarter obtain() {
...
return starter;
}
...
}
int execute() {
...
if (mRequest.mayWait) {
return startActivityMayWait(...);
} else {
return startActivity(...);
}
...
}
private int startActivityMayWait(...){
...
int res = startActivity(...);
...
}
private int startActivity(...){
...
result = startActivityUnchecked(...)
...
}
private int startActivityUnchecked(...){
...
mTargetStack.startActivityLocked(...);
...
}
protected final ActivityStackSupervisor mStackSupervisor;
void startActivityLocked(...){
...
ensureActivitiesVisibleLocked(...);
...
}
final void ensureActivitiesVisibleLocked(...){
...
if (makeVisibleAndRestartIfNeeded(...)){
...
}
...
}
private boolean makeVisibleAndRestartIfNeeded(...){
...
mStackSupervisor.startSpecificActivityLocked(...);
...
}
final ActivityManagerService mService;
void startSpecificActivityLocked(...){
...
realStartActivityLocked(...);
...
mService.startProcessLocked(...);
...
}
final boolean realStartActivityLocked(...){
...
clientTransaction = ClientTransaction.obtain(app.thread,...);
clientTransaction.addCallback(LaunchActivityItem.obtain(...));
...
mService.getLifecycleManager().scheduleTransaction(clientTransaction);
...
}
void scheduleTransaction(...){
...
transaction.schedule();
...
}
private List mActivityCallbacks;
private IApplicationThread mClient;
public void addCallback(...) {
...
mActivityCallbacks.add(activityCallback);
}
public void schedule() throws RemoteException {
mClient.scheduleTransaction(this);
}
public static ClientTransaction obtain(IApplicationThread client, ...) {
...
instance.mClient = client;
...
return instance;
}
public static void main(String argv[]) {
...
Runnable r = forkSystemServer(...);
...
r.run();
...
caller = zygoteServer.runSelectLoop(abiList);
...
caller.run();
}
private static Runnable forkSystemServer(...) {
String args[] = {
...
"com.android.server.SystemServer",
};
parsedArgs = new ZygoteConnection.Arguments(args);
...
pid = Zygote.forkSystemServer(...);
...
return handleSystemServerProcess(parsedArgs);
}
private static Runnable handleSystemServerProcess(...){
...
WrapperInit.execApplication(...);
...
}
public static final Runnable zygoteInit(...) {
...
return RuntimeInit.applicationInit(...);
}
static final Runnable childZygoteInit(...) {
...
return RuntimeInit.findStaticMain(...);
}
@Override
public static void execApplication(...) {
...
command.append(" '--nice-name=").append(niceName).append("'");
...
Zygote.execShell(command.toString());
}
public static int forkSystemServer(...) {
VM_HOOKS.preFork();
int pid = nativeForkSystemServer(...);
...
VM_HOOKS.postForkCommon();
return pid;
}
public static void execShell(String command) {
String[] args = { "/system/bin/sh", "-c", command };
...
Os.execv(args[0], args);
...
}
public static void main(String[] args) {
new SystemServer().run();
}
private void run() {
...
mSystemServiceManager = new SystemServiceManager(mSystemContext);
...
startBootstrapServices();
...
startOtherServices();
...
}
private void startBootstrapServices() {
...
mActivityManagerService = mSystemServiceManager.startService(...)...;
...
mPackageManagerService = PackageManagerService.main(...);
...
}
private void startOtherServices() {
...
wm = WindowManagerService.main(...);
...
mActivityManagerService.setWindowManager(wm);
...
mActivityManagerService.systemReady(...);
...
}
public void startService(...) {
...
service.onStart();
...
}
public static final String ZYGOTE_SOCKET = "zygote";
public static final ZygoteProcess zygoteProcess =
new ZygoteProcess(ZYGOTE_SOCKET, SECONDARY_ZYGOTE_SOCKET);
public static final ProcessStartResult start(...) {
...
return zygoteProcess.start(...);
}
public final Process.ProcessStartResult start(...) {
...
return startViaZygote(...);
...
}
private Process.ProcessStartResult startViaZygote(...){
...
zygoteSendArgsAndGetResult(openZygoteSocketIfNeeded(abi),...);
...
}
private ZygoteState openZygoteSocketIfNeeded(...){
...
... = ZygoteState.connect(mSocket);
...
}
public static class ZygoteState {
...
public static ZygoteState connect(LocalSocketAddress address) ... {
...
zygoteSocket.connect(address);
...
}
}
Runnable processOneCommand(ZygoteServer zygoteServer) {
...
return handleChildProc(...);
...
}
private Runnable handleChildProc(...) {
...
if (...) {
WrapperInit.execApplication(...);
throw new IllegalStateException(...);
} else {
if (!isZygote) {
return ZygoteInit.zygoteInit(...);
} else {
return ZygoteInit.childZygoteInit(...);
}
}
...
}
protected static Runnable applicationInit(...) {
...
return findStaticMain(...);
}
protected static Runnable findStaticMain(...) {
return new MethodAndArgsCaller(...);
}
static class MethodAndArgsCaller implements Runnable {
...
public void run() {
...
mMethod.invoke(null, new Object[] { mArgs });
...
}
...
}
Runnable runSelectLoop(String abiList) {
...
ZygoteConnection connection = peers.get(i);
final Runnable command = connection.processOneCommand(this);
...
}
public final int startActivity(...) {
return startActivityAsUser(...);
}
public final int startActivityAsUser(...) {
return mActivityStartController.obtainStarter(...)
....
.execute();
}
private final boolean startProcessLocked(...) {
...
final String entryPoint = "android.app.ActivityThread";
...
return startProcessLocked(..., entryPoint, ...);
}
private boolean startProcessLocked(..., String entryPoint,...){
...
final ProcessStartResult startResult = startProcess(...);
...
}
private ProcessStartResult startProcess(...) {
...
startResult = Process.start(entryPoint,...);
...
}
public final void bindApplication(...){
...
ServiceManager.initServiceCache(services);
...
}
private Activity performLaunchActivity(...) {
...
mInstrumentation.callActivityOnCreate(...);
...
}
public Activity handleLaunchActivity(...){
...
final Activity a = performLaunchActivity(...);
...
}
總結
以上是生活随笔為你收集整理的zygoteinit.java_源码跟踪之启动流程:从ZygoteInit到onCreate的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 最大01子矩阵
- 下一篇: 形参和实参是什么?? shim和pol