今天突然发现项目里有个"正在初始化"的破玩意儿卡得跟老牛拉破车似的,搞得用户都在群里骂街了。气得我撸起袖子直接开干,顺手把折腾过程记下来了。
第一刀:先揪出拖后腿的龟孙子
抄起Android Studio的Profiler对着初始化过程怼了十分钟。好家伙,有个第三方SDK初始化居然偷偷吃了整整三秒!查了文档才发现这货默认加载了用不着的功能模块,赶紧在初始化代码里咔咔两刀把没用的参数砍了:
- 原代码: *(context, ALL)
- 改代码: *(context, BASIC_MODE)
完事儿再跑,这龟孙子立马缩到800毫秒了
第二招:堵住重复初始化的漏勺
晚上洗脚时候突然想到,用户狂点按钮会不会触发多次初始化?第二天蹲马桶时翻代码验证,果然有个按钮回调里裸调初始化方法!赶紧拿boolean isInit当门神把着:
- if (!isInit) {
- doHeavyInit();
- isInit = true;
顺手在Application类加了全局初始化状态标记,省得其他页面手贱
第三板斧:把串行任务拆了炖
拿Traceview看调用栈发现六个初始化任务排着长队,前边的拉屎后边的干瞪眼。直接把不相关的三个扔进线程池:
- ExecutorService pool = *();
- *( ()->{ initBannerAd(); });
- *( ()->{ initPushService(); });
主线程压力顿时少一半,进度条肉眼可见变顺畅
第四式:给用户喂定心丸
想起来上次自己等电梯时盯着数字跳动就不焦虑了,于是火速在初始化前塞了个进度条:
- ProgressBar mBar = findViewById(...);
- *(INIT_STEPS);
- 每完成个任务就 *(1);
还配了文字提示“正在加载核心武器...”,用户反馈说终于不觉得卡死了
绝招:给日志上缰绳
发现Release包初始化还是慢半拍,排查发现是日志工具在疯狂写文件。直接祭出大法:
- if (*) {
- Log.d("INIT","输出调试信息");
正式包瞬间清净,顺带把过度输出的第三方库日志级别调成WARNING
折腾完这五板斧再测,初始化时间从7秒缩到2.3秒。用户群里嚷嚷卡顿的消息终于消停了,今晚能摸鱼刷会儿小视频咯!