本篇文章是经过多篇博文参考和学习下记录的,仅供参考学习用,如有侵权或异议,请联系我修改。
一、App启动速度优化
1.1 Google 加速方案
- 利用提前展示出来的Window,快速展示出来一个界面,给用户快速反馈的体验;
- 避免在启动时做密集沉重的初始化(Heavy app initialization);
- 定位问题:避免I/O操作、反序列化、网络操作、布局嵌套等。
1.2 通用加速方案:
- 利用主题快速显示界面;
- 异步初始化组件;
- 梳理业务逻辑,延迟初始化组件、操作;
- 正确使用线程;
- 去掉无用代码、重复逻辑等
1.3 启动方式:
- 冷启动
当启动应用时,后台没有该应用的进程(常见如:进程被杀、首次启动等),这时系统会重新创建一个新的进程分配给该应用
- 暖启动
当启动应用时,后台已有该应用的进程(常见如:按back键、home键,应用虽然会退出,但是该应用的进程是依然会保留在后台,可进入任务列表查看),所以在已有进程的情况下,这种启动会从已有的进程中来启动应用
- 热启动
相比暖启动,热启动时应用做的工作更少,启动时间更短。热启动产生的场景很多,常见如:用户使用返回键退出应用,然后马上又重新启动应用
热启动和暖启动因为会从已有的进程中来启动,不会再创建和初始化Application
平时我们讨论中基本都会将暖启动和热启动合在一起统称为热启动,因为暖启动与热启动差异很小,如果不是特别留意启动流程,那么在用户体验和感官上没有直接差异,但是在framework层执行时是有一定差异的。本次优化点也是围绕冷启动和热启动来做,将暖启动与热启动统称为热启动
另外有一点,从绝对时间上来看,app安装后的首次启动将会最耗时,因为首次启动会新建数据库,sp文件,各种缓存,配置等
白屏/黑屏问题
白屏或黑屏,具体是哪一个,取决于app的Theme使用的是dark还是light主题
Android Studio 引起的白屏
2.x时代的AS开启了instant run以后可能会导致白屏,但实际完整的apk包不会出现此问题冷启动引起的白屏/黑屏
点击你app那一刻到系统调用Activity.onCreate()之间的时间段。在这个时间段内,WindowManager会先加载app主题样式中的windowBackground作为app的预览元素,然后再真正去加载activity的layout布局
- 暖启动/热启动引起的白屏/黑屏
这点在配置较好,内存空间充足的手机上不是很明显,但低端手机或者内存吃紧的情况下依旧会出现”闪屏”效果,持续时间很短,一闪而过。
博客地址:https://github.com/DanluTeam
二、布局优化方案
2.1 通用布局优化方案
- 调试GPU过度绘制,将Overdraw降低到合理范围内;
- 减少嵌套层次及控件个数,保持view的树形结构尽量扁平(使用Hierarchy Viewer可以方便的查看),同时移除所有不需要渲染的view;
- 使用GPU配置渲染工具,定位出问题发生在具体哪个步骤,使用TraceView精准定位代码;
- 使用标签,Merge减少嵌套层次、ViewStub延迟初始化。
相关工具:
(1)、打开Show GPU Overrdraw的选项:设置 -> 开发者选项 -> 调试GPU过度绘制 -> 显示GPU过度绘制;
(2)、Hierarchy Viewer
博客:http://blog.csdn.net/lmj623565791/article/details/45556391/
http://www.trinea.cn/android/layout-performance/
2.2 检测应用在UI线程的卡顿
- 利用UI线程Looper打印的日志;
- 利用Choreographer。
开源地址
https://github.com/markzhai/AndroidPerformanceMonitor[方式1]
https://github.com/wasabeef/Takt[方式2]
https://github.com/friendlyrobotnyc/TinyDancer [方式2]
三、内存优化方案
3.1 通用方案
- 节制地使用Service
- 当界面不可见时释放内存
- 当内存紧张时释放内存
- 避免在Bitmap上浪费内存
- 使用优化过的数据集合
- 使用ProGuard简化代码
- 利用工具检测内存泄漏(https://developer.android.google.cn/studio/preview/features/android-profiler.html#advanced-profiling)
博客:http://blog.csdn.net/guolin_blog/article/details/42238627
3.2 Android开发常见的内存泄漏
- 单例造成的内存泄漏
- 非静态内部类创建静态实例造成的内存泄漏
- Handler造成的内存泄漏
- 线程造成的内存泄漏
- 资源未关闭造成的内存泄漏
- 使用了静态的Activity和View
- 注册了系统的服务,但onDestory未注销
- 不需要用的监听未移除会发生内存泄露
四、APK瘦身
4.1 通用方案
- 利用ProGuard压缩代码去除无用资源;
- andresguard进一步压缩与混淆资源;
- 第三方开源库的瘦身,仅保留自己需要的部分;
- 极致的图片压缩与webp的使用;
- 合理配置去除不必要的配置,仅保留中文配置等...
- so的优化与配置,只保留一类so;
- 动态下发一些资源:字库、so、换肤包等。
检测应用情况工具:https://nimbledroid.com/
博客:1.https://www.jianshu.com/p/8f14679809b3# 2.http://t.cn/RGjNpam
Android性能全分析博客:https://mp.weixin.qq.com/s/QVOYF2nfoWMCbM5YsxQgRQ