Android启动优化--介绍

启动优化

背景介绍

(1)启动速度是用户的第一体验。

(2)八秒定律。在互联网中,如果一个网页被打开了8秒还没有打开,就会流失70%的用户。

启动分类

google 提供的文档:App startup time

(1)冷启动

(2)热启动

(3)温启动

(1)Click Event: 用户给的一个点击事件
(2)IPC:点击事件会触发一个IPC的操作
(3)Process.start:这个方法是用来进行一个进程的创建的
(4)ActivityThread:是每个单独app的入口,相当于java程序的main方法一样,这个类也有一个main方法,在这个main方法中,会进行消息的循环创建,以及与相关的handler相关的创建。
(5)bindApplication:通过反射去创建Application,以及调用与Application相关的生命周期
(6)LifeCycle:就是Activity的生命周期
(7)ViewRootImpl:开始进行真正的界面绘制

相关任务

(1)启动APP
(2)加载空白Window
(3)创建进程           
(4)创建Application
(5)启动主线程
(6)创建MainActivity
(7)加载布局
(8)布置屏幕
(9)首帧绘制

《其中,前三个任务都是系统的行为,我们是没有办法进行干预的,但是第二条可以进行假干预》

优化方向

(1)Application和Activity生命周期

优化总方针

(1)异步,见:Android启动优化--异步优化

(2)延时,见:Android启动优化--延时方案

(3)懒加载,比如地图,只有在使用地图的时候,才加载。

注意事项

(1)监控的完善

线上监控多阶段时间(App,Activity,生命周期间隔时间)。处理聚合看趋势。

(2)收敛启动代码修改权限

结合Ci,修改启动代码需要review或通知

其他优化

有如下几种:

提前加载SharedPreferences

性质:
(1)可能会几十个类使用SharedPreferences
(2)异步加载
使用:
(1)在Multidex之前加载,利用此阶段CPU。
(2)覆写getApplicationContext()返回this。

启动阶段不启动子进程

注意:
(1)子进程会共享CPU资源,导致主进程CPU紧张

不要在启动阶段去起别的组件

注意:
(1)注意启动顺序:App onCreate 之前是 ContentProvider。所以不要在启动阶段去起别的组件,特别是ContentProvider组件,因为在这个阶段所耗时的时间是算在Application中的。

类加载优化

方法:
(1)提前异步类加载。虽然类加载的时间不长,但是几千个类加载,就需要时间了

注意点:
(1)Class.forName()只加载类本身及其静态变量的引用类
(2)new 类示例  可以额外加载类成员变量的引用类

问题:
(1)那些类需要异步加载呢? 屏蔽掉系统的classLoader,自己定义一个ClassLoader,并打印加载的时间,这样在启动APP后,可以看到所有加载的类,将这些类放在异步加载中。


在启动阶段优化的黑科技,这些方法比较难,一般是一个团队

(1)启动阶段抑制GC
(2)CPU锁频,将CPU的频率设置最高


 

猜你喜欢

转载自blog.csdn.net/gs344937933/article/details/89736867