Booster 是一款專門爲移動應用設計的易用、輕量級且可擴展的質量優化框架,其目標主要是爲了解決APP複雜度的提高而帶來的性能、穩定性、包體積等問題。Booster 主要由 Transformer 和 Task 組成,Transformer 主要用於對字節碼進行掃描或修改(取決於 Transformer 的功能),Task 主要用於構建過程當中的資源處理,爲了知足特異的優化需求,Booster 提供了 Transformer SPI and VariantProcessorSPI容許開發者進行定製,如下是 Booster 的總體框架: web
一、如何持續保證 APP 的質量?多線程
二、當 APP 崩潰後,如何快速定位問題所屬的業務線?app
三、能不能在上線以前提早發現潛在的質量問題?框架
四、能不能對 APP 進行無侵入的全局質量優化而不須要推進各個業務線?工具
動態加載模塊性能
爲了支持差別化的優化需求,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 版本等等。
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註解該類