前言
应用的冷启动总是无法避免的,也就是说冷启动时用户总要经历一个启动等待时间。开发人员唯一能做的就是在 Application 和 第一个 Activity 中,减少 onCreate() 方法的工作量,从而缩短冷启动的时间。像应用中嵌入的一些第三方 SDK,都建议在 Application 中做一些初始化工作,开发人员不妨采取懒加载的形式移除这部分代码,而在真正需要用到第三方 SDK 时再进行初始化。
我们可以通过主题中的 windowBackground 属性,自定义应用启动时的窗口背景
1.在res/drawable下创建一个launch_screen.xml文件,并写下下面的内容
其中@drawable/ic_app_logo是一张图片,来自drawable文件夹下
其中@color/background_material_light,来自colors.xml文件
1 | <layer-list xmlns:android="http://schemas.android.com/apk/res/android"> |
2. 在styles.xml文件下创建SplashTheme的主题,引入bg_splash
1 | <resources> |
3.在你的启动界面中引入SplashTheme,如下
1 | <activity |
扩展
冷启动耗时统计
adb 命令统计
adb命令 : adb shell am start -S -W 包名/启动类的全限定名 , -S 表示重启当前应用
1 | C:\Android\Demo>adb shell am start -S -W com.example.moneyqian.demo/com.example.moneyqian.demo.MainActivity |
ThisTime : 最后一个 Activity 的启动耗时(例如从 LaunchActivity - >MainActivity「adb命令输入的Activity」 , 只统计 MainActivity 的启动耗时)
TotalTime : 启动一连串的 Activity 总耗时.(有几个Activity 就统计几个)
WaitTime : 应用进程的创建过程 + TotalTime .
Application 优化
Application 作为 应用程序的整个初始化配置入口,时常担负着它不应该有的负担~
有很多第三方组件(包括App应用本身)都在 Application 中抢占先机,完成初始化操作。
但是在 Application 中完成繁重的初始化操作和复杂的逻辑就会影响到应用的启动性能
通常,有机会优化这些工作以实现性能改进,这些常见问题包括:
- 复杂繁琐的布局初始化
- 阻塞主线程 UI 绘制的操作,如 I/O 读写或者是网络访问.
- Bitmap 大图片或者 VectorDrawable加载
- 其它占用主线程的操作
我们可以根据这些组件的轻重缓急之分,对初始化做一下分类 :
- 必要的组件一定要在主线程中立即初始化(入口 Activity 可能立即会用到)
- 组件一定要在主线程中初始化,但是可以延迟初始化。
- 组件可以在子线程中初始化。
放在子线程的组件初始化建议延迟初始化 ,这样就可以了解是否会对项目造成影响!
所以对于上面的分析,我们可以在项目中 Application 的加载组件进行如下优化 :
将Bugly,x5内核初始化,SP的读写,友盟等组件放到子线程中初始化。(子线程初始化不能影响到组件的使用)
1 | new Thread(new Runnable() { |
将需要在主线程中初始化但是可以不用立即完成的动作延迟加载(原本是想在入口 Activity 中进行此项操作,不过组件的初始化放在 Application 中统一管理为妙.)
1 | handler.postDelayed(new Runnable() { |
来源
- 本文链接: https://blog.hansong.icu/2021/09/09/android_launch_start/
- 版权声明: 本博客所有文章除特别声明外,均默认采用 CC BY-NC-SA 4.0 许可协议。