-
控制线程数量 – 线程池
-
检查线程间的锁 ,防止依赖等待
-
使用合理的启动架构
-
微信内部使用的 mmkernel
-
阿里 Alpha
系统调度优化
应用启动的时候,如果主线程的工作过多,也会造成主线程过于繁忙,下面几个系统调度相关的点需要注意:
- 启动过程中减少系统调用,避免与 AMS、WMS 竞争锁。启动过程中本身 AMS 和 WMS 的工作就很多,且 AMS 和 WMS 很多操作都是带锁的,如果此时 App 再有过多的 Binder 调用与 AMS、WMS 通信,SystemServer 就会出现大量的锁等待,阻塞关键操作
- 启动过程中不要启动子进程,如果好几个进程同时启动,系统负担则会加倍,SystemServer 也会更繁忙
- 启动过程中除了 Activity 之外的组件启动要谨慎,因为四大组件的启动都是在主线程的,如果组件启动慢,占用了 Message 通道,也会影响应用的启动速度
- Application 和主 Activity 的 onCreate 中异步初始化某些代码
启动过程中繁忙的 cpu
启动过程中繁忙的 SystemServer
GC 优化
启动过程中减少 GC 的次数
- 避免进行大量的字符串操作,特别是序列化和反序列化
- 频繁创建的对象需要考虑复用
- 转移到 Native 实现
可以参考下面这篇文章 支付宝客户端架构解析:Android 客户端启动速度优化之「垃圾回收」)
IO 优化
启动过程中负载比较高,有许多系统 IO 都在此时发生,这时候 IO 的性能下降会比较快,此时 App 中的 IO 操作会比平时更慢一些,尤其是在性能比较差的机器上。
IO 分网络 IO 和磁盘 IO ,启动过程中不建议进行网络 IO ,对于磁盘 IO 则要细扣,邵文在高手课里面有讲到:
- 我们要清楚启动过程中读了什么文件、多少个字节、 Buffer 是多大,使用了多长时间、在什么线程等一系列信息
- 进行启动过程中的 IO 监控,微信在监控 IO 时发现有用户的 db 文件达到了 500MB
下面图中可以看到低内存的时候,启动应用主线程有较多的 IO 等待(UI Thread 这一栏,橘红色代表 IO 等待 )
资源重排
利用 Linux 的 IO 读取策略,PageCache 和 ReadAhead 机制,按照读取顺序重新排列,减少磁盘 IO 次数 。具体操作可以参考支付宝 App 构建优化解析:通过安装包重排布优化 Android 端启动性