蜂巢APP启动优化实践

性能优化任重道远,虽然道路坎坷,但我们从来没有停下脚步。


文章目录

  • 蜂巢APP启动优化实践
  • 前言
  • 一、启动性能
  • 二、优化方法步骤
    • 1.查看目前启动时间
    • 2.梳理耗时任务
      • Application:
      • 闪屏页Welcome:
      • 主页MainActivity:
      • 首页IndexFragment:
    • 检验优化效果:
      • 第一种方法 adb 命令:
      • 第二种方法 Profile工具:
  • 总结

前言

时间过得很快,接触蜂巢移动版项目已经一年半了,期间项目进行过很多新功能开发,比如华为云会议,即时通讯等等。随着项目阶段的不同,也逐步进行过项目架构调整和优化,主要保证App性能,并逐渐向主流App靠拢。比如进行 项目基础架构重构 ,引入懒加载 ,统一、整合、优化图片加载框架和网络框架,迁移到AndroidX, 进程保活,部分业务逻辑代码结构、实现方式调整优化,资源优化等。
这一年半见证了蜂巢App快速发展, 从最初的20+M急剧增长到目前的60+M,业务越来越复杂,app体积也越来越大,性能问题也随之而来。比如启动性能,今天就简单记录一下优化过程。


一、启动性能

今天只说冷启动,因为这个是最耗时的。今天所说的冷启动过程是指从用户点击app图标到进入主页完全展示出来这段时间。基础知识大家可以自行查阅,本文重点在实践过程。
提前透露一下优化成果,启动时间减少了2S左右。

二、优化方法步骤

1.查看目前启动时间

因为我们这次关注的过程是 创建进程 + Application初始化+ 闪屏页Welcome初始化到界面显示的过程+主页MainActivity初始化到界面显示的过程+主页fragment显示完毕的过程,所以采用了Android Studio中 Profile 工具进行一个粗略的启动时间计算。为了方便,选取的截止时间点是ViewPager的onLayout()回调时刻。如下图,没有优化前的截图:

红框中的 00:07.170 就是这次的启动时间。好了,我们开工吧。

2.梳理耗时任务

Profile 可以清楚的看到每个过程的每个任务的CPU耗时,也就是执行耗时。不熟悉这个工具的同学可以自行查阅资料。 通过分析,找到了耗时点,然后根据业务需要,确定相应的优化策略。比如哪些可以异步,哪些可以延迟,甚至哪些可以移除,哪些需要优化等。经过分析,按照启动顺序进行优化。

Application:

由于项目引入的三方库比较多,三方库各种初始化逻辑不可控,有的时候会发现Application OnCreate() 执行多次,根据重要紧急程度区分异步策略,以及删除一些无用逻辑等,最终如下:

 @Overridepublic void onCreate() {super.onCreate();if (Apputil.isMainProcess(this)) {// Debug.startMethodTracing();context = getApplicationContext();initMyAsync();initsaveinfo();initdatabase();initfontsize();initNetworkCallback();KLog.init(BuildConfig.LOG_DEBUG);getAppBackground(); // 判断前后台切换HuaweiCloudUtil.getInstance().registerHuawei(Myapplication.this);ThreadPoolUtil.execute(new Runnable() {@Overridepublic void run() {HuaweiCloudUtil.getInstance().initHuawei(Myapplication.this, BuildConfig.APPLICATION_ID);initMulti();// 初始化数据库SQLiteHelper.copyDatabaseFile(context);// 初始化定位getBdLocationHelper();// 初始化App目录initAppDir();initAppDirsecond();// 初始化图片加载 缓存initLruCache();// 监听屏幕截图// ListeningScreenshots();int launchCount = PreferenceUtils.getInt(context, Constants.APP_LAUNCH_COUNT, 0);// 记录app启动的次数PreferenceUtils.putInt(context, Constants.APP_LAUNCH_COUNT, ++launchCount);initMap();initLanguage();disableAPIDialog();disableWatchdog();//集成博睿监控,测试环境不监控if (ConsValues.URL.indexOf("https://m.95538.cn") > -1) {Bonree.withApplicationToken("8b742681-787b-421f-828e-897016fcefb1").withConfigUrl("https://monitor.95538.cn/config/").start(context);}//个推消息推送PushManager.getInstance().initialize(context, GetuiPushService.class);PushManager.getInstance().registerPushIntentService(context, GetuiIntentService.class);//非wifi情况下,主动下载x5内核QbSdk.setDownloadWithoutWifi(true);//设置开启优化方案,在调用TBS初始化、创建WebView之前进行如下配置HashMap map = new HashMap();map.put(TbsCoreSettings.TBS_SETTINGS_USE_SPEEDY_CLASSLOADER, true);map.put(TbsCoreSettings.TBS_SETTINGS_USE_DEXLOADER_SERVICE, true);QbSdk.initTbsSettings(map);//x5内核初始化接口QbSdk.initX5Environment(getApplicationContext(), null);}});INSTANCE = this;// 在7.0的设备上,开启该模式访问相机或裁剪居然不会抛出FileUriExposedException异常,记录一下// StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder().detectAll().penaltyLog().build());// StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder().detectAll().penaltyLog().build());}}

闪屏页Welcome:

闪屏页中主要任务:

  1. 网络获取闪屏页图片并展示
  2. 闪屏页展示完毕后自动登录(蜂巢自动登录以及即时通讯自动登录)

由于自动登录过程比较耗时,牵扯到多个异步接口回调以及数据读写,还是比较耗时的。之前采用的是 串行方式,逻辑简单;
此次改造成了并行方式,两个接口同时发起,通过EVENTBUS 发送消息进行接口协调控制,以最短的时间完成闪屏页的使命。同时,接口中一些数据存储采用异步方式。

主页MainActivity:

MainActivity中部分任务进行了延迟初始化,部分方法进行了异步方式。主要目的是为了给ViewPager+Fragment 初始化让路。

首页IndexFragment:

这块是修改最多的地方,可以说基本重写了。同时也是最费时费力的地方,因为这块业务逻辑比较复杂。主要目的是减少过度绘制耗时,主要修改的地方如下:

  1. 布局结构优化,大大减少了布局层级和复杂度,同时减少了view的个数
  2. header头实现方式重写
  3. 常用应用实现方式重写
  4. 消息角标数量实现方式重写
  5. 不紧急的任务进行延迟初始化,延迟缓存更新,异步方法执行等

同时采用了Android Studio自带的Inspect工具检查,可以发现一部分问题并进行整改,比如下图:

由于其他方面等限制,此次启动优化就告一段落。

检验优化效果:

第一种方法 adb 命令:

首先采用adb shell am start -S -W packagename/packagename.XXActivity 方式对比。 我分别测量了启动闪屏页Welcome和主页MainActivity时间,经过多次测量取平均值。

优化前

页面 平均时间(单位ms)
闪屏页Welcome 2911
主页MainActivity 3898

优化后

页面 平均时间(单位ms)
闪屏页Welcome 2083
主页MainActivity 3171

总共优化时间=2911-2083+3898-3171 =1555ms
这个时间仅仅是个大概时间,并不准确,也只是为了介绍一个粗略方法。

第二种方法 Profile工具:

刚开始的时候我们说了,计算启动时间选取的截止时间点是ViewPager的onLayout()回调时刻。这次我们再次对优化后的版本进行计算。

红框时间是00:05.153
总共优化时间=7.170-5.153 =2.017s

注意: 这里的7.170s 5.153s 并不是真实的应用启动时间,因为Profile进行调试的时候需要进行很多工作,而且这个是Debug版本,本身就会启动慢。真正的Release版本是经过字节对齐等优化的,启动时间要小于这些时间。但是两者的时间差值是准确的


总结

此次的启动优化取得了一定的成效,Release版本速度明显比之前有所改善,接近2s。随着业务增加以及app体积的不断增加,保持良好的性能是一个艰巨的任务,加油,打工人!

蜂巢APP启动优化实践相关推荐

  1. Android篇 | 爱奇艺App启动优化实践分享

    导读 性能优化一直都是各个APP推进中的重点.难点,爱奇艺 App也不例外.在此之前,爱奇艺App Android 版的启动速度虽然一直处于同类App领先的水平,但优势距离其他同类的APP距离一直很小 ...

  2. Android 系统性能优化(72)-----App启动优化

    App启动优化的一篇深度好文 原文地址: http://www.jianshu.com/p/c056e63dc7a2 正文 对于Android平台上的线程优先级设置来说可以处理很多并发线程的阻塞问题, ...

  3. Android性能优化(一):APP启动优化

    Android性能优化(一):APP启动优化 性能优化系列文章: Android性能优化(一):APP启动优化 Android性能优化(二):UI布局优化 Android性能优化(三):响应优化 An ...

  4. App启动优化-一顿操作猛如虎

    前言 ++一个应用App的启动速度能够影响用户的首次体验,用户希望应用能够及时响应并快速加载.启动时间过长的应用不能满足这个期望,并且可能会令用户失望.这种糟糕的体验可能会导致用户在应用商店针对您的应 ...

  5. App性能优化(布局优化,线程优化,app瘦身优化,页面切换优化,App启动优化,内存优化)

    Android APP性能优化(最新总结) 在目前Android开发中,UI布局可以说是每个App使用频率很高的,随着UI越来越多,布局的重复性.复杂度也随之增长,这样使得UI布局的优化,显得至关重要 ...

  6. [纸上谈兵 1]——App启动优化

    0 纸上谈兵--App启动优化 纸上谈兵系列是我在学习App性能优化的笔记,纸上谈兵这个名字就很好的反应了这次只是启动优化的学习,并没有真正用到实际App的开发过程中(以后专门的同时处理),闲话少说, ...

  7. Android App启动优化

    一:启动优化 1. 启动状态 应用有三种启动状态,冷启动.温启动与热启动:每种启动状态都会影响该应用向用户显示所需的时间. 在冷启动中,应用从头开始启动. 在另外两种状态中,系统需要将后台运行的应用带 ...

  8. iOS App 启动优化

    简介: 作为程序猿来说,"性能优化"是我们都很熟悉的词,也是我们需要不断努⼒以及持续进⾏的事情:其实优化是⼀个很⼤的课题,因为细分来说的话有⼤⼤⼩⼩⼗⼏种优化⽅向 ,但是切忌在实际 ...

  9. Android性能优化-App启动优化

    原文地址:https://developer.android.com/topic/performance/launch-time.html#common 通常用户期望app响应和加载速度越快越好.一个 ...

  10. 王学岗性能优化————APP启动优化(黑白屏问题的解决,trace工具的使用,热启动与冷启动的区别)

    一:手机启动 这个时候会启动HomeActivity;而各种APP图标就是HomeActivity中的控件,这些控件是可以点击的.与之对应的是,Launcher(继承了Activity)中有onCli ...

最新文章

  1. plsql command window 执行批量脚本
  2. html overflow隐藏滚动条,css 之内容溢出滚动,隐藏滚动条
  3. 10 windows 启动虚拟机报错_Windows 系统如何安装 Docker
  4. mysql 5.7.12 修改密码
  5. 88是python语言的整数类型_Python基础数据类型题
  6. 隐私泄漏在线检测源码
  7. 关于std::set的一些补充
  8. U-Boot源码之串口驱动
  9. Spark代码2之Transformation:union,distinct,join
  10. java就业感言_JAVA就业班感言
  11. 计算两条线或多边形的交点(LineString | MultiLineString | Polygon )
  12. RFID固定资产盘点的解决方案
  13. JOL:查看Java 对象布局、大小工具
  14. 嵌入式静态显示与动态显示
  15. 个人介绍及未来学习规划
  16. cocos2d带冷却的菜单按钮封装
  17. 解决Linux7 ping出现 未知的名称或服务 错误
  18. 问卷调查工具专业排行榜
  19. 如何关闭大疆gps_如何使用djisdkforwindows从mavic 2获取gps数据?
  20. python(4月3日)

热门文章

  1. 一文看清Libra全景(超长22000字,慎点)
  2. 收藏 | 史上最详细的 Landsat 1-9 系列数据集介绍~
  3. Landsat系列卫星数据应用介绍
  4. 自定义android tv播放器,具有可自定义实时广播源的Android TV手机播放器
  5. 王铎《草书唐人诗九首》
  6. 苹果笔记本linux系统安装教程视频教程,苹果系统安装教程,小编教你苹果电脑怎么重装系统...
  7. 怎样在excel表格中画斜线并打字_你会用Excel做 表头 吗?
  8. linux装中文字库,对linux安装中文字体库
  9. 基于多进程架构的嵌入式软件框架研究与实现
  10. 幼儿园语言活动包括哪几类_幼儿园语言教学活动提问的类型及优化设计