Android 性能优化—— 启动优化提升60%

  • 在第②个时间段内,启动进程、调用无界面 Activity 的 onCreate() 等、 pause/finish 无界面的 Activity.

  • 在第③个时间段内,调用有界面 Activity 的 onCreate、onResume.

//ActivityRecord

private void reportLaunchTimeLocked(final long curTime) {

final long thisTime = curTime - displayStartTime;

final long totalTime = stack.mLaunchStartTime != 0 ?

(curTime - stack.mLaunchStartTime) : thisTime;

}

最后总结一下 : 如果需要统计从点击桌面图标到 Activity 启动完毕,可以用WaitTime作为标准,但是系统的启动时间优化不了,所以优化冷启动我们只要在意 ThisTime 即可。

系统日志统计

另外也可以根据系统日志来统计启动耗时,在Android Studio中查找已用时间,必须在logcat视图中禁用过滤器(No Filters)。因为这个是系统的日志输出,而不是应用程序的。你也可以查看其它应用程序的启动耗时。

过滤displayed输出的启动日志.

3. 代码优化


根据上面启动时间的输出统计,我们就可以先记录优化前的冷启动耗时,然后再对比优化之后的启动时间。

Application 优化

Application 作为 应用程序的整个初始化配置入口,时常担负着它不应该有的负担~

有很多第三方组件(包括App应用本身)都在 Application 中抢占先机,完成初始化操作。

但是在 Application 中完成繁重的初始化操作和复杂的逻辑就会影响到应用的启动性能

通常,有机会优化这些工作以实现性能改进,这些常见问题包括:

  • 复杂繁琐的布局初始化

  • 阻塞主线程 UI 绘制的操作,如 I/O 读写或者是网络访问.

  • Bitmap 大图片或者 VectorDrawable加载

  • 其它占用主线程的操作

我们可以根据这些组件的轻重缓急之分,对初始化做一下分类 :

  1. 必要的组件一定要在主线程中立即初始化(入口 Activity 可能立即会用到)

  2. 组件一定要在主线程中初始化,但是可以延迟初始化。

  3. 组件可以在子线程中初始化。

放在子线程的组件初始化建议延迟初始化 ,这样就可以了解是否会对项目造成影响!

所以对于上面的分析,我们可以在项目中 Application 的加载组件进行如下优化 :

将Bugly,x5内核初始化,SP的读写,友盟等组件放到子线程中初始化。(子线程初始化不能影响到组件的使用)

new Thread(new Runnable() {

@Override

public void run() {

//设置线程的优先级,不与主线程抢资源

Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND);

//子线程初始化第三方组件

Thread.sleep(5000);//建议延迟初始化,可以发现是否影响其它功能,或者是崩溃!

}

}).start();

将需要在主线程中初始化但是可以不用立即完成的动作延迟加载(原本是想在入口 Activity 中进行此项操作,不过组件的初始化放在 Application 中统一管理为妙.)

handler.postDelayed(new Runnable() {

@Override

public void run() {

//延迟初始化组件

}

}, 3000);

闪屏页业务优化

最后还剩下那些为数不多的组件在主线程初始化动作,例如埋点,点击流,数据库初始化等,不过这些消耗的时间可以在其它地方相抵。

需求背景 : 应用App通常会设置一个固定的闪屏页展示时间,例如2000ms,所以我们可以根据用户手机的运行速度,对展示时间做出调整,但是总时间仍然为 2000ms。

闪屏页政展示总时间 = 组件初始化时间 + 剩余展示时间。

也就是2000ms的总时间,组件初始化了800ms,那么就再展示1200ms即可。

我们先了解一下 Application的启动过程,图片摘自 :

如何统计Android App启动时间

https://www.jianshu.com/p/59a2ca7df681

虽然这个以下图片的源码并不是最新源码(5.0源码),不过不影响整体流程。(7.0,8.0方法名会有所改变)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值