移动APP质量优化框架 – Booster

移动APP质量优化框架 – Booster

移动APP质量优化框架 – Booster_第1张图片
简介

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

Booster 是专门为移动应用而设计的简单易用、轻量级、功能强大且可扩展的质量优化工具包,其通过动态发现和加载机制,提供了可扩展的能力。是一款移动应用的质量优化框架。

内置 Transformers

booster-transform-bugfix-toast:修复 7.0 中 Toast 导致的系统错误。

booster-transform-lint:检查潜在的性能问题。

booster-transform-shrink:用于清除 class 文件中的常量。

booster-transform-usage:用于扫描特定 API 的使用情况。

内置 Tasks

Booster-task-artifact:提供显示 artifact 的 Task。

Booster-task-dependency:提供显示所有依赖项的标识符以及文件路径的 Task。

Booster-task-permission:提供显示所有依赖项使用的 Android 权限。

Booster 的整体框架如下:
移动APP质量优化框架 – Booster_第2张图片
功能与特性
动态加载模块

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

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

性能检测

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

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

多线程优化

业务线众多的 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()
 }
}

资源压缩

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

Booster 提供了两种压缩方案:

pngquant 有损压缩(需要自行安装 pngquant 命令行工具)
cwebp 有损压缩(已内置)

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

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

为了解决 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'

然后通过执行 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

小结时刻

虽然现在 Booster 的优化功能还有限,但是看其发布的 Roadmap 中,已经提出接下来几个版本的迭代计划,例如会专注:性能优化、Lint、资源压缩、用户体验等等。在性能优化上,会对多线程的使用、SP 的使用、WebView 的预加载进行针对性的优化。

整体来看,Booster 是一个非常好的性能优化框架,它使用的都是成熟的技术,将其包装而成,降低了我们使用的难度。并没有什么太大的深坑,有需要可以进行尝试。

更多内容可以去 Github 上阅读 Wiki 和源码,有兴趣别忘点个 star。

Github:https://github.com/didi/booster
更多资讯,请关注微信公众号

你可能感兴趣的:(android课外知识)