性能优化<第一篇>:App的启动流程

了解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

使用画图工具绘制的流程如下:

图片.png

详细步骤如下:

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

(2)Launcher启动的启动流程

Launcher是什么?如下图所示:

图片.png

如图所示,这就是 LauncherLauncher是系统级App,在这个App里面有若干个图标。

我们可以通过adb shell dumpsys activity activities查看当前的activity名,如图:

图片.png

显然,当前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();

[本章完...]

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容