启动优化

启动优化

App启动是从点击打开App到首页启动起来的过程。冷启动消耗的时间最长,也是最有必要优化的。

App启动流程 参见好文

Launcher通过Binder进程间通信机制通知ActivityManagerService,它要启动一个Activity。

ActivityManagerService通过Binder进程间通信机制通知Launcher进入Paused状态。

Launcher通过Binder进程间通信机制通知ActivityManagerService,它已经准备就绪进入Paused状态, 于是ActivityManagerServicey利用Zygote.fork()创建一个新的进程,用来启动一个ActivityThread实例, 即将要启动的Activity就是在这个ActivityThread实例中运行。

ActivityThread通过Binder进程间通信机制将一个ApplicationThread类型的Binder对象传递给ActivityManagerService,以便以后ActivityManagerService能够通过这个Binder对象和它进行通信。

ActivityManagerService通过Binder进程间通信机制通知ActivityThread,现在一切准备就绪,它可以真正执行Activity的启动操作了。

ActivityThread.main()

  • 初始化App环境

  • 调用Looper.prepareMainLooper()创建当前线程的Looper,并且作为当前App主要的Looper。

  • 创建ActivityThread,ActivityThread使用调用attachApplication()方法使用Binder机制向AMS传递了一个Application对象,AMS的接受到后调用相应的attachApplication()方法

    • attachApplication()调用attachApplicationLocked(), attachApplicationLocked()借助Binder通信IApplicationThread调用ApplicationThread.bindApplication(),其中sendMessage(H.BIND_APPLICATION, data),然后在ActivityThread.H出接收消息,调用handleBindApplication(), LoadedApk.makeApplication()创建了Application实例,而后mInstrumentation.callApplicationOnCreate(app),调用了Application.onCreate()

      public void callApplicationOnCreate(Application app) {
          app.onCreate();
      }
  • AMS得到了ActivityThread的Application对象后,又个给ActivityThread发送了一个消息,调用了ApplicationThread的performLaunchActivity()方法,performLaunchActivity() 借助Instrumentation,完成Activity创建,启动等流程。

    • 创建Context:createBaseContextForActivity

    • Instrumentation.newActivity

    • Instrumentation.callActivityOnCreate

      public void callActivityOnCreate(Activity activity, Bundle icicle) {
          prePerformCreate(activity);
          //activity.performCreate调用了activity.onCreate,执行了生命周期方法
          activity.performCreate(icicle);
          postPerformCreate(activity);
      }
  • Looper开始消息轮询。

应用可以优化的地方有从Application.onCreate到默认Activity启动,减少耗时操作,优化启动流程。

加启动图防止白屏

(或默认Activity设置为透明)

默认Activity Theme设置为如下属性,windowBackground设置启动图,在Activity.onCreate中,setContentView之前,调用setTheme(),设置Theme为Activity可见之后的Theme。

<style name="Launcher" parent="Theme.AppCompat.NoActionBar">
    <item name="android:windowFullscreen">true</item>
    <item name="android:windowBackground">@drawable/launcher</item>
</style>

优化Application.onCreate

  1. MultiDex优化。将启动时必需的方法,放在主Dex中等。部分问题及优化

  2. 减少onCreate中初始化第三方库等,或者不影响后续功能的情况下进行异步加载。

  3. 借助广告页,显示广告时间时间=广告页时间-启动时间

Last updated

Was this helpful?