Android
  • Introduction
  • Android开发常见问题
  • Android工具
    • Logcat
    • ADB和ADB idea
  • 四大组件
    • Activity
    • Service
    • BroadcastReceiver
    • ContentProvider
  • 基本组件
    • Application
    • WebView
  • Intent
  • Fragment
  • View
  • 动画
  • 五大存储
  • 优化
    • 启动优化
    • Apk瘦身
    • 电量优化
    • 布局优化
    • 性能优化
  • 适配
    • 版本适配
    • UI适配
    • 系统和机型适配
    • 暗黑模式
  • 打包
  • 国际化
  • 加固和混淆
    • 混淆
    • 加固
  • 混合开发
  • 组件化
  • 插件化
  • 热修复
  • 服务和机制
  • 源码分析
    • Handler
    • LruCache
    • View
    • 触摸事件分发机制
    • MeasureSpec
  • 逆向
  • 硬件和传感器
  • 多媒体
  • OpenGL
  • 官方库
    • RecyclerView
  • 第三方库
    • BlockCanary
    • LeakCanary
    • OkHttp
    • RxJava 2
    • Glide
  • 测试
  • Kotlin
    • Kotlin data class 和 Gson, @parcelize问题
    • Kotlin中::class javaClass等真实类型
    • Kotlin注解
Powered by GitBook
On this page
  • 启动优化
  • App启动流程 参见好文
  • 加启动图防止白屏
  • 优化Application.onCreate

Was this helpful?

  1. 优化

启动优化

Previous优化NextApk瘦身

Last updated 5 years ago

Was this helpful?

启动优化

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. 减少onCreate中初始化第三方库等,或者不影响后续功能的情况下进行异步加载。

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

MultiDex优化。将启动时必需的方法,放在主Dex中等。

参见好文
部分问题及优化