应用启动速度优化

应用启动速度优化一般可以有以下几种方式:

  • 启动页优化
  • 第三方库懒加载
  • MultiDex优化: 介绍了两种方式,一种是直接在闪屏页开个子线程去加载dex,难维护,不推荐;一种是今日头条的方案,在单独一个进程加载dex,加载完主进程再继续。
  • webview优化
  • 线程优化
  • 快速启动Activity的方式:预创建Activity,预加载数据。

1.启动页优化

          消除启动时的白屏/黑屏,市面上大部分App都采用了这种方法,非常简单,是一个障眼法,不会缩短实际冷启动时间,简单贴下实现方式吧。

<application
    android:name=".MainApplication"
    ...
    android:theme="@style/AppThemeWelcome>

styles.xml 增加一个主题叫AppThemeWelcome

<style name="AppThemeWelcome" parent="Theme.AppCompat.NoActionBar">
    ...
    <item name="android:windowBackground">@drawable/logo</item>  <!-- 默认背景-->
</style>

启动页设置这个主题,或者全局给Application设置

<activity android:name=".ui.activity.SplashActivity"
            android:configChanges="orientation|screenSize|keyboardHidden"
            android:theme="@style/AppThemeWelcome"
            android:screenOrientation="portrait">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
</activity>

这样的话启动Activity之后背景会一直在,所以在Activity的onCreate方法中切换成正常主题

protected void onCreate(@Nullable Bundle savedInstanceState) {
    setTheme(R.style.AppTheme); //切换正常主题
    super.onCreate(savedInstanceState);
}

这样打开桌面图标会马上显示logo,不会出现黑/白屏,直到Activity启动完成,替换主题,logo消失,但是总的启动时间并没有改变。

2.第三方库懒加载      

很多第三方开源库都说在Application中进行初始化,十几个开源库都放在Application中,肯定对冷启动会有影响,所以可以考虑按需初始化,例如Glide,可以放在自己封装的图片加载类中,调用到再初始化,其它库也是同理,让Application变得更轻。

3.MultiDex优化

方案1:直接在闪屏页开个子线程去执行MultiDex逻辑,MultiDex不影响冷启动速度,但是难维护。

方案2:今日头条的MultiDex优化方案:

  1. 在Application 的attachBaseContext 方法里,启动另一个进程的LoadDexActivity去异步执行MultiDex逻辑,显示Loading。
  2. 然后主进程Application进入while循环,不断检测MultiDex操作是否完成
  3. MultiDex执行完之后主进程Application继续走,ContentProvider初始化和Application onCreate方法,也就是执行主进程正常的逻辑。

4.webview优化

  • WebView第一次创建比较耗时,首次创建WebView耗时大约需要500ms左右,第二次创建耗时大约需要20ms左右,可以预先创建WebView,提前将其内核初始化。
  • 使用WebView缓存池,用到WebView的地方都从缓存池取,缓存池中没有缓存再创建,注意内存泄漏问题。
  • 本地预置html和css,WebView创建的时候先预加载本地html,之后通过js脚本填充内容部分。

5.线程优化

            线程是程序运行的基本单位,线程的频繁创建是耗性能的,所以大家应该都会用线程池。单个cpu情况下,即使是开多个线程,同时也只有一个线程可以工作,所以线程池的大小要根据cpu个数来确定。

 

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值