本篇文章是经过多篇博文参考和学习下记录的,仅供参考学习用,如有侵权或异议,请联系我修改。

一、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布局

  • 暖启动/热启动引起的白屏/黑屏

这点在配置较好,内存空间充足的手机上不是很明显,但低端手机或者内存吃紧的情况下依旧会出现”闪屏”效果,持续时间很短,一闪而过。

二、布局优化方案

2.1 通用布局优化方案

  • 调试GPU过度绘制,将Overdraw降低到合理范围内;
  • 减少嵌套层次及控件个数,保持view的树形结构尽量扁平(使用Hierarchy Viewer可以方便的查看),同时移除所有不需要渲染的view;
  • 使用GPU配置渲染工具,定位出问题发生在具体哪个步骤,使用TraceView精准定位代码;
  • 使用标签,Merge减少嵌套层次、ViewStub延迟初始化。

相关工具:

(1)、打开Show GPU Overrdraw的选项:设置 -> 开发者选项 -> 调试GPU过度绘制 -> 显示GPU过度绘制;

(2)、Hierarchy Viewer

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)

博客:

3.2 Android开发常见的内存泄漏

  • 单例造成的内存泄漏
  • 非静态内部类创建静态实例造成的内存泄漏
  • Handler造成的内存泄漏
  • 线程造成的内存泄漏
  • 资源未关闭造成的内存泄漏
  • 使用了静态的Activity和View
  • 注册了系统的服务,但onDestory未注销
  • 不需要用的监听未移除会发生内存泄露


4.1 通用方案

  • 利用ProGuard压缩代码去除无用资源;
  • andresguard进一步压缩与混淆资源;
  • 第三方开源库的瘦身,仅保留自己需要的部分;
  • 极致的图片压缩与webp的使用;
  • 合理配置去除不必要的配置,仅保留中文配置等…
  • so的优化与配置,只保留一类so;
  • 动态下发一些资源:字库、so、换肤包等。

检测应用情况工具:https://nimbledroid.com/