android 应用的启动过程

#移动开发 #Android

1. 说明
应用的启动过程通常是通过 startActivity 函数,无论是在应用中调其它应用还是在桌面(桌面是 Launcher

应用)上点击,最终都将通过这个函数启动进程或者界面,下面以分析代码的方式,介绍它具体的工作过程

2. 过程

  1. Launcher/src/com/android/launcher.java

在应用或桌面上启动应用,例如桌面应用的启动由于中调用了 startActivity() 函数

  1. frameworks/base/core/java/android/app/Activity.java:startActivity()
    Activity.java 继承了 Context.java,并实现了它的 startActivity(),它向下调用了

execStartActivity()

frameworks/base/core/java/android/app/Instrumentation.java:execStartActivity()
execStartActivity 利用 IntentFilter 得到具体 Activity,并调用了更下层的 startActivity

  1. frameworks/base/core/java/android/app/ActivityManagerNative.java
    ActivityManagerProxy.startActivity()
    IBinder.transact(….);
    它通过 Binder 的方式与 ActivityManagerService.java 通讯,并发送启动请求

  2. frameworks/base/core/java/android/os/Binder.java:execTransact()
    Binder 消息转递的实现,用于用户应用与后台服务的通讯

frameworks/base/services/java/com/android/server/am/ActivityManagerService.java
onTransact();
startProcessLocked(); 开启新线程

  1. frameworks/base/core/java/android/os/Process.java 的函数 start 为入口
    通过 socket 发给 zygote 进程

  2. frameworks/base/core/java/com/android/internal/os/Zygote*.java
    告知虚拟机新建进程,此时会将要建立的进程名,用户名,组名一并传给虚拟机,以建立进程

  3. dalvik/libcore/dalvik/src/main/java/dalvik/system/Zygote.java
    虚拟机处理

  4. dalvik/vm/native/dalvik_system_Zygote.c (forkAndSpecializeCommon)
    虚拟机处理