本文作者:李景森,来自滴滴终端技术团队,专家工程师,主导设计了滴滴司乘两端APP整体架构及一系列基础核心组件,目前主要负责移动端技术架构及性能优化。

Booster Logo

项目地址:https://github.com/didi/booster

简介

Booster 是一款专门为移动应用设计的易用、轻量级且可扩展的质量优化框架,其目标主要是为了解决 APP 复杂度的提升而带来的性能、稳定性、包体积等问题。

本文给大家介绍下 Booster的功能和实现思路,算是一篇导读,希望能帮助到大家:

为什么是 Booster?

质量优化是所有应用开发者都要面临的问题,对于 DAU 千万级的 APP 来说,万分之一的崩溃率就意味着上千的用户受到影响,对于长时间在线的司机来说,司机端 APP 的稳定性关乎着司机的安全和收入,所以更是不容小觑。

随着业务的快速发展,业务复杂度不断提升,我们开始思考:

  1. 如何持续保证 APP 的质量?

  2. 当 APP 崩溃后,如何快速定位问题所属的业务线?

  3. 能不能在上线之前提前发现潜在的质量问题?

  4. 能不能对 APP 进行无侵入的全局质量优化而不需要推动各个业务线?

基于这些考虑,Booster 应运而生,经过一年多的时间不断打磨,Booster 成绩斐然。由于目前在质量优化方面基于静态分析的开源项目屈指可数,加上质量优化对于 APP 开发者而言门槛偏高,因此,我们选择了将 Booster 开源,希望更多的开发者和用户能从中受益。

功能与特性

动态加载模块

为了支持差异化的优化需求,Booster  实现了模块的动态加载,以便于开发者能在不使用配置的情况下选择使用指定的模块,详见:booster-task-all、booster-transform-all。

第三方类库注入

Booster 在进行优化的过程中,可能需要注入一些特定的类或者类库,为了解决注入类的依赖管理问题,Booster 提供了VariantProcessor SPI 让开发者可以轻松的扩展,请参考:ThreadVariantProcessor.kt#L12

性能检测

APP 的卡顿率是衡量应用运行时性能的一个重要指标,为了能提前发现潜在的卡顿问题,Booster 通过静态分析实现了性能检测,并生成可视化的报告帮助开发者定位问题所在,如下图所示:

com.didiglobal.booster.demo.MainActivity

其实现原理是通过分析所有的 class 文件,构建一个全局的 Call Graph, 然后从 Call Graph 中找出在主线程中调用的链路(Application、四大组件、ViewWidget等相关的方法),然后再将这些链路以类为单位分别输出报告。

详见:booster-transform-lint。

多线程优化

业务线众多的 APP 普遍存在线程过载的问题,而线程管理一直是开发者最头疼的问题之一,虽然可以通过制定严格的代码规范来归避此类问题发生,但是对于组织结构复杂的大厂来说,实施起来成本巨大,而对于第三方 SDK 来说,代码规范则有些力不从心。为了彻底的解决这一问题,Booster 通过在编译期间修改字节码实现了全局线程池优化,并对线程进行重命名。

以下是示例代码:

class MainActivity : AppCompatActivity() {    override fun onCreate(savedInstanceState: Bundle?) {        super.onCreate(savedInstanceState)        setContentView(R.layout.activity_main)        getSharedPreferences("demo", MODE_PRIVATE).edit().commit()    }    override fun onStart() {        super.onStart()        Thread({            while (true) {                Thread.sleep(5)            }        }, "#Booster").start()    }    override fun onResume() {        super.onResume()        HandlerThread("Booster").start()    }}    override fun onCreate(savedInstanceState: Bundle?) {        super.onCreate(savedInstanceState)        setContentView(R.layout.activity_main)        getSharedPreferences("demo", MODE_PRIVATE).edit().commit()    }

    override fun onStart() {        super.onStart()        Thread({            while (true) {                Thread.sleep(5)            }        }, "#Booster").start()    }

    override fun onResume() {        super.onResume()        HandlerThread("Booster").start()    }}

线程重命名效果如下图所示:

Thread Renaming

详见:booster-transform-thread。

SharedPreferences 优化

对于 Android 开发者来说,SharedPreferences 几乎无处不在,而在主线程中修改 SharedPreferences 会导致卡顿甚至 ANR,为了彻底的解决这一问题,Booster 对 APP 中的指令进行了全局的替换。

详见:booster-transform-shared-preferences。

常量字段删除

无论是资源索引,还是其它常量字段,在编译完成后,就没有存在的价值了(反射除外),因此,Booster 将对资源索引字段访问的指令替换为常量指令,将其它常量字段从类中删除,一方面可以提升运行时性能,另一方面,还能减小包体积,资源索引(R)表面上看起来微不足道,实际上占用不少空间,以滴滴车主为例,资源索引相关的类就有上千个,进行常量字段删除后,减小了1MB左右。

详见:booster-transform-shrink。

Toast Bug 修复

为了彻底解决在 Android 7.1 中存在的bug: 30150688,Booster 对 APP 中的 Toast.show() 方法调用指令进行全局替换。

详见:booster-transform-toast。

资源压缩

APP 的包体积也是一个非常重要的指标,在 APP 安装中,图片资源占了相当大的比例,通常情况下,图片质量降低 10%-20% 并不会影响视觉效果,因此,Booster 采用有损压缩来降低图片的大小,而且,图像尺寸越小,加载速度越快,占用内存越少。

Booster 提供了两种压缩方案:

  1. pngquant 有损压缩(需要自行安装 pngquant 命令行工具)

  2. cwebp 有损压缩(已内置)

两种方案各有优缺点,pngquant 的方案不存在兼容性问题,但是压缩率略逊于 WebP,而 WebP 存在系统版本兼容性问题,总的来看,有损压缩的效果非常显著,以滴滴车主为例,APP 包体积减小了10 MB左右。

另外,像 Android Support Library 中包含有大量的图片资源,而且支持多种屏幕尺寸,对于 APP 而言,相同的图片资源,保留最大尺寸的即可。以 Android Support Library 为例,去冗余后,APP 包体积减小了1MB左右。

详见:booster-task-compression。

WebView 预加载

为了解决 WebView  初始化导致的卡顿问题,Booster 通过注入指令的方式,在主线程空闲时提前加载 WebView

除上以上特性外,Booster 还提供了一些辅助开发的功能,如:检查依赖项中是否包含 SNAPSHOT 版本等等。

快速入门

buildscript 的 classpath 中引入 Booster 插件,然后启用该插件:

buildscript {    ext.booster_version = '0.4.3'    repositories {        google()        mavenCentral()        jcenter()    }    dependencies {        classpath "com.didiglobal.booster:booster-gradle-plugin:$booster_version"        classpath "com.didiglobal.booster:booster-task-all:$booster_version"        classpath "com.didiglobal.booster:booster-transform-all:$booster_version"    }}apply plugin: 'com.android.application'apply plugin: 'com.didiglobal.booster'    repositories {        google()        mavenCentral()        jcenter()    }    dependencies {        classpath "com.didiglobal.booster:booster-gradle-plugin:$booster_version"        classpath "com.didiglobal.booster:booster-task-all:$booster_version"        classpath "com.didiglobal.booster:booster-transform-all:$booster_version"    }}

apply plugin: 'com.android.application'apply plugin: 'com.didiglobal.booster'

然后通过执行 assemble task 来构建一个优化过的应用包:

$ ./gradlew assembleRelease

构建完成后,在 build/reports/ 目录下会生成相应的报告:

build/reports/├── booster-task-compression│   └── release│       └── report.txt├── booster-transform-lint│   └── release│       ├── com│       └── org├── booster-transform-shared-preferences│   └── release│       └── report.txt├── booster-transform-shrink│   └── release│       └── report.txt├── booster-transform-thread│   └── release│       └── report.txt└── booster-transform-toast    └── release        └── report.txt│   └── release│       └── report.txt├── booster-transform-lint│   └── release│       ├── com│       └── org├── booster-transform-shared-preferences│   └── release│       └── report.txt├── booster-transform-shrink│   └── release│       └── report.txt├── booster-transform-thread│   └── release│       └── report.txt└── booster-transform-toast    └── release        └── report.txt


推荐阅读
告诉你们一个好消息,速来!
是时候更新Android Studio 3.5了!

编程·思维·职场
欢迎扫码关注

在看也是一种认可

滴滴开源 Booster:移动APP质量优化框架相关推荐

  1. 滴滴Booster移动APP质量优化框架 学习之旅 二

    推荐阅读: 滴滴Booster移动App质量优化框架-学习之旅 一 Android 模块Api化演练 不一样视角的Glide剖析(一) 续写滴滴Booster移动APP质量优化框架学习之旅,上篇文章分 ...

  2. 滴滴Booster移动APP质量优化框架 学习之旅 三

    推荐阅读: 滴滴Booster移动App质量优化框架-学习之旅 一 Android 模块Api化演练 不一样视角的Glide剖析(一) 滴滴Booster移动App质量优化框架-学习之旅 二对重复资源 ...

  3. 滴滴 App 质量优化黑科技,都做了什么

    点击上方"开发者技术前线",选择"星标" 每天 14.00 在看 | 真爱 作者: 承香墨影 | 来源:公众号 承香墨影 一. 序 当 App 达到一定体量的时 ...

  4. 滴滴开源在2019:十大重点项目盘点,DoKit客户端研发助手首破1万Star

    整理 | Jane 出品 | AI科技大本营(ID:rgznai100) 2018 年,科技企业纷纷布局开源战略后迎来的第一个"丰收年".但对滴滴来说,2019 年才迎来其第一波开 ...

  5. 滴滴开源了哪些有意思的项目?

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 作者 | 滴滴技术   出品 | 滴滴技术 作为卓越的一站式移动出 ...

  6. 滴滴开源3周年,都发布过哪些项目?

    桔妹导读:自2017年6月,滴滴发布了首个开源项目VirtualAPK开始,三年耕耘,不忘初心,滴滴已对外发布了40+个开源项目,涵盖人工智能.研发测试.前端.系统工具.大数据.运维监控等领域,一起来 ...

  7. 滴滴开源的项目比腾讯还多?一起来看看滴滴开源的项目!

    你知道的越多,不知道的就越多,业余的像一棵小草! 你来,我们一起精进!你不来,我和你的竞争对手一起精进! 编辑:业余草 来源:https://www.xttblog.com/?p=5112 在中国,B ...

  8. 滴滴开源Android插件框架

     登录 | 注册 收藏成功 确定 收藏失败,请重新收藏 确定 查看所有私信查看所有通知 暂没有新通知 返回通知列表 下一条 上一条 分享资讯传PPT/文档提问题写博客传资源创建项目创建代码片 wz ...

  9. 良心博客滴滴开源框架VirtualAPK插件化介绍加教程加DEMO加投入项目

    公司要实现一个这样的效果,类似于qq游戏大厅,我们可以下载斗地主,可以下载保皇,下载完成直接就可以玩,不需要安装,也就是说我们的这一款软件里面可以装载多款软件. 公司项目是一套系统管理软件,它里面包括 ...

  10. 差分进化算法_想用遗传算法?来看看这些已为你做好的开源优化框架

    首发于公众号"一颗螺丝丁",欢迎关注! 优化无处不在,无论你是不是从事优化研究,你都或多或少地面临研究模型优化问题.解决优化问题的算法被统称为优化算法,但优化算法的类型是非常多的. ...

最新文章

  1. 报名 | 最后一次线下免费编程课程开启,全球最大免费编程社区!(附往期学习资源)...
  2. python全栈开发基础【第二十三篇】线程
  3. 工业交换机单纤或双纤都只是占用一个端口吗?
  4. 火眼睛睛查coredump(stl sort)------永远让比较函数对相同元素返回false
  5. 又崩了?苹果发生大规模网络故障:多项服务受影响 目前已恢复
  6. 手机访问www如何自动跳转到m js代码实现
  7. centos安装后连不上网
  8. 单片机——软件部分开发过程介绍
  9. Office 2010下载安装
  10. 点击按钮复制指定代码
  11. Unity动态加载资源
  12. Python基础综合训练三(tkinter牛刀小试)
  13. Windows修改注册表实现开机自启动
  14. EasyNVR查看直播视频流显示黑屏原因排查
  15. redis:Unable to connect to localhost:6379
  16. 2018年2月Ivanti英万齐(前LANDESK蓝代斯克)关闭中国研发中心
  17. 帅哥陈 Hololens开发笔记(1)
  18. 2020年数据标注行业回顾及2021年展望
  19. Win7下SQLite安装配置与使用方法详解
  20. 贪心:Fence Repair、Saruman's Army

热门文章

  1. 使用PCA可视化数据
  2. java回顾:MyBatis开发、配置、标签、封装会话工具
  3. spring静态资源配置
  4. roslaunch的.launch文件的标签总结
  5. deepmind dnc 相关的软件下载资源
  6. 怎么把图片转换成pdf格式?图片转PDF方法
  7. C# 判断是否是节假日
  8. 使用亚马逊云快速托管静态网站
  9. 论文笔记 | A Tale of Two Headers: A Formal Analysis ofInconsistent Click-Jacking Protection on the Web
  10. linux添加菜单栏,Gnome desktop主菜单中添加自己的菜单栏