Android应用程序启动源码分析

文章目录

  • Android应用程序启动源码分析
  • 一、启动流程
  • 二、Launcher通知AndroidOS(用户点击图标)
    • 2.1 Activity.java
    • 2.2 Instrumentation.java
    • 2.3 ActivityTaskManagerService.java
    • 2.4 ActivityStarter.java
    • 2.5 RootWindowContainer.java
      • 2.5.1 Task.java
      • 2.5.2 TaskFragment.java
    • 2.6 再次回到ActivityTaskManagerService.java
    • 2.7 ActivityManagerService.java
      • 2.7.1 ProcessList.java
    • 2.8 ZygoteProcess.java
  • 三、Activity进程创建(Zygote进程fork)
    • 3.1 Zygote简介
    • 3.2 ZygoteInit.java
    • 3.3 ZygoteServer.java
    • 3.4 ZygoteConnection.java
    • 3.5 再次回到ZygoteInit.java
    • 3.6 RuntimeInit.java
  • 四、初始化Application实例
    • 4.1 ActivityThread.java
    • 4.2 ActivityManagerService.java
    • 4.3 再次回到ActivityThread.java
    • 4.4 LoadedApk.java
    • 4.5 Instrumentation.java
  • 五、启动第一个Activity
    • 5.1 ActivityManagerService.java
    • 5.2 ActivityTaskManagerService.java
    • 5.3 RootWindowContainer.java
      • 5.3.1 Task.java
    • 5.4 ActivityTaskSupervisor.java
      • 5.4.1 ClientLifecycleManager.java
      • 5.4.2 ClientTransaction.java
    • 5.5 回到ActivityThread.java
      • 5.5.1 ClientTransactionHandler.java
      • 5.5.2 ActivityThread的内部Handler类H处理消息
      • 5.5.3 TransactionExecutor.java
      • 5.5.4 LaunchActivityItem.java
      • 5.6 回到ActivityThread
      • 5.6.1 Instrumentation.java
      • 5.6.2 回到ActivityThread的performLaunchActivity方法
      • 5.6.3 Instrumentation的callActivityOnCreate方法
    • 5.7 Activity.java
      • 5.7.1 onCreate方法
      • 5.7.2 onStart方法
        • 5.7.2.1 TransactionExecutor.java
        • 5.7.2.2 ActivityResultItem.java
        • 5.7.2.3 ActivityThread的handleResumeActivity方法
        • 5.7.2.4 Activity的performStart方法
        • 5.7.2.5 Instrumentation的callActivityOnStart方法
      • 5.7.3 onResume方法
        • 5.7.3.1 Activity的performResume方法
        • 5.7.3.2 Instrumentation的callActivityOnResume方法
  • 六、 后续工作

Android应用程序启动源码分析

在Android桌面(Launcher)源码分析中介绍了Android的桌面程序Launcher是如何响应用户点击事件并启动App的,这篇文章继续介绍App在Android系统层的启动流程。

一、启动流程

在这里插入图片描述

二、Launcher通知AndroidOS(用户点击图标)

2.1 Activity.java

frameworks/base/core/java/android/app/Activity.java 源码地址

  • Android桌面Launcher源码分析中提到Launcher最终通过frameworks/base/core/java/android/app/Activity.java中的startActivity方法启动了对应的应用程序。
  • startActivity方法是通过调用startActivityForResult方法来实现的。
  • startActivityForResult方法最终调用了/frameworks/base/core/java/android/app/Instrumentation.javaexecStartActivity方法
public class Activity {@Overridepublic void startActivity(Intent intent) {this.startActivity(intent, null);}@Overridepublic void startActivity(Intent intent, @Nullable Bundle options) {if (options != null) {startActivityForResult(intent, -1, options);} else {startActivityForResult(intent, -1);}}@Overridepublic void startActivityForResult(...) {if (mParent == null) {options = transferSpringboardActivityOptions(options);// 调用Instrumentation的execStartActivity方法Instrumentation.ActivityResult ar =mInstrumentation.execStartActivity(...);}}}

2.2 Instrumentation.java

frameworks/base/core/java/android/app/Instrumentation.java 源码地址

  • Instrumentation.java中的execStartActivity方法是Activity启动流程的关键。
  • execStartActivity方法通过ActivityTaskManager.getService().startActivity方法与系统服务进行通信.
// Instrumentation中有多个execStartActivity同名方法,注意是target的类型为Activity的方法
public ActivityResult execStartActivity(Context who, IBinder contextThread, IBinder token, Activity target,Intent intent, int requestCode, Bundle options) {// ActivityTaskManager.getService()获取到ActivityTaskManagerService的实例对象// 调用ActivityTaskManagerService.startActivityint result = ActivityTaskManager.getService().startActivity(...);
}

2.3 ActivityTaskManagerService.java

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

  • ActivityTaskManagerService是一个系统服务,负责管理Activity的启动。
  • startActivity方法调用了startActivityAsUser方法
  • startActivityAsUser方法通过ActivityStartControllerobtainStarter方法获取了ActivityStarter对象实例,并调用ActivityStarterexecute方法
public final int startActivity(...) {// 调用startActivityAsUser方法return startActivityAsUser(...);
}public final int startActivityAsUser(...) {// ActivityStartController的obtainStarter获取了ActivityStarter对象return getActivityStartController().obtainStarter(intent, "startActivityAsUser")... // 构造参数.execute();
}

2.4 ActivityStarter.java

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

  • ActivityStarter中最终会调用RootWindowContainerresumeFocusedTasksTopActivities方法
int execute() {// 调用executeRequest方法res = executeRequest(mRequest);
}private int executeRequest(Request request) {// 创建ActivityRecord对象final ActivityRecord r = new ActivityRecord.Builder(mService).setCaller(callerApp)... // 构造参数.build();// 调用startActivityUnchecked方法mLastStartActivityResult = startActivityUnchecked(...);
}private int startActivityUnchecked(...) {// 调用startActivityInnerresult = startActivityInner(...);
}int startActivityInner(...) {// 调用RootWindowContainer的resumeFocusedTasksTopActivities方法mRootWindowContainer.resumeFocusedTasksTopActivities(...);
}

2.5 RootWindowContainer.java

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

  • RootWindowContainer是WindowManagerService的主要组成部分之一,是一个管理窗口的容器。
  • 调用TaskTaskFragment将前台程序Pause,为新的应用程序启动做准备。
  • resumeFocusedTasksTopActivities中调用TaskresumeTopActivityUncheckedLocked方法。
 
private boolean resumeFocusedTasksTopActivities(...) {// 调用Task的resumeTopActivityUncheckedLocked方法result = targetRootTask.resumeTopActivityUncheckedLocked(...);
}

2.5.1 Task.java

/frameworks/base/services/core/java/com/android/server/wm/Task.java 源码地址

  • Task最终调用TaskFragmentresumeTopActivity方法
@GuardedBy("mService")
boolean resumeTopActivityUncheckedLocked(...) {// 调用resumeTopActivityInnerLockedsomeActivityResumed = resumeTopActivityInnerLocked(...);
}@GuardedBy("mService")
private boolean resumeTopActivityInnerLocked(...) {final TaskFragment topFragment = topActivity.getTaskFragment();// 调用TaskFragment的resumeTopActivityresumed[0] = topFragment.resumeTopActivity(...););return resumed[0];
}

2.5.2 TaskFragment.java

/frameworks/base/services/core/java/com/android/server/wm/TaskFragment.java 源码地址

  • TaskFragment最终调用ActivityTaskManagerServicestartProcessAsync方法
final boolean resumeTopActivity(...) {// 暂停当前窗口的Aciticity,可参见源码...// 调用ActivityTaskManagerService的startProcessAsync方法创建新的Activity
ActivityTaskManagerService的startProcessAsync方法mAtmService.startProcessAsync(...);
}

2.6 再次回到ActivityTaskManagerService.java

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

  • 处理完窗口容器数据以后(核心工作是将前台程序Pause),再次回到了ActivityTaskManagerService
  • startProcessAsync方法发送异步消息,调用ActivityManagerInternalstartProcess方法
  • ActivityManagerInternal的实现类是ActivityManagerService
// mAmInternal的获取方法,注册方法在ActivityManagerService中(下一小节2.8做介绍)
mAmInternal = LocalServices.getService(ActivityManagerInternal.class);void startProcessAsync(...) {// PooledLambda会自动调用mAmInternal(ActivityManagerInternal)的startProcess方法final Message m = PooledLambda.obtainMessage(ActivityManagerInternal::startProcess, mAmInternal, ...);mH.sendMessage(m);
}
  • ActivityManagerInternal是一个抽象类,具体实现在ActivityManagerService.java中实现

2.7 ActivityManagerService.java

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

  • ActivityManagerService最终调用ProcessListstartProcessLocked方法
public class ActivityManagerService extends IActivityManager.Stub {// 初始化LocalService(ActivityManagerInternal)private final ActivityManagerInternal mInternal = new LocalService();public void init() {// 在LocalServices中进行注册LocalServices.addService(ActivityManagerInternal.class, mInternal);}private class LocalService extends ActivityManagerInternal {// ActivityManagerInternal 接口方法的具体实现@Overridepublic void startProcess(...) {synchronized (ActivityManagerService.this) {// 调用ActivityManagerService的startProcessLocked方法startProcessLocked(...)}}}@GuardedBy("this")final ProcessRecord startProcessLocked(...) {// 调用ProcessList的startProcessLockedreturn mProcessList.startProcessLocked(...);}
}

2.7.1 ProcessList.java

/frameworks/base/services/core/java/com/android/server/am/ProcessList.java 源码地址

  • ProcessList最终调用到ZygoteProcessstart方法
@GuardedBy("mService")
boolean startProcessLocked(ProcessRecord app, ...) {// 定义创建Activity完成后回调的入口点(重要)final String entryPoint = "android.app.ActivityThread";return startProcessLocked(hostingRecord, ...);
}@GuardedBy("mService")
boolean startProcessLocked(HostingRecord hostingRecord, ...) {// 调用startProcessfinal Process.ProcessStartResult startResult = startProcess(...);
}private Process.ProcessStartResult startProcess(...) {// 获取AppZygotefinal AppZygote appZygote = createAppZygoteForProcessIfNeeded(app);// appZygote.getProcess()获取到ChildZygoteProcess类(ZygoteProcess的子类)// 调用ZygoteProcess的start方法startResult = appZygote.getProcess().start(entryPoint,...);
}

2.8 ZygoteProcess.java

/frameworks/base/core/java/android/os/ZygoteProcess.java 源码地址

  • ZygoteProcess发送消息给Zygote进程,通过Zygote进程创建新的activity进程
public final Process.ProcessStartResult start(...) {// 调用startViaZygotereturn startViaZygote(...)
}private Process.ProcessStartResult startViaZygote(...) {// 通过openZygoteSocketIfNeeded(abi)打开一个到Zygote进程的套接字连接(Socket)。// 调用zygoteSendArgsAndGetResultreturn zygoteSendArgsAndGetResult(openZygoteSocketIfNeeded(abi),zygotePolicyFlags,argsForZygote);
}@GuardedBy("mLock")
private Process.ProcessStartResult zygoteSendArgsAndGetResult(...) {// 调用attemptZygoteSendArgsAndGetResultreturn attemptZygoteSendArgsAndGetResult(...);
}private Process.ProcessStartResult attemptZygoteSendArgsAndGetResult(...) {try {// 创建Zygote套接字的输入输出流final BufferedWriter zygoteWriter = zygoteState.mZygoteOutputWriter;final DataInputStream zygoteInputStream = zygoteState.mZygoteInputStream;// 发送消息给 Zygote 进程zygoteWriter.write(msgStr);zygoteWriter.flush();// 读取 Zygote 进程返回的结果Process.ProcessStartResult result = new Process.ProcessStartResult();result.pid = zygoteInputStream.readInt();result.usingWrapper = zygoteInputStream.readBoolean();// 检查 PID 是否有效if (result.pid < 0) {throw new ZygoteStartFailedEx("fork() failed");}return result;} catch (IOException ex) {zygoteState.close();Log.e(LOG_TAG, "IO Exception while communicating with Zygote - "+ ex.toString());throw new ZygoteStartFailedEx(ex);}
}

三、Activity进程创建(Zygote进程fork)

在Android启动过程-万字长文(Android14)介绍了Zygote进程(孵化器进程)

3.1 Zygote简介

  • Zygote进程是一个用户进程,由init进程(1号进程)fork而来。
  • Zygote进程通过fork的方式创建新的应用程序进程。
  • Zygote进程的入口点是ZygoteInit类中的main方法。

下面将简单介绍在Zygote进程的代码流转。

3.2 ZygoteInit.java

Android14的ZygoteInit源码地址

  • Zygote进程是在Android系统启动过程中创建的,创建完成后会通过ZygoteServer来监听消息
public static void main(String argv[]) {ZygoteServer zygoteServer = new ZygoteServer();...// 启动Zygote服务器,循环监听消息caller = zygoteServer.runSelectLoop(abiList);if (caller != null) {// 有新的消息就执行对应Runnable代码caller.run();}...
}

3.3 ZygoteServer.java

Android14的ZygoteServer源码地址

  • ZygoteServer获取到消息后会调用ZygoteConnectionprocessCommand方法
Runnable runSelectLoop(String abiList) {while (true) {// 使用 select 监听套接字StructPollfd[] pollFDs = new StructPollfd[socketFDs.size()];if (pollIndex == 0) {// 接收到新的连接ZygoteConnection newPeer = acceptCommandPeer(abiList);peers.add(newPeer);socketFDs.add(newPeer.getFileDescriptor());} else {// 处理已有连接的请求ZygoteConnection connection = peers.get(pollIndex);final Runnable command = connection.processCommand(this, multipleForksOK);}}
}

3.4 ZygoteConnection.java

Android14的ZygoteConnection源码地址

  • ZygoteConnectionprocessCommand方法最终调用ZygoteInitzygoteInit方法
 
Runnable processCommand(ZygoteServer zygoteServer, boolean multipleOK) {...// 调用Zygote的forkAndSpecialize方法fork出Acitivity的进程pid = Zygote.forkAndSpecialize(...);if (pid == 0) {// 在子进程中,即创建出来的应用程序所在进程return handleChildProc(parsedArgs, childPipeFd,parsedArgs.mStartChildZygote);} else {// 在父线程中,pid为创建好的子进程的idhandleParentProc(pid, serverPipeFd);return null;}
}private void handleParentProc(int pid, FileDescriptor serverPipeFd) {// 通过套接字Socket将子进程的 PID 返回给请求方(ActivityManagerService)os.writeInt(pid);
}private Runnable handleChildProc(...) {// 子进程负责应用程序后续的初始化工作ZygoteInit.zygoteInit(...)
}
  • fork系统调用会创建一个新的进程(子进程)。在调用fork后,父进程和子进程(新创建出来的进程)会各自执行后续的代码。
  • 在父进程中,fork返回子进程的PID。这是一个正整数,表示新创建的子进程的进程ID。
  • 在子进程中(新进程),fork 返回 0。这表示当前进程是新创建的子进程。
  • 应用程序(App)的进程就是新创建的子进程

3.5 再次回到ZygoteInit.java

Android14的ZygoteInit源码地址

  • 调用RuntimeInit.applicationInit方法,进行应用程序的初始化过程
public static Runnable zygoteInit(...) {// 常见的初始化工作,例如设置系统属性、初始化默认的未捕获异常处理器等RuntimeInit.commonInit();// Zygote相关的初始化工作。这个初始化过程在C/C++层面进行,设置了必要的Zygote运行环境ZygoteInit.nativeZygoteInit();// 调用RuntimeInit.applicationInit方法,进行应用程序的初始化过程return RuntimeInit.applicationInit(targetSdkVersion, disabledCompatChanges, argv, classLoader);
}

3.6 RuntimeInit.java

Android14的RuntimeInit源码地址

  • RuntimeInitapplicationInit方法完成初始化工作后,通过反射的方式,调用android.app.ActivityThreadmain方法
  • 参数列表中的startClass2.9 ProcessList.java源码中的entryPoint(android.app.ActivityThread)
protected static Runnable applicationInit(...) {// 查找并返回应用程序的主方法return findStaticMain(args.startClass, args.startArgs, classLoader);
}private static Runnable findStaticMain(...) {// 反射得到android.app.ActivityThread类cl = Class.forName(className, true, classLoader);// 反射获取main方法m = cl.getMethod("main", new Class[] { String[].class });// 返回可被执行的Runnable对象return new MethodAndArgsCaller(m, argv);
}

四、初始化Application实例

通过Zygote进程fork出应用程序的进程后,下一步就是创建整个应用程序的Application实例

4.1 ActivityThread.java

Android14的ActivityThread源码地址

  • 创建应用程序的ActivityThread实例
  • 创建应用程序的Application实例
  • 创建应用程序的Looper循环
public static void main(String[] args) {// 初始化主线模块initializeMainlineModules();// 创建MainLooperLooper.prepareMainLooper();// 创建ActivityThreadActivityThread thread = new ActivityThread();// 创建应用程序Application实例thread.attach(false, startSeq);if (sMainThreadHandler == null) {sMainThreadHandler = thread.getHandler();}// 循环监听消息Looper.loop();
}@UnsupportedAppUsage
private void attach(boolean system, long startSeq) {// 获取ActivityManagerService实例final IActivityManager mgr = ActivityManager.getService();// 调用ActivityManagerService的attachApplication方法mgr.attachApplication(mAppThread, startSeq);
}

4.2 ActivityManagerService.java

Android14的ActivityManagerService源码地址

  • ActivityManagerService完成Application创建和第一个Activity的创建
@Override
public final void attachApplication(IApplicationThread thread, long startSeq) {// 调用attachApplicationLocked方法attachApplicationLocked(thread, callingPid, callingUid, startSeq);
}private void attachApplicationLocked(...) {// 调用ActivityThread的bindApplication方法创建并绑定Applicationthread.bindApplication(...)// 在结束Application创建后调用finishAttachApplicationInner启动app的第一个Activity页面,在4.5会介绍这一部分代码finishAttachApplicationInner(startSeq, callingUid, pid);
}

4.3 再次回到ActivityThread.java

Android14的ActivityThread源码地址

  • 通过Handler机制完成消息的传递,正式加载apk文件
public final void bindApplication(...) {AppBindData data = new AppBindData();... // 构造data的数据// H为Handler, BIND_APPLICATION是int值sendMessage(H.BIND_APPLICATION, data);
}// ActivityThread的内部类H
class H extends Handler {public void handleMessage(Message msg) {switch (msg.what) {case BIND_APPLICATION:AppBindData data = (AppBindData)msg.obj;handleBindApplication(data);break;}}
}@UnsupportedAppUsage
private void handleBindApplication(AppBindData data) {Application app;// 最终调用LoadedApk的makeApplicationInner方法加载apk文件到内存中app = data.info.makeApplicationInner(data.restrictedBackupMode, null);// 调用Application的onCreate方法,正式进入apk执行文件mInstrumentation.callApplicationOnCreate(app);
}

4.4 LoadedApk.java

Android14的LoadedApk源码地址

private Application makeApplicationInner(...) {// 获取app的application类(在AndroidManifast.xml中定义的),没有就使用默认的android.app.ApplicationString appClass = mApplicationInfo.getCustomApplicationClassNameForProcess(myProcessName);if (forceDefaultAppClass || (appClass == null)) {appClass = "android.app.Application";}// 调用Instrumentation的newApplication方法创建Application对象app = mActivityThread.mInstrumentation.newApplication(cl, appClass, appContext);
}

4.5 Instrumentation.java

Android14的Instrumentation源码地址

  • Instrumentation完成Application实例的初始化,并调用onCreate方法
// 创建Application对象
static public Application newApplication(Class<?> clazz, Context context) {// Application实例的初始化Application app = (Application)clazz.newInstance();app.attach(context);return app;
}// 调用Application的onCreate方法
public void callApplicationOnCreate(Application app) {app.onCreate();
}

五、启动第一个Activity

5.1 ActivityManagerService.java

Android14的ActivityManagerService源码地址

  • 在执行完Application的onCreate方法后,我们再回到ActivityManagerService.javaattachApplicationLocked方法中
  • attachApplicationLocked方法最终会调用LocalServiceattachApplication方法来加载我们的第一个Acitivity页面
  • ActivityTaskManagerInternal是定义在ActivityTaskManagerService.javaLocalService
private void attachApplicationLocked(...) {// 调用ActivityThread的bindApplication方法创建并绑定Applicationthread.bindApplication(...)// 在结束Application创建后调用finishAttachApplicationInner启动app的第一个Activity页面finishAttachApplicationInner(startSeq, callingUid, pid);
}private void finishAttachApplicationInner(long startSeq, int uid, int pid) {if (normalMode) {try {// 调用`ActivityTaskManagerInternal`(即ActivityTaskManagerService.LocalService)的**attachApplication**方法来加载我们的第一个Acitivity页面didSomething = mAtmInternal.attachApplication(app.getWindowProcessController());}}
}

5.2 ActivityTaskManagerService.java

Android14的ActivityTaskManagerService源码地址

  • 在LocalService中调用RootWindowContainer.attachApplication方法
final class LocalService extends ActivityTaskManagerInternal {@Overridepublic boolean attachApplication(WindowProcessController wpc){// 调用RootWindowContainer的attachApplicationreturn mRootWindowContainer.attachApplication(wpc);}
}

5.3 RootWindowContainer.java

Android14的RootWindowContainer源码地址

  • 最终调用ActivityTaskSupervisorrealStartActivityLocked方法
boolean attachApplication(WindowProcessController app) throws RemoteException {// 调用RootWindowContainer内部类AttachApplicationHelper的process方法return mAttachApplicationHelper.process(app);
}
private class AttachApplicationHelper implements Consumer<Task>, Predicate<ActivityRecord> {boolean process(WindowProcessController app) throws RemoteException {mApp = app;for (int displayNdx = getChildCount() - 1; displayNdx >= 0; --displayNdx) {// 通过/frameworks/base/services/core/java/com/android/server/wm/Task.java中的forAllRootTasks调用test方法getChildAt(displayNdx).forAllRootTasks(this);}}public boolean test(ActivityRecord r) {// 调用ActivityTaskSupervisor的realStartActivityLocked方法mTaskSupervisor.realStartActivityLocked(...)}
}

5.3.1 Task.java

/frameworks/base/services/core/java/com/android/server/wm/Task.java源码地址

boolean forAllRootTasks(Predicate<Task> callback, boolean traverseTopToBottom) {// 调用test方法return isRootTask() ? callback.test(this) : false;
}

5.4 ActivityTaskSupervisor.java

Android14的ActivityTaskSupervisor源码地址

boolean realStartActivityLocked(ActivityRecord r, WindowProcessController proc,boolean andResume, boolean checkConfig) throws RemoteException {...// 创建ClientTransaction启动事务:final ClientTransaction clientTransaction = ClientTransaction.obtain(proc.getThread(), r.token);...// 添加LaunchActivityItem回调clientTransaction.addCallback(LaunchActivityItem.obtain(new Intent...));...// 执行启动事务,调用ClientLifecycleManager的scheduleTransaction方法mService.getLifecycleManager().scheduleTransaction(clientTransaction);...}
  • ClientTransaction事务对象,用于描述一系列客户端(即应用进程)需要执行的操作。
  • LaunchActivityItem回调参数中包括如何启动Activity,启动所需的Intent、配置、状态等信息。

5.4.1 ClientLifecycleManager.java

Android14的ClientLifecycleManager源码地址

void scheduleTransaction(ClientTransaction transaction) throws RemoteException {final IApplicationThread client = transaction.getClient();// 调用ClientTransaction的scheduletransaction.schedule();
}

5.4.2 ClientTransaction.java

Android14的ClientTransaction源码地址

public void schedule() throws RemoteException {// 调用mClient的scheduleTransaction方法mClient.scheduleTransaction(this);
}
  • mClientIApplicationThread接口,实际是ActivityThread的内部类ApplicationThread对象。
  • mClientActivityTaskSupervisor的realStartActivityLocked方法中通过ClientTransaction.obtain(proc.getThread(), r.token),具体可参考ActivityTaskSupervisor源码

5.5 回到ActivityThread.java

Android14的ActivityThread源码地址

private class ApplicationThread extends IApplicationThread.Stub {@Overridepublic void scheduleTransaction(ClientTransaction transaction) throws RemoteException {// 调用ActivityThread的scheduleTransactionActivityThread.this.scheduleTransaction(transaction);}
}
  • scheduleTransaction方法实际调用的是ActivityThread父类ClientTransactionHandlerscheduleTransaction方法

5.5.1 ClientTransactionHandler.java

Android14的ClientTransactionHandler源码地址

void scheduleTransaction(ClientTransaction transaction) {transaction.preExecute(this);// 将事务放入消息队列中,等待主线程的处理sendMessage(ActivityThread.H.EXECUTE_TRANSACTION, transaction);
}

5.5.2 ActivityThread的内部Handler类H处理消息

Android14的ActivityThread源码地址

public void handleMessage(Message msg) {switch (msg.what) {case EXECUTE_TRANSACTION:final ClientTransaction transaction = (ClientTransaction) msg.obj;mTransactionExecutor.execute(transaction);break;}
}

5.5.3 TransactionExecutor.java

Android14的TransactionExecutor源码地址

public void execute(ClientTransaction transaction) {// 执行事务中的回调和生命周期状态请求executeCallbacks(transaction);executeLifecycleState(transaction);
}public void executeCallbacks(ClientTransaction transaction) {final List<ClientTransactionItem> callbacks = transaction.getCallbacks();// 遍历事务中的所有回调项,并调用每个回调项的execute方法。for (int i = 0, size = callbacks.size(); i < size; ++i) {final ClientTransactionItem item = callbacks.get(i);item.execute(mClient, mTransactionHandler, transaction.getLifecycleStateRequest());}
}
  • 每个回调项的execute方法实际就是调用LaunchActivityItemexecute方法

5.5.4 LaunchActivityItem.java

Android14的LaunchActivityItem源码地址

@Override
public void execute(ClientTransactionHandler client, IBinder token, PendingTransactionActions pendingActions) {client.handleLaunchActivity(new LaunchActivityItem.ActivityClientRecord(this), pendingActions, null);
}
  • 调用ClientTransactionHandler即ActivityThreadhandleLaunchActivity方法

5.6 回到ActivityThread

Android14的ActivityThread源码地址

public Activity handleLaunchActivity(ActivityClientRecord r, PendingTransactionActions pendingActions, Intent customIntent) {// 调用performLaunchActivityfinal Activity a = performLaunchActivity(r, customIntent);
}private Activity performLaunchActivity(ActivityClientRecord r, Intent customIntent) {// 创建activity对象activity = mInstrumentation.newActivity(cl, component.getClassName(), r.intent);
}

5.6.1 Instrumentation.java

Android14的Instrumentation源码地址

public Activity newActivity(...) {// 创建ActivityActivity activity = (Activity)clazz.newInstance();...return activity;
}

5.6.2 回到ActivityThread的performLaunchActivity方法

private Activity performLaunchActivity(ActivityClientRecord r, Intent customIntent) {// 创建activity对象activity = mInstrumentation.newActivity(cl, component.getClassName(), r.intent);// activity绑定上下文Contextactivity.attach(appContext, this, getInstrumentation(), r.token,...);// 调用Instrumentation的callActivityOnCreate方法mInstrumentation.callActivityOnCreate(activity, r.state, r.persistentState);
}

5.6.3 Instrumentation的callActivityOnCreate方法

public void callActivityOnCreate(Activity activity, Bundle icicle) {// 调用Activity的performCreate方法activity.performCreate(icicle);
}

5.7 Activity.java

Android14的Activity源码地址

  • 在Activity中实现了生命周期方法的调用逻辑

5.7.1 onCreate方法

final void performCreate(...) {// 调用onCreate方法if (persistentState != null) {onCreate(icicle, persistentState);} else {onCreate(icicle);}
}
  • 绕了一大圈,最终又回到了Activity.java
  • 在performCreate中调用onCreate生命周期方法

5.7.2 onStart方法

5.7.2.1 TransactionExecutor.java
  • 在TransactionExecutor.java的方法execute中通过executeCallbacks创建了Activity并调用onCreate方法
  • 然后在executeLifecycleState方法中调用后续的生命周期方法
public void execute(ClientTransaction transaction) {// 执行事务中的回调executeCallbacks(transaction);// 执行生命周期executeLifecycleState(transaction);
}public void executeLifecycleState(ClientTransaction transaction) {final ActivityLifecycleItem lifecycleItem = transaction.getLifecycleStateRequest();if (lifecycleItem != null) {// 调用ActivityLifecycleItem的execute方法lifecycleItem.execute(transaction.getClientTransactionHandler(), token, pendingActions);}
}
  • ActivityResultItem是一个抽象类
  • 这里实际调用的是ActivityResultItemexecute方法
5.7.2.2 ActivityResultItem.java

Android14的ActivityResultItem源码地址

public void execute(ClientTransactionHandler client, IBinder token,PendingTransactionActions pendingActions) {client.handleResumeActivity(token, true /* isForward */, "RESUME_ACTIVITY");
}
  • 这里实际调用的是ActivityThreadhandleResumeActivity方法
5.7.2.3 ActivityThread的handleResumeActivity方法

Android14的ActivityThread源码地址

public void handleResumeActivity(IBinder token, boolean finalStateRequest, String reason) {// 先调用ActivityThread的performStart方法performRestartActivity(r);// 再调用Activity的performResumer.activity.performResume();
}public void performRestartActivity(ActivityClientRecord r) {// 调用Activity的performStartr.activity.performStart();
}
5.7.2.4 Activity的performStart方法

Android14的Activity源码地址

final void performStart() {// 调用Instrumentation的callActivityOnStart方法mInstrumentation.callActivityOnStart(this);
}
5.7.2.5 Instrumentation的callActivityOnStart方法

Android14的Instrumentation源码地址

public void callActivityOnStart(Activity activity) {activity.onStart();
}

5.7.3 onResume方法

5.7.2.3 ActivityThread的handleResumeActivity方法中提到在onStart方法执行后会调用r.activity.performResume();Activity的performResume方法

5.7.3.1 Activity的performResume方法

Android14的Activity源码地址

final void performResume(boolean followedByPause, String reason) {mInstrumentation.callActivityOnResume(this);
}
5.7.3.2 Instrumentation的callActivityOnResume方法

Android14的Instrumentation源码地址

public void callActivityOnResume(Activity activity) {activity.onResume();
}
  • 至此Activity创建完成,并完成了核心生命周期方法的创建
  • 在onResume方法后,Activity进入前台,准备显示给用户

六、 后续工作

在生命周期完成后,应用程序就会被展示在屏幕上,后续的工作主要是渲染,这里做一个简单的流程说明

  • Activity实例化时创建一个Window对象,默认情况下是PhoneWindow。在PhoneWindow中,有一个 DecorView,它是整个视图层次的根视图。
  • 在Activity的onCreate方法中,Activity会调用setContentView方法,将布局资源加载到DecorView中
  • WindowManager负责管理应用程序窗口,将DecorView添加到窗口中
  • 当DecorView被添加到窗口中后。ViewRootImpl类负责视图层次结构的测量(measure)、布局(layout)和绘制(draw)
  • 最终由SurfaceFlinger合成并显示在屏幕上

以上就是应用程序启动的全过程,如果对你有帮助,就一键三连呗(关注+点赞+收藏),我会持续更新更多干货~~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/141996.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

JS高级(二)、深入对象:构造函数;Object,Array,String,Number包装类;原型对象,原型链

文章目录 一、深入对象1. 构造函数2. 实例成员&静态成员(1)、实例成员(2)、静态成员 3. 包装类(1)、Object&#xff1a;keys&#xff0c;values(2)、Array&#xff1a;forEach&#xff0c;map&#xff0c;join&#xff0c;every&#xff0c;find&#xff0c;filter&#xf…

2024年【山东省安全员B证】报名考试及山东省安全员B证最新解析

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 山东省安全员B证报名考试是安全生产模拟考试一点通生成的&#xff0c;山东省安全员B证证模拟考试题库是根据山东省安全员B证最新版教材汇编出山东省安全员B证仿真模拟考试。2024年【山东省安全员B证】报名考试及山东省…

2024年【山东省安全员A证】最新解析及山东省安全员A证证考试

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 山东省安全员A证最新解析根据新山东省安全员A证考试大纲要求&#xff0c;安全生产模拟考试一点通将山东省安全员A证模拟考试试题进行汇编&#xff0c;组成一套山东省安全员A证全真模拟考试试题&#xff0c;学员可通过…

英语学习交流平台|基于java的英语学习交流平台系统小程序(源码+数据库+文档)

英语学习交流平台系统小程序 目录 基于java的英语学习交流平台系统小程序 一、前言 二、系统设计 三、系统功能设计 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&#xff1a; 博主介绍&#xff1a;✌️大厂码农|毕设布道师&…

MutationObserver详解+案例——深入理解 JavaScript 中的 MutationObserver:原理与实战案例

目录 深入理解 JavaScript 中的 MutationObserver&#xff1a;原理与实战案例 一、MutationObserver 简介 二、MutationObserver 的工作原理 1、基本用法 2、observe 方法的配置项 三、实战案例 案例 1&#xff1a;监控动态内容加载 案例 2&#xff1a;监控属性变化 案…

【演化博弈论】:双方演化博弈的原理与过程

目录 一、演化博弈的原理1. 基本概念2. 参与者的策略3.演化过程 二、MATLAB 代码解读&#xff08;博弈参与主体&#xff08;双方&#xff09;策略选择的动态演化讨程&#xff09;三、MATLAB 代码解读&#xff08;博弈主体随着时间策略选择的动态演化讨程&#xff09;四、结论 演…

软考中级攻略站】-软件设计师(11)- 法律法规与标准化知识

知识产权 知识产权&#xff08;Intellectual Property Rights, IP&#xff09;是指法律赋予创造者或权利持有人对其创作成果享有的专有权利。这些创作成果可以是艺术作品、文学作品、发明创造、商标、工业设计等。知识产权的目的是鼓励创新和创造&#xff0c;保护创作者的合法…

【C++11】可变参数模板

【C11】可变参数模板 一、可变参数模板概念以及定义方式 ​ 在C11之前&#xff0c;类模板和函数模板只能含有固定数量的模板参数&#xff0c;c11增加了可变模板参数特性&#xff1a;允许模板定义中包含0到任意个模板参数。声明可变参数模板时&#xff0c;需要在typename或cla…

【课程学习】信号检测与估计II

b站 文章目录 1-概述 1-概述 线性、正交、平稳、高斯 研究线性模型&#xff0c;采用正交化方法&#xff0c;假设信号平稳&#xff0c;考虑信号的统计特性是高斯的。 本学期考虑&#xff0c;非线性、非正交、非平稳、非高斯。 阵列处理 1980-1990 MUSIC 稀疏性 2006-2012 LASS 时…

[SaaS] FacyTech

Sora还没开源,但这家国产AIGC视频公司已经靠还原现实赚钱了我们找到了朱啸虎说“很酷”的公司https://mp.weixin.qq.com/s/rm_dylLhf4FP01c_hdU3Lw1.tryon 这图ootdiffusion+comfyui工作流吗?lora+controlnet openpose+ipa

最新R(4.4.1)及R-studio保姆级安装配置详细教程及常见问题解答

我不吃我不喝我就要安装好R和rstudio 大家是不是还在为如何安装好rstudio而烦恼呢!&#xff1f;没事的没事的&#xff0c;今天小编就手把手教会大家安装&#xff0c;保管看完就会&#xff0c;安装完成&#xff01;&#xff01;&#xff01; 安装前先关闭360杀毒软件以及防火墙…

windows系统安装docker

参考&#xff1a;GitHub - tech-shrimp/docker_installer: Docker官方安装包&#xff0c;用来解决因国内网络无法安装使用Docker的问题 1.windows系统安装docker cmd 右键 以管理员身份运行 输入 wsl --set-default-version 2 wsl --update --web-download GitHub - tech-s…

一起对话式学习-机器学习02——机器学习方法三要素

【一】核方法 首先补充一下核方法&#xff0c;这应是机器学习分类中的内容。 什么是核方法呢&#xff1f;听起来很高级&#xff0c;但理解很简单&#xff1a; 官方定义&#xff1a;核方法是使用核函数表示和学习非线性模型的一种机器学习方法&#xff0c;可以用于监督学习和非监…

如何解决“json schema validation error ”错误? -- HarmonyOS自学6

一. 问题描述 DevEco Studio工程关闭后&#xff0c;再重新打开时&#xff0c;出现了如下错误提示&#xff1a; json schema validation error 原因&#xff1a; index.visual或其他visual文件中的left等字段的值为负数时&#xff0c;不能以”-0.x“开头&#xff0c;否则就会…

堆+堆排序+topK问题

目录 堆&#xff1a; 1、堆的概念 2、堆的结构 3、堆的实现 3.1、建堆 3.1.1、向上调整建堆(用于堆的插入) 3.1.2、向下调整建堆 3.2、堆的删除 3.3、堆的代码实现 3.3.1、Heap.h 3.3.2、Heap.c 堆排序&#xff1a;&#xff08;O(N*log(N))&#xff09; 1、排序如何…

yjs06——numpy的介绍与优势(1)

1.numpy是什么&#xff1f; numpy是python的一个科学计算库&#xff0c;用于快速处理 任意维度的数据&#xff1b; numpy的存储单元/基本数据类型是 ndarray&#xff08;多维数组&#xff09; 2.多维数组的建立&#xff1a; import numpy as np np.array([ [1,2,3], [4,5,6…

ZYNQ7010_7020_硬件LVDS设计

ZYNQ7010_7020_硬件LVDS设计 ZYNQ7010_7020_硬件LVDS设计 1.版本说明2.概述3.目标4.硬件设计5.IO SERDES 1.版本说明 日期作者版本说明20240916风释雪初始版本 2.概述 当我们使用ZYNQ7010/15/20的时候&#xff0c;本身BANK只支持HR&#xff0c;不支持HP, 如图&#xff1a; …

Flink有界流实现(1)

flink实现有界流需要使用StreamExecutionEnvironment类&#xff0c;并且最后需要使用env.execute() 方法&#xff0c;有界和无界的算子有时候会有不同的 复杂的写法 package org.example.test; import org.apache.flink.api.java.functions.KeySelector; import org.apache.fl…

Redis的缓存穿透、缓存雪崩、缓存击穿怎么解决

Redis在实际使用中是会遇到很多问题的&#xff0c;例如今天说到的缓存穿透、缓存雪崩、缓存击穿。 缓存穿透&#xff1a; 缓存穿透是指客户端请求的数据在redis缓存和数据中都不存在&#xff0c;这样缓存永远都不会生效&#xff0c;这些请求都会打到数据库当中&#xff0c;对…

【CTF MISC】XCTF GFSJ1088 [中等] QR1 Writeup(图像处理+QR Code识别)

[中等] QR1 一张空白的图片&#xff1f; 解法 一张空白图片。 用 Photoshop 打开&#xff0c;放大&#xff0c;发现很多小黑点。 将图片复制到新文档&#xff0c;用魔棒工具选择白色部分。 Ctrl Shift i 反选。编辑&#xff0c;描边&#xff0c;黑色&#xff0c;10px&#…