日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

zygoteinit.java_源码跟踪之启动流程:从ZygoteInit到onCreate

發布時間:2025/3/12 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。