Android页面启动过程

以 Android 13(API 33)为例,源码网址可参照:http://xrefandroid.com/android-13.0.0_r83/ ,无墙有广告,比如很核心的 ActivityThread 类,对应地址:http://xrefandroid.com/android-13.0.0_r83/xref/frameworks/base/core/java/android/app/ActivityThread.java

1. 手机启动过程

1.1. 启动流程总览

电源键 → Boot ROM → Bootloader → Kernel → init → Zygote → SystemServer → Launcher

查看pid为1的进程:

emulator64_arm64:/ # ps -p 1 -o pid,ppid,user,%cpu,%mem,command,name                                                                                      
  PID  PPID USER         %CPU  %MEM COMMAND                     NAME                       
    1     0 root          0.0   0.5 /system/bin/init            init

查看ppid为1的zygote进程:

emulator64_arm64:/ # ps -P 1 -o pid,ppid,user,%cpu,%mem,command,name | grep  "zygote"                                                                     
  366     1 root          0.0   8.9 /system/bin/app_process64   zygote64

查看ppid为366的进程:
image
可见,init进程孵化出zygote进程,zygote进程孵化出system_server、launcher桌面、其他App等进程。

1.2. init进程

init是第一个用户进程,进程号:1

源码:system/core/rootdir/init.rc
import /system/etc/init/hw/init.${ro.zygote}.rc

在模拟器上可以看到这个文件(源码位置:system/core/rootdir/init.zygote64.rc):

手机目录:/system/etc/init/hw/init.zygote64.rc
service zygote /system/bin/app_process64 -Xzygote /system/bin --zygote --start-system-server
    class main
    priority -20
    user root
    group root readproc reserved_disk
    socket zygote stream 660 root system
    socket usap_pool_primary stream 660 root system
    onrestart exec_background - system system -- /system/bin/vdc volume abort_fuse
    onrestart write /sys/power/state on
    onrestart restart audioserver
    onrestart restart cameraserver
    onrestart restart media
    onrestart restart media.tuner
    onrestart restart netd
    onrestart restart wificond
    task_profiles ProcessCapacityHigh
    critical window=$æzygote.critical_window.minute:-offå target=zygote-fatal

会执行 /system/bin/app_process64 命令,有一堆参数。

1.3. Zygote进程

源码:frameworks/base/cmds/app_process/app_main.cpp
int main(int argc, char* const argv[])
{
    ...
    AppRuntime runtime(argv[0], computeArgBlockSize(argc, argv));  // Android 5 开始,Android Runtime替代了Dalvik虚拟机
    ...
    if (zygote) {
        runtime.start("com.android.internal.os.ZygoteInit", args, zygote);  // 启动虚拟机,反射执行 ZygoteInit
    } else if (className) {
        runtime.start("com.android.internal.os.RuntimeInit", args, zygote);  // 没有 --zygote 参数走这里,比如:adb shell am start ...
    } else {
        ...
    }
}

执行 runtime.start(...),源码:frameworks/base/core/jni/AndroidRuntime.cpp

void AndroidRuntime::start(const char* className, const Vector<String8>& options, bool zygote)
{
    if (startVm(&mJavaVM, &env, zygote) != 0) {  // 启动虚拟机
        return;
    }
    onVmCreated(env);
    ...
    char* slashClassName = toSlashClassName(className);
    jclass startClass = env->FindClass(slashClassName);
    if (startClass == NULL) {
        ...
    } else {
        jmethodID startMeth = env->GetStaticMethodID(startClass, "main", "([Ljava/lang/String;)V");
        if (startMeth == NULL) {
            ...
        else {
            env->CallStaticVoidMethod(startClass, startMeth, strArray);  //  反射调用Java类的 main() 方法。
        }
        ...
    }
   ...
}

反射执行 ZygoteInit.main(),源码:frameworks/base/core/java/com/android/internal/os/ZygoteInit.java

public static void main(String[] argv) {
    ZygoteServer zygoteServer = null;
    ...
    Runnable caller;
    try {
        ....
        String zygoteSocketName = "zygote";
        ....
        zygoteServer = new ZygoteServer(isPrimaryZygote);
        ....
        if (startSystemServer) {
            Runnable r = forkSystemServer(abiList, zygoteSocketName, zygoteServer);
            ...
            // {@code r == null} in the parent (zygote) process, and {@code r != null} in the
            // child (system_server) process.
            if (r != null) {  // 此处很关键,看注释,fork子进程后,两个进程的逻辑会分叉,zygote进程r==null会走到后面的loop循环,system_server子进程 r!=null,run()后直接return了。
                r.run();
                return;
            }
        }
        ...
        caller = zygoteServer.runSelectLoop(abiList);  // zygote进程进入等待loop,直到新建App子进程
    } catch (Throwable ex) {
        Log.e(TAG, "System zygote died with fatal exception", ex);
        throw ex;
    } finally {
        if (zygoteServer != null) {
            zygoteServer.closeServerSocket();
        }
    }
    
    // We're in the child process and have exited the select loop. Proceed to execute the
    // command.
    if (caller != null)  // 新建的App子进程走这里
        caller.run();
    }
}

这里有个很精巧的设计:fork子进程后,并未直接执行,而是返回一个Runnable再执行,这样从父进程继承下来的调用栈就会被清空,节省内存。

ZygoteServer.java

ZygoteServer(boolean isPrimaryZygote) {
    ...
    mUsapPoolSocket = Zygote.createManagedSocketFromInitSocket(Zygote.USAP_POOL_PRIMARY_SOCKET_NAME);
    ...
}

Zygote.java

static LocalServerSocket createManagedSocketFromInitSocket(String socketName) {
    ...
    return new LocalServerSocket(fd);
}

LocalServerSocket.java

public LocalServerSocket(FileDescriptor fd) throws IOException {
    impl = new LocalSocketImpl(fd);
    impl.listen(LISTEN_BACKLOG);  // 本地socket连接队列数上限50个
    localAddress = impl.getSockAddress();
}

1.4. 启动SystemServer

ZygoteInit.forkSystemServer()
  ->Zygote.forkSystemServer()
    ->Zygote.nativeForkSystemServer()
  ->ZygoteInit.handleSystemServerProcess()
    ->ZygoteInit.zygoteInit()
      ->RuntimeInit.applicationInit()
        ->RuntimeInit.findStaticMain()
          ->m = cl.getMethod("main", new Class[] { String[].class });
          ->return new MethodAndArgsCaller(m, argv);  // 这是个Runnable,会执行run(),最后执行"com.android.server.SystemServer.main()"

1.5. 启动Launcher

源码:frameworks/base/services/java/com/android/server/SystemServer.java

    public static void main(String[] args) {
        new SystemServer().run();
    }

    private void run() {
        
        // Start services.
        try {
            ...
            startBootstrapServices(t);  // 引导服务:ActivityManagerService、PackageManagerService、PowerManagerService等
            startCoreServices(t);  // 核心服务:DisplayManagerService、InputManagerService、WindowManagerService等
            startOtherServices(t);  // 其他服务
            startApexServices(t);
        } catch (Throwable ex) {
            ...
        } finally {
            t.traceEnd(); // StartServices
        }


        // Loop forever.
        Looper.loop();

    }

    private void startOtherServices(@NonNull TimingsTraceAndSlog t) {
        ...
        mActivityManagerService.systemReady( () -> {...}  // 后面会启动桌面
    }

源码:frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java

    public void systemReady(final Runnable goingCallback, @NonNull TimingsTraceAndSlog t) {
        ...
        mAtmInternal.startHomeOnAllDisplays(currentUserId, "systemReady");
        ...
    }

源码:frameworks/base/services/core/java/com/android/server/wm/ActivityTaskManagerService.java

public class ActivityTaskManagerService extends IActivityTaskManager.Stub {
    ...
    final class LocalService extends ActivityTaskManagerInternal {
        ...
        public boolean startHomeOnAllDisplays(int userId, String reason) {
            synchronized (mGlobalLock) {
                return mRootWindowContainer.startHomeOnAllDisplays(userId, reason);
            }
        }
        ...
    }
    ...
}

源码:frameworks/base/services/core/java/com/android/server/wm/RootWindowContainer.java

startHomeOnAllDisplays()
  ->startHomeOnDisplay()
    ->startHomeOnTaskDisplayArea()
      ->mService.getActivityStartController().startHomeActivity(homeIntent, aInfo, myReason, taskDisplayArea)

源码:frameworks/base/services/core/java/com/android/server/wm/ActivityStartController.java

void startHomeActivity(Intent intent, ActivityInfo aInfo, String reason,
            TaskDisplayArea taskDisplayArea) {
        ...
        mLastHomeActivityStartResult = obtainStarter(intent, "startHomeActivity: " + reason)
                .setOutActivity(tmpOutRecord)
                .setCallingUid(0)
                .setActivityInfo(aInfo)
                .setActivityOptions(options.toBundle())
                .execute();  // 到启动App的流程了
        ...
}

2. 页面启动过程

2.1. 启动页面

源码:frameworks/base/core/java/android/app/Activity.java

startActivity()
  ->startActivityForResult()
    ->mInstrumentation.execStartActivity()

源码:frameworks/base/core/java/android/app/Instrumentation.java

execStartActivity()
  ->ActivityTaskManager.getService().startActivity()

2.2. 切到system_server进程调度

ActivityTaskManager.getService()会通过Binder机制,拿到ActivityTaskManagerService, 切到system_server进程

源码:frameworks/base/services/core/java/com/android/server/wm/ActivityTaskManagerService.java

startActivity()
  ->startActivityAsUser()
    ->return getActivityStartController().obtainStarter(intent, "startActivityAsUser")
                .setCaller(caller)
                .setCallingPackage(callingPackage)
                .setCallingFeatureId(callingFeatureId)
                .setResolvedType(resolvedType)
                .setResultTo(resultTo)
                .setResultWho(resultWho)
                .setRequestCode(requestCode)
                .setStartFlags(startFlags)
                .setProfilerInfo(profilerInfo)
                .setActivityOptions(bOptions)
                .setUserId(userId)
                .execute();

走到之前启动桌面的代码了。

2.3. 启动Activity

源码:frameworks/base/services/core/java/com/android/server/wm/ActivityStarter.java

execute()
  ->executeRequest(mRequest)
    ->startActivityUnchecked()
      ->startActivityInner()
        ->mTargetRootTask.startActivityLocked()
        ->mRootWindowContainer.resumeFocusedTasksTopActivities()

源码:frameworks/base/services/core/java/com/android/server/wm/RootWindowContainer.java

RootWindowContainer.resumeFocusedTasksTopActivities()
  → Task.resumeTopActivityUncheckedLocked()
    → Task.resumeTopActivityInnerLocked()
      → TaskFragment.resumeTopActivity()
        → mTaskSupervisor.startSpecificActivity()

源码:frameworks/base/services/core/java/com/android/server/wm/ActivityTaskSupervisor.java

mTaskSupervisor.startSpecificActivity(next, true, true)   (ActivityTaskSupervisor.java:1034)
  ├─ 进程已存活 → realStartActivityLocked(r, wpc, ...)    (763)
  └─ 进程不存在 → mService.startProcessAsync(r, ..., HOSTING_TYPE_TOP_ACTIVITY)  (1060)
        → AMS / ProcessList.startProcessLocked → Process.start()
        → ZygoteProcess 连 zygote socket → forkAndSpecialize → ActivityThread.main

进程起来后,attachApplication

ActivityManager.attachApplication(Binder)
  → AMS.attachApplication → mAtmInternal.attachApplication(wpc)   (ATMS LocalService, ActivityTaskManagerService.java:6073)
    → RootWindowContainer.attachApplication(app)                  (1831)
      → 重新走 ActivityTaskSupervisor.realStartActivityLocked()   (763)
          startFreezingScreenLocked / r.setProcess(proc) / setVisibility(true)
          构造 ClientTransaction:
            addCallback(LaunchActivityItem.obtain(...))           (902)  // 后面会执行
            setLifecycleStateRequest(ResumeActivityItem)          (917)  // 后面会执行
            → ClientLifecycleManager.scheduleTransaction          (924)

回调到(ActivityThread.ApplicationThread), 切回App进程,源码:frameworks/base/core/java/android/app/ActivityThread.java

public final class ActivityThread {
    ....
    private class ApplicationThread extends IApplicationThread.Stub {
        ...
        public void scheduleTransaction(ClientTransaction transaction) throws RemoteException {
            ActivityThread.this.scheduleTransaction(transaction);  // 这块挺关键的,system_server进程通过IBinder回调ApplicationThread,再通过sendMessage(ActivityThread.H.EXECUTE_TRANSACTION, transaction)回调到ActivityThread (App进程)
        }
        ...
    }
    ...
}

2.4. 后续流程

Activity生命周期回调

2.5. 关键代码调用

【客户端侧】
  ContextImpl.startActivity()
    → Instrumentation.execStartActivity()
    → ActivityManager.getService().startActivity()    [Binder → AMS]

【AMS / system_server 侧】
  ActivityTaskManagerService.startActivity()
    → ActivityStarter.execute() / startActivityMayWait()
    → 解析 Intent / 创建 TaskRecord / 确认进程
    → 进程不存在:Process.start(entryPoint="android.app.ActivityThread")
    → attachApplicationLocked()

【新 App 进程侧】
  ActivityThread.main()
    → Looper.prepareMainLooper()
    → ActivityThread.attach()
      → mgr.attachApplication(mAppThread)                 [Binder → AMS]
  AMS 回调:
    → app.thread.bindApplication(...)                  [AMS → App]
      → ActivityThread.handleBindApplication()
        → LoadedApk.makeApplication()
        → installContentProviders()   (Provider 先于 Application)
        → mInstrumentation.callApplicationOnCreate()
    → app.thread.scheduleLaunchActivity(...)           [AMS → App]
      → ActivityThread.handleLaunchActivity()
        → performLaunchActivity()
          → Activity.attach()
          → activity.performCreate() → onCreate()
        → handleStartActivity() → onStart()
        → handleResumeActivity() → onResume()
posted @ 2026-09-21 18:36  球哥v5  阅读(8)  评论(0)    收藏  举报