Android应用启动流程

Android面试技术要点汇总
2021-05-17 14:29 · 阅读时长7分钟
小课
在桌面应用进程中执行的过程
  • Acitivity.java

当用户点击桌面的应用图标时,桌面应用会将包名封装成Intent,通过Activity.startActivity()来启动关联的应用,示例:

Intent intent = new Intent(Intent.ACTION_MAIN, null);
intent.addCategory(Intent.CATEGORY_LAUNCHER);
intent.setPackage("com.example.app");
activity.startActivity(intent);

Activity内部经过流转最终会调用Instrumentation.execStartActivity()方法。

  • Instrumentation.java

这个方法通过ActivityManageService在当前应用中代理对象,远程调用SystemServer进程中ActivityManageService.startActivity()方法。

在SystemServer进程中执行的过程
  • ActivityManageService.java

ActivityManageService.startActivity()方法会直接调用ActivityTaskManagerService.startAcitivity(),

  • ActivityTaskManagerService.java

在ActivityTaskManagerService中做了简单的进程权限检查,然后调用了ActivityStarter.execute()方法,

  • ActivityStarter.java

在这个方法中会调用ActivityStarter.startActivityMayWait(),在这个方法中会通过Intent去查找合适的Activity,然后继续调用多个ActivityStarter.startActivity()的重载方法。

在这个过程中会调用ActivityStackSupervisor.checkStartAnyActivityPermission()方法检查当前应用是否有权限启动当前的Activity,比如是否拥有Activity在AndroidManifest.xml配置的指定权限或者exported属性是否为false

检查通过的话,会调用ActivityStarter.startActivityUnchecked(),在这个方法中会根据intent中的标志和当前Activity的情况来决定怎么处理Activity的任务栈。接着会调用RootActivityContainer.resumeFocusedStacksTopActivities()方法

  • ActivityStack.java

这个方法中会调用ActivityStack.resumeTopActivityUncheckedLocked()方法,在这个方法中调用ActivityStack.resumeTopActivityInnerLocked()方法,在这个方法中会判断是否有对应的应用进程在运行,如果没有,会调用ActivityStackSupervisor.startSpecificActivityLocked()方法。

  • ActivityStackSupervisor.java

在这个方法中会通过handler机制发送启动进程的通知,最终会调用到ActivityManagerService.startProcess()方法,这个方法最后调用了ProcessList.startProcessLocked()方法。

  • ProcessList.java

经过多次内部调用之后,会调用到ProcessList.startProcess()方法,在这个方法里面调用了Process.start()方法,最后调用了ZygoteProcess.start()方法,在ZygoteProcess类中会通过LocalSocket与Zygote进程进行通讯,请求fork进程

在Zygote进程中执行的过程
  • ZygoteServer.java

在Zygote进程启动之后会调用ZygoteServer.runSelectLoop()方法进入轮询等待请求,当接收到fork进程的请求后会调用ZygoteConnection.processOneCommand()方法。

  • ZygoteConnection.java

在这个方法中,会从请求中解析出参数,如果请求是fork进程,则会Zygote.forkAndSpecialize()方法,在这个方法中会通过系统调用真正的fork出一个子进程。

在应用进程中执行的过程
  • ActivityThread.java

当fork成功之后,应用进程就已经启动,它会通过反射去查找并执行android.app.ActivityThread.main()方法。

在main方法中,会先创建Looper,然后创建ActivityThread对象,并且调用它的ActivityThread.attach()方法,在这个方法中会通过远程调用ActivityManagerService.attachApplication()方法,最后主线程开始轮询处理消息

在SystemServer进程中执行的过程
  • ActivityManagerService.java

ActivityManagerService.attachApplication()方法会调用ActivityManagerService.attachApplicationLocked()方法,在这个方法中会进行一些初始化,解析应用的ApplicationInfo,ContentProvider等信息,然后远程调用ApplicationThread.bindApplication()方法。

在应用进程中执行的过程
  • ActivityThread.java

ApplicationThread.bindApplication()方法会通过handler发送通知,最后回调到ActivityThread.handleBindApplication()方法,在这个方法中会创建Application对象,初始化应用中的ContentProvider,调用Application.onCreate()

在SystemServer进程中执行的过程
  • ActivityManagerService.java

ActivityManagerService.attachApplicationLocked()方法在调用完ApplicationThread.bindApplication()方法之后会调用ActivityTaskManagerService.attachApplication()方法,这个方法会直接调用RootActivityContainer.attachApplication()方法,在这个方法中会遍历Activity栈,找到主Activity,然后调用ActivityStackSupervisor.realStartActivityLocked()方法,这个方法会通过远程调用最终调用到ActivityThread.handleLaunchActivity()方法。

在应用进程中执行的过程

ActivityThread.handleLaunchActivity()方法中会调用ActivityThread.performLaunchActivity()方法,在这个方法中会创建Acitivty对象,并且调用Acitivty.onCreate()

ActivityManagerService