booster總體解析

1、簡介

Booster 是一款專門爲移動應用設計的易用、輕量級且可擴展的質量優化框架,其目標主要是爲了解決APP複雜度的提高而帶來的性能、穩定性、包體積等問題。Booster 主要由 Transformer 和 Task 組成,Transformer 主要用於對字節碼進行掃描或修改(取決於 Transformer 的功能),Task 主要用於構建過程當中的資源處理,爲了知足特異的優化需求,Booster 提供了 Transformer SPI and VariantProcessorSPI容許開發者進行定製,如下是 Booster 的總體框架: web

開發中面臨的問題

一、如何持續保證 APP 的質量?多線程

二、當 APP 崩潰後,如何快速定位問題所屬的業務線?app

三、能不能在上線以前提早發現潛在的質量問題?框架

四、能不能對 APP 進行無侵入的全局質量優化而不須要推進各個業務線?工具

2、功能特性

動態加載模塊性能

爲了支持差別化的優化需求,Booster 實現了模塊的動態加載,以便於開發者能在不使用配置的狀況下選擇使用指定的模塊,詳見:booster-task-all、booster-transform-all。gradle

第三方注入模塊優化

Booster 在進行優化的過程當中,可能須要注入一些特定的類或者類庫,爲了解決注入類的依賴管理問題,Booster 提供了VariantProcessor SPI 讓開發者能夠輕鬆的擴展this

性能檢測插件

APP 的卡頓率是衡量應用運行時性能的一個重要指標,爲了能提早發現潛在的卡頓問題,Booster 經過靜態分析實現了性能檢測,並生成可視化的報告幫助開發者定位問題所在。 其實現原理是經過分析全部的 class 文件,構建一個全局的 Call Graph, 而後從 Call Graph中找出在主線程中調用的鏈路(Application、四大組件、View、Widget等相關的方法),而後再將這些鏈路以類爲單位分別輸出報告。 詳見:booster-transform-lint。

多線程優化

業務線衆多的 APP 廣泛存在線程過載的問題,而線程管理一直是開發者最頭疼的問題之一,雖然能夠經過制定嚴格的代碼規範來歸避此類問題發生,可是對於組織結構複雜的大廠來講,實施起來成本巨大,而對於第三方 SDK 來講,代碼規範則有些力不從心。爲了完全的解決這一問題,Booster 經過在編譯期間修改字節碼實現了全局線程池優化,並對線程進行重命名。

sharepreference優化

對於 Android 開發者來講,SharedPreferences幾乎無處不在,而在主線程中修改 SharedPreferences會致使卡頓甚至ANR,爲了完全的解決這一問題,Booster 對 APP 中的指令進行了全局的替換。 詳見:booster-transform-shared-preferences。

常量字段刪除

不管是資源索引,仍是其它常量字段,在編譯完成後,就沒有存在的價值了(反射除外),所以,Booster將對資源索引字段訪問的指令替換爲常量指令,將其它常量字段從類中刪除,一方面能夠提高運行時性能,另外一方面,還能減少包體積,資源索引(R)表面上看起來微不足道,實際上佔用很多空間,以滴滴車主爲例,資源索引相關的類就有上千個,進行常量字段刪除後,減少了1MB左右。 詳見:booster-transform-shrink。

Toast Bug修復

爲了完全解決在 Android 7.1 中存在的bug,Booster 對 APP 中的 Toast.show() 方法調用指令進行全局替換。 詳見:booster-transform-toast。

資源壓縮

APP 的包體積也是一個很是重要的指標,在APP安裝中,圖片資源佔了至關大的比例,一般狀況下,圖片質量下降10%-20%並不會影響視覺效果,所以,Booster 採用有損壓縮來下降圖片的大小,並且,圖像尺寸越小,加載速度越快,佔用內存越少。

Booster 提供了兩種壓縮方案:

pngquant 有損壓縮(須要自行安裝 pngquant 命令行工具)

cwebp 有損壓縮(已內置)

兩種方案各有優缺點,pngquant的方案不存在兼容性問題,可是壓縮率略遜於 WebP,而 WebP 存在系統版本兼容性問題,總的來看,有損壓縮的效果很是顯著,以滴滴車主爲例,APP 包體積減少了10 MB左右。

另外,像 Android SupportLibrary中包含有大量的圖片資源,並且支持多種屏幕尺寸,對於 APP而言,相同的圖片資源,保留最大尺寸的便可。以Android Support Library 爲例,去冗餘後,APP 包體積減少了1MB左右。 詳見:booster-task-compression。

webview預加載

爲了解決 WebView 初始化致使的卡頓問題,Booster 經過注入指令的方式,在主線程空閒時提早加載 WebView。 除上以上特性外,Booster還提供了一些輔助開發的功能,如:檢查依賴項中是否包含 SNAPSHOT 版本等等。

3、源碼解析

Booster以gradle插件形式實現,Transform,Task分別抽象爲Transformer ,VariantProcessor,支持Transformer SPI化 和VariantProcessor SPI化,供外部定製使用,插件實現代碼以下:

觀察源碼能夠了解到,不管是application仍是library都會註冊一個booster***Transform(),先來看下BoosterAppTransform()

它繼承於boosterTransform(),看下他的源碼:

代碼中isIncremental是判斷是不是增量更新仍是全量更新的,不管是全量仍是增量,都有調用onPreTransform(this)這個方法,咱們能夠看到這個方法是定義在BoosterTransformInvocation之中。

查看了下他的源碼,只有AsmTransfrom繼承了Transform,在這裏面進行spi化

能夠注意到這裏經過註解,註冊了asm這個transform。

這裏定製Transformer,能夠兩種方式:

1.自定義Transformer ,使用AutoService註解該類

2.自定義ClassTransformer,由AsmTransformer加載這些定製的Transformer,而後循環遞歸回調ClassTransformer的onPostTransform,使用AutoService註解該類

相關文章
相關標籤/搜索