在重(万)要(恶)且漫长的性能优化道路上,启动优化我们最重要的第一步。作为用户交互最频繁的启动页面,如果总是白屏、闪屏、加载漫长,那么用户根本无心继续探索,更有甚者可能就直接把App卸载了,我们开发的各种精美功能也就无法与用户见面了(8s定律了解一下)。

卸载率奇高的App基本都是踩了这个坑_android


所谓的启动优化,基本都是针对冷启动阶段,一般都是从两个方面着手处理。

启动主题优化

启动主题优化-所谓的主题优化,就是应用程序在冷启动的时候(1~2阶段),设置启动窗口的主题。因为现在 App 应用启动都会先进入一个闪屏页来展示应用信息。一般大家会通过透明主题优化、设置闪屏图片主题等方式来进行优化。其实这种方式并没有真正的加速应用进程的启动速度,只是通过用户视觉效果带来的优化体验,治标不治本

代码优化

想要从根本上进行启动优化,我们还是要通过代码来解决问题。首先可以统计下程序冷启动的时间。一般我们可以通过adb 命令统计,还有就是系统日志统计。启动时间统计好之后,就是对Application 优化

Application 作为应用程序的整个初始化配置入口,时常担负着它不应该有的负担。有很多第三方组件(包括App应用本身)都在 Application 中抢占先机,完成初始化操作。但是在 Application 中完成繁重的初始化操作和复杂的逻辑就会影响到应用的启动性能。

所以对于Application来说,采用异步或者延迟的方式进行加载是我们最常用的手段

异步优化虽然逻辑上并不难,但实际操作过程中,还是会踩到很多坑

  • 代码不优雅:例如使用线程池实现多个并行异步任务时会有多个executorService.submit代码块
  • 场景不好处理:各个初始化任务之间存在依赖关系,例如推送sdk的初始化任务需要依赖于获取设备id的初始化任务。此外,有些任务是需要在某些特定的时候就初始化完成,例如需要在Application的onCreate方法执行完之前就初始化完成
  • 维护成本高
  • 不符合异步要求
  • ……

如何真正掌握启动优化

常用的启动优化手段虽然我们都有了解,但如果在面试中,只能用设置窗口背景,或同时采用异步或延迟的方式来回答启动优化问题,估计面试官肯定会让你回家。

在实际开发过程中,绝大多数的应用在启动过程中会包含很多基础 SDK,SDK 的初始化有着一定的先后顺序,业务 SDK 又是围绕着多个基础 SDK 建立的。那么如何保证这些 SDK 在正确的阶段按照正确的依赖顺序、高效地初始化?怎么合理调度任务,才不至于让系统负载过高?如何最大化利用设备的性能,承接越来越多的业务?异步加载中线程的管理如何完成线程的同步异步?

为了帮助大家更好地掌握启动优化以及性能优化的关键核心,在这里给大家分享一份腾讯大佬历时三个月整理出来的《Android性能优化-大厂实战全解析》,我们可以看下已经在大厂中的开发者,对于性能优化有着怎样的心得

目录

卸载率奇高的App基本都是踩了这个坑_App_02

注:文章收集来源于各个大厂对外分享,按照各个大厂团队进行聚合,该文档仅用于学习使用。

腾讯团队

  • 腾讯光影研究室—Android P之Smart Linkify
  • 腾讯Bugly—动态下发 so 库在 Android APK 安装包瘦身方面的应用
  • QQ音乐—彻底弄懂浏览器缓存策略
  • QQ音乐Android编译提速之路
  • 全民k歌适配arm64-v8a方案
  • 全民K歌内存篇1——线上监控与综合治理
  • 全民K歌内存篇2——虚拟内存浅析
  • 全民K歌内存篇3——native内存分析与监控
  • 腾讯Bugly—对字符串匹配算法的一点理解
  • 卸载率奇高的App基本都是踩了这个坑_Android_03

字节团队

  • 字节跳动技术团队— 深入理解Gradle框架之一:Plugin,Extension, buildSrc
  • 字节跳动技术团队—深入理解gradle框架之二:依赖实现分析
  • 字节跳动技术团队—Scene:Android 开源页面导航和组合框架
  • 字节跳动技术团队—AwCookieManager.nativeGetCookiecrash 排查
  • 字节跳动技术团队—另类 BadTokenException 问题分析和解决
  • 字节跳动技术团队—抖音包大小优化-资源优化
  • 字节跳动技术团队—二维码扫描优化
  • 字节跳动—Android Camera内存问题剖析
  • 抖音BoostMultiDex优化实践:Android低版本上APP首次启动时间减少80%
  • 抖音BoostMultiDex优化实践:Android低版本上APP首次启动时间减少80%(二)
  • 抖音 Android 性能优化系列:Java 内存优化篇
  • 今日头条 Android ‘秒’ 级编译速度优化
  • 卸载率奇高的App基本都是踩了这个坑_App_04

阿里团队

  • 支付宝客户端架构解析:Android 客户端启动速度优化之「垃圾回收」
  • 支付宝 App 构建优化解析:通过安装包重排布优化 Android 端启动性能
  • 支付宝 App 构建优化解析:Android 包大小极致压缩
  • 解决支付宝包体积优化的遗留问题:运行时获取dexpc
  • 闲鱼技术—曾梦想 if-else 走天涯?看看“责任树模式”优化
  • 闲鱼如何在2个月内实现Android启动速度翻倍的?
  • 高德技术—Android Native 内存泄漏系统化解决方案
  • 天猫精灵技术—史上最全Android渲染机制讲解(长文源码深度剖析)
  • 卸载率奇高的App基本都是踩了这个坑_初始化_05

百度团队

  • 百度APP-Android H5首屏优化实践
  • 百度App技术—一种简单优雅的TextView行间距适配方案
  • 百度App技术—Android 10分区存储介绍及百度APP适配实践
  • 百度App技术—Gradle 与 Android 构建入门
  • 百度App组件化之路
  • 百度App网络深度优化系列《三》弱网优化

卸载率奇高的App基本都是踩了这个坑_Android_06

网易团队

  • 网易新闻客户端 H5 秒开优化
  • 网易新闻构建优化:如何让你的构建速度“势如闪电”
  • 网易传媒技术团队—AOP技术在客户端的应用与实践
  • 网易大数据|互联网产品决策秘笈: AB测试
  • 卸载率奇高的App基本都是踩了这个坑_android_07

美团团队

  • 美团技术团队—Android静态代码扫描效率优化与实践
  • 美团技术团队—Probe:Android线上OOM问题定位组件
  • 美团技术团队—移动端UI一致性解决方案
  • 美团—设计稿(UI视图)自动生成代码方案的探索
  • ……
  • ……

卸载率奇高的App基本都是踩了这个坑_android_08