Android應用內存分析與優化 - 工具篇之Booster

在原理篇中,我們發現在App內存的分布中,Code是占大頭的部分,所以我們可以從App體積方面想辦法,通過減小App體積達到降低內存的目的,同時,根據權威的機構分析,體積與用戶下載和留存有很大的聯系,總之體積減小有很大的好處,本篇研究了一下滴滴開源的Booster工具,減小包體積,優化App性能。

1. Booster簡介

1.1 是什么

Booster 是滴滴開源的一款專門為移動應用設計的易用、輕量級且可擴展的質量優化框架,其目標主要是為了解決隨著 APP 復雜度的提升而帶來的性能、穩定性、包體積等一系列質量問題。

Booster 提供了性能檢測、多線程優化、資源索引內聯、資源去冗余、資源壓縮、系統 Bug 修復等一系列功能模塊,可以使得穩定性能夠提升 15% ~ 25%,包體積可以減小 1MB ~ 10MB。

Booster 主要由 Transformer 和 Task 組成,Transformer 主要用于對字節碼進行掃描或修改(取決于 Transformer 的功能),Task 主要用于構建過程中的資源處理,為了滿足特異的優化需求,Booster 提供了 Transformer SPI and VariantProcessor SPI允許開發者進行定制,以下是 Booster 的整體框架:

1.2 能做什么?

  • 性能檢測:使用 Booster 可以發現潛在的性能問題,例如,在應用中調用可能阻塞 UI 線程或者主線程的 API,如,I/O API 等;

  • 性能優化:對于開發者來說,線程管理一直是個頭疼的問題,特別是第三方 SDK 中的線程,過多的線程可能會導致內存不足,然而幸運的是,這些問題都能通過 Booster 來解決;

  • 系統問題修復:例如全局性地修復 Android API 25 版本中 Toast 導致的崩潰;

  • 應用瘦身:如,資源壓縮及冗余資源刪除、資源索引內聯及常量刪除;

1.3 目前Booster內置的一些功能

  • 動態加載模塊支持差異化的優化需求,Booster 實現了模塊的動態加載,以便于開發者能在不使用配置的情況下選擇使用指定的模塊,詳見:booster-task-all、booster-transform-all,也可以定制task和transform,然后設置classpath。

  • 第三方類庫注入:支持動態添加依賴或者注入某些類和庫(比如插樁、無埋點統計等),詳見:booster-transform-lint。

  • 多線程優化:業務線眾多的 APP 普遍存在線程過載的問題,而線程管理一直是開發者最頭疼的問題之一,雖然可以通過制定嚴格的代碼規范來規避此類問題發生而對于第三方 SDK 來說,代碼規范則有些力不從心。為了徹底的解決這一問題,Booster 通過在編譯期間修改字節碼實現了全局線程池優化,并對線程進行重命名。詳見:booster-transform-thread。

  • SharedPreferences 優化:SharedPreferences幾乎無處不在,而在主線程中修改 SharedPreferences 會導致卡頓甚至 ANR,為了徹底的解決這一問題,Booster 對 APP 中的指令進行了全局的替換。詳見:booster-transform-shared-preferences。

  • 常量字段刪除:無論是資源索引,還是其它常量字段,在編譯完成后,就沒有存在的價值了(反射除外),因此,Booster 將對資源索引字段訪問的指令替換為常量指令,將其它常量字段從類中刪除,一方面可以提升運行時性能,另一方面,還能減小包體積,資源索引(R)表面上看起來微不足道,實際上占用不少空間。

  • 資源壓縮:APP 的包體積也是一個非常重要的指標,在 APP 安裝中,圖片資源占了相當大的比例,通常情況下,圖片質量降低 10%-20% 并不會影響視覺效果,因此,Booster 采用有損壓縮來降低圖片的大小,而且,圖像尺寸越小,加載速度越快,占用內存越少。Booster 提供了兩種壓縮方案:

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

    • cwebp 有損壓縮(已內置)

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

  • WebView 預加載:為了解決 WebView 初始化導致的卡頓問題,Booster 通過注入指令的方式,在主線程空閑時提前加載 WebView。

2. 引入使用Booster

2.1 地址

  1. 開源地址:https://github.com/didi/booster/tree/master

  2. 官方Doc:https://booster.johnsonlee.io/zh/guide/

2.2 引入

集成 Booster 的最佳方式是集成真正需要的模塊來解決項目中遇到的特定問題。

buildscript {ext.boosterVersion = '4.8.0'repositories {google()mavenCentral()// OPTIONAL If you want to use SNAPSHOT version, sonatype repository is required.maven { url 'https://oss.sonatype.org/content/repositories/public' }}dependencies {classpath "com.didiglobal.booster:booster-gradle-plugin:$boosterVersion" // ① booster基礎插件// ② 弄清楚真正需要的特性,選擇正確的模塊進行集成,下面的是我們的工程中目前引入的模塊classpath "com.didiglobal.booster:booster-task-compression-cwebp:$boosterVersion" // 采用 cwebp 對資源進行壓縮classpath "com.didiglobal.booster:booster-task-compression-processed-res:$boosterVersion" // ap_ 文件壓縮classpath "com.didiglobal.booster:booster-task-resource-deredundancy:$boosterVersion" // 去冗余資源classpath "com.didiglobal.booster:booster-transform-r-inline:$boosterVersion" // 資源索引內聯classpath "com.didiglobal.booster:booster-transform-thread:$boosterVersion"   // 性能優化解決線程過多問題classpath "com.didiglobal.booster:booster-transform-shared-preferences:$boosterVersion"   // SharedPreferences 優化,解決卡頓問題}
}allprojects {repositories {google()mavenCentral()// OPTIONAL If you want to use SNAPSHOT version, sonatype repository is required.maven { url 'https://oss.sonatype.org/content/repositories/public' }}
}// 在你的 application 工程的build.gradle中引入,如下:
apply plugin: 'com.android.application'
apply plugin: 'com.didiglobal.booster' // ③

2.3 確認是否啟用

然后在終端用如下命令來確認 Booster 是否啟用:

./gradlew assembleDebug --dry-run

2.4 版本選擇

2.4.1 官方文檔上說

由于 AGP 8 的不兼容性變更,AGP 7.x 及以下版本已經不再支持,如果你仍在使用 AGP 7.x,請使用 Booster 4.x

大部分基于 Task 的模塊在 Booster 5.0.0 中已經不再支持,但是基于 Transform 的模塊仍然支持且沒有破壞性變更。

詳情請參見 [從 Booster 4.x 遷移到 5.x](遷移到 v5.x | Booster

2.4.2 我們的選擇

我們使用booster主要是為了減小包體積,其中重要的一項是資源壓縮(booster-task-compression-cwebp),測試合適的版本,經過驗證,4.8.0版本是能支持的最高版本,再高的版本就會沒有我們需要的Task(booster-task-compression-cwebp)。

所以我們選擇了能編譯過去,并且有我們需要的Task的最高版本 4.8.0。

2.5 功能組件選擇

經過查找測試,決定使用以下6個插件進行優化:

  • booster-task-compression-cwebp(采用 cwebp 對資源進行壓縮)

  • booster-task-compression-processed-res(ap_ 文件壓縮)

  • booster-task-resource-deredundancy(去冗余資源)

  • booster-transform-r-inline(資源索引內聯)

  • booster-transform-thread(性能優化解決線程過多問題)

  • booster-transform-shared-preferences(SharedPreferences 優化,解決卡頓問題)

2.6 booster-task-compression-cwebp插件的參數配置

文檔說明如下:

Property

Description

Example

booster.task.compression.cwebp.quality

compression quality (the default is 80)

booster.task.compression.cwebp.ignores

ignore wildcards (separated by comma)

mipmap/ic_launcher*,drawable/ic_launcher*

經過實際測試發現

  1. booster.task.compression.cwebp.quality

    1. 發現不生效,查看代碼,應該設置為:booster.task.compression.cwebp.option.quality,驗證可用;

  2. booster.task.compression.cwebp.ignores

    1. 按文檔中寫的示例配置不生效;

    2. 經驗證,白名單需要遵循以下規則:

      1. 資源名(png圖片)后沒有點和擴展名,直接文件名結尾

      2. 資源名前應該還有其它字符,但測試未得到正確的結果,需要再研究,現階段可以使用通配符*

      3. 多個白名單資源以逗號分隔,逗號前后不能有空格

      4. 白名單不能以雙引號或單引號包裹

      5. 白名單太長折行時應以反斜杠續行,如下

      6. booster.task.compression.cwebp.ignores=*food_card_bg,*food_\pic_bg_noa,\*frame_fridge_520_36,\*frame_fridge_550_37,\*frame_fridge_777_36
    3. 編譯booster源碼,打印日志查看:使用帶日志的自己打出來的snapshot版的booster插件,看到Cwebp白名單過濾時,傳入的資源字符串的形式是“drawable/food_card_bg”,與之前驗證出來的pattern規則能對應上。

3. 總結

本文簡述了Booster的功能和其引入的方法,然后應用到我們的項目中發現的一些問題及解決方法,其它的暫未進行深入研究,后續可以引入更多的Task或Transform,也可以擴展我們自己的功能。

另外,研究Booster的過程中,發現字節也開源了一個類似的框架ByteX,后續也可以一起研究一下,取長補短,只要是對項目有用的可以逐步引入,沒有的功能也可以通過擴展實現。

4. 參考文獻

  • 開源地址

  • 官方Doc

  • 滴滴開源 Booster:移動APP質量優化框架

  • 滴滴Booster移動APP質量優化框架 學習之旅

  • Booster 移動 APP 質量優化框架

5.團隊介紹

三翼鳥數字化技術平臺-定制平臺開發」主要負責設計工具的研發,包括營銷設計工具、家電VR設計和展示、水電暖通前置設計能力,研發并沉淀素材庫,構建家居家裝素材庫,集成戶型庫、全品類產品庫、設計方案庫、生產工藝模型,打造基于戶型和風格的AI設計能力,快速生成算量和報價;同時研發了門店設計師中心和項目中心,包括設計師管理能力和項目經理管理能力。實現了場景全生命周期管理,同時為水,空氣,廚房等產業提供商機管理工具,從而實現了以場景貫穿的B端C端全流程系統。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/81292.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/81292.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/81292.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

金屬加工液展|切削液展|2025上海金屬加工液展覽會

2025上海金屬加工液展覽會 時間:2025年12月2-4日 地點:上海新國際博覽中心 2025上海金屬加工液展規劃30000平方米展覽規模,預設展位1200個,將為國內外加工液產業提供一個集“展示、合作、交易、發展”于一體的綜合性平臺&#…

React學習———Redux 、 React Redux和react-persist

Redux Redux是一個流行的JavaScript狀態管理庫,通常用于React等前端框架結合使用。Redux 的設計思想是讓應用的狀態變得可預測、可追蹤、易于調試和測試。 Redux的核心l理念 單一數據源:整個應用的狀態被存儲在一個唯一的Store對象中,所有…

Python字符串常用方法詳解

文章目錄 Python字符串常用方法詳解一、字符串大小寫轉換方法(常用)1. 基礎大小寫轉換2. 案例:驗證碼檢查(不區分大小寫) 二、字符串查找與替換方法1. 查找相關方法2. 替換相關方法 三、字符串判斷方法1. 內容判斷方法 四、字符串分割與連接方…

MyBatis—動態 SQL

MyBatis—動態 SQL 一、動態 SQL 的核心作用 動態 SQL 主要解決以下問題: 靈活性:根據不同的輸入參數生成不同的 SQL 語句(如條件查詢、批量操作)。 可維護性:減少重復代碼,通過標簽化邏輯提高 SQL 可讀…

Python機器學習筆記(二十五、算法鏈與管道)

對于許多機器學習算法,特定數據表示非常重要。首先對數據進行縮放,然后手動合并特征,再利用無監督機器學習來學習特征。因此,大多數機器學習應用不僅需要應用單個算法,而且還需要將許多不同的處理步驟和機器學習模型鏈接在一起。Pipeline類可以用來簡化構建變換和模型鏈的…

YOLOv3深度解析:多尺度特征融合與實時檢測的里程碑

一、YOLOv3的誕生:繼承與突破的起點 YOLOv3作為YOLO系列的第三代算法,于2018年由Joseph Redmon等人提出。它在YOLOv2的基礎上,針對小目標檢測精度低、多類別標簽預測受限等問題進行了系統性改進。通過引入多尺度特征圖檢測、殘差網絡架構和獨…

已解決(親測有效!):安裝部署Docker Deskpot之后啟動出現Docker Engine Stopped!

文章目錄 已解決:安裝部署Docker Deskpot之后啟動出現Docker Engine Stopped!個人環境介紹自己的解決問題思路(詳細過程附截圖)1.打開控制面板2.點擊程序和功能3.點擊啟動或關閉windows功能4.Hyper-V5.右鍵菜單欄的windows圖標點擊…

PCIE接收端檢測機制分析

PCIE接收端檢測機制分析 1、PCIE的接收端檢測機制 接收器檢測電路作為發射器的一部分實現,必須正確檢測是否存在與ZRX-DC參數(40Ω-60Ω)隱含的直流阻抗等效的負載阻抗。 接收器檢測序列的推薦行為如下: ?初始狀態?&#xff…

[模型部署] 3. 性能優化

👋 你好!這里有實用干貨與深度分享?? 若有幫助,歡迎:? 👍 點贊 | ? 收藏 | 💬 評論 | ? 關注 ,解鎖更多精彩!? 📁 收藏專欄即可第一時間獲取最新推送🔔…

InternVL3: 利用AI處理文本、圖像、視頻、OCR和數據分析

InternVL3推動了視覺-語言理解、推理和感知的邊界。 在其前身InternVL 2.5的基礎上,這個新版本引入了工具使用、GUI代理操作、3D視覺和工業圖像分析方面的突破性能力。 讓我們來分析一下是什么讓InternVL3成為游戲規則的改變者 — 以及今天你如何開始嘗試使用它。 InternVL…

鴻蒙 ArkUI - ArkTS 組件 官方 UI組件 合集

ArkUI 組件速查表 鴻蒙應用開發頁面上需要實現的 UI 功能組件如果在這 100 多個組件里都找不到,那就需要組合造輪子了 使用技巧:先判斷需要實現的組件大方向,比如“選擇”、“文本”、“信息”等,或者是某種形狀比如“塊”、“圖…

HTTP GET報文解讀

考慮當瀏覽器發送一個HTTP GET報文時,通過Wireshark 俘獲到下列ASCII字符串: GET /cs453/index.html HTTP/1.1 Host: gaia.cs.umass.edu User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.2) Gecko/20040804 Netscape/7.2 (ax) Acc…

【Linux網絡】數據鏈路層

數據鏈路層 用于兩個設備(同一種數據鏈路節點)之間進行傳遞。 認識以太網 “以太網” 不是一種具體的網絡,而是一種技術標準;既包含了數據鏈路層的內容,也包含了一些物理層的內容。例如:規定了網絡拓撲結…

【打破信息差】萌新認識與入門算法競賽

閱前須知 XCPC萌新互助進步群2??:174495261 博客主頁:resot (關注resot謝謝喵) 針對具體問題,應當進行具體分析;并無放之四海而皆準的方法可適用于所有人。本人尊重并支持每位學習者對最佳學習路徑的自主選擇。本篇所列訓練方…

logrotate按文件大小進行日志切割

? 編寫logrotate文件,進行自定義切割方式 adminip-127-0-0-1:/data/test$ cat /etc/logrotate.d/test /data/test/test.log {size 1024M #文件達到1G就切割rotate 100 #保留100個文件compressdelaycompressmissingoknotifemptycopytruncate #這個情況服務不用…

2025認證杯二階段C題完整論文講解+多模型對比

基于延遲估計與多模型預測的化工生產過程不合格事件預警方法研究 摘要 化工生產過程中,污染物濃度如SO?和H?S對生產過程的控制至關重要。本文旨在通過數據分析與模型預測,提出一種基于延遲估計與特征提取的多模型預測方法,優化閾值設置&a…

前端精度問題全解析:用“挖掘機”快速“填平精度坑”的完美解決方案

寫在前面 “為什么我的計算在 React Native 中總是出現奇怪的精度問題?” —— 這可能是許多開發者在作前端程序猿的朋友們都會遇到的第一個頭疼問題。本文將深入探討前端精度問題的根源,我將以RN為例,并提供一系列實用解決方案,讓你的應用告別計算誤差。 一、精度問題的…

2024 睿抗機器人開發者大賽CAIP-編程技能賽-本科組(國賽) 解題報告 | 珂學家

前言 題解 2024 睿抗機器人開發者大賽CAIP-編程技能賽-本科組(國賽)。 國賽比省賽難一些,做得汗流浹背,T_T. RC-u1 大家一起查作弊 分值: 15分 這題真的太有意思,看看描述 在今年的睿抗比賽上,有同學的提交代碼如下&#xff1…

hghac和hgproxy版本升級相關操作和注意事項

文章目錄 環境文檔用途詳細信息 環境 系統平臺:N/A 版本:4.5.6,4.5.7,4.5.8 文檔用途 本文檔用于高可用集群環境中hghac組件和hgproxy組件替換和升級操作 詳細信息 1.關閉服務 所有數據節點都執行 1、關閉hgproxy服務 [roothgdb01 tools]# system…

userfaultfd內核線程D狀態問題排查

問題現象 運維反應機器上出現了很多D狀態進程,也kill不掉,然后將現場保留下來進行排查。 排查過程 都是內核線程,先看下內核棧D在哪了,發現D在了userfaultfd的pagefault流程。 uffd知識補充 uffd探究 uffd在firecracker與e2b的架構下使…