了解App启动流程是
App启动优化的重要知识点之一,本章主要讲解的是:Android系统的启动流程和App启动流程
(1)系统的启动流程
C++代码:
开机,打开电源-->引导程序BootLoader-->linux init.rc-->init进程-->孵化器Zygote 创建JVM
Java代码:
JVM创建之后会启动一个SystemServer、Binder线程池、SystemServiceManager-->开启各种服务(ActivityMangerService、WindowMangerService、PackageManagerService、CameraService、SensorService等等)-->最后由ActivityMangerService启动Launcher。
使用画图工具绘制的流程如下:

详细步骤如下:
- 打开电源 引导芯片代码加载引导程序Boot Loader到RAM中去执行
- BootLoader把操作系统拉起来
- Linux 内核启动开始系统设置,找到一个init.rc文件启动初始化进程
- init进程初始化和启动属性服务,之后开启Zygote进程
- Zygote开始创建JVM并注册JNI方法,开启SystemServer
- 启动Binder线程沲和SystemServiceManager,并启动各种服务
- AMS(Activity管理服务:ActivityManagerService)启动Launcher
(2)Launcher启动的启动流程
Launcher是什么?如下图所示:

如图所示,这就是 Launcher,Launcher是系统级App,在这个App里面有若干个图标。
我们可以通过adb shell dumpsys activity activities查看当前的activity名,如图:

显然,当前Activity的名称就是Launcher,这个类可以在Android源码中可以找到,文件位置如下:
..\android-6.0.1_r1\packages\apps\Launcher2\src\com\android\launcher2\Launcher.java
如果好奇心比较强的话,可以通过adb shell ps查看当前正在运行的进程。
当我们用手点击一个图标时,就到了这个类
public final class Launcher extends Activity
执行onClick(View view)方法,会把这个应用的相关信息传入到Intent中,具体源码流程如下:
先获取一个intent--->startActivitySafely(v, intent, tag)-->startActivity(v, intent, tag);-->startActivity(intent);
这里需要注意的是,这里的startActivity(intent)并不是我们平时启动一个Activity的意思,它的意思是:通知系统,开辟一个Intent进程,App的启动信息保存在Intent进程中。
在后台有一个叫孵化器(Zygote)这个东西,它的作用是fork出一个SystemServer,最终开启一个ActivityThread。
ActivityThread有一个main方法,它是Launcher启动的入口,可以参考这篇文章:
https://www.jianshu.com/p/35dac765fe1c
ActivityThread.java做为入口, 用attach开启app, 再加载application和activity
thread.attach(false);--->mgr.attachApplication(mAppThread)
会通过远端进程去回调
private void handleBindApplication(AppBindData data)
Application app = data.info.makeApplication(创建Application对象
mInstrumentation.callApplicationOnCreate(app);----> app.onCreate();
[本章完...]