技術|Android安裝包優化


版權聲明

1.本文版權歸原作者所有,轉載需注明作者信息及原文出處。

2.本文作者:趙裕(vimerzhao),永久鏈接:https://github.com/vimerzhao/vimerzhao.github.io/blob/master/android/2020-02-11-apk-size-opt.md

3.作者公眾號:V大師在一號線 。聯系郵箱:vimerzhao@foxmail.com


背景

安裝包膨脹的原因

業務的增加、產品的演進是安裝包大小增加的本質原因。但是在演進之路上,由於一些所謂的技術債務,如:

  • 使用的資源未經裁剪(如全量字體文件、分辨率過大的圖片)
  • 不合理的大資源(如大的視頻、音頻可以在線拉取)
  • 已下線業務沒有及時清理相關代碼、資源
  • 等等

正是由於這些疏忽,安裝包有了不必要的增加,這也是我們需要優化的部分。

安裝包優化的價值

可能有的人覺得,現在基本是4G、WiFi的網絡環境,手機設備的性能和存儲空間也非常充足,所以用戶對安裝包大小應該不是十分敏感。但是,這其實是一種錯覺,更多的時候應該看自己的目標市場,如果是一二線城市當然沒問題,但如果是三四線城市、農村等下沉市場或者印度、巴西等海外市場,上述假設顯然不成立了。

一般來說,安裝包大小會影響以下指標:

  • 下載轉化率
  • 安裝成功率
  • 推廣成本
  • 運行內存、空間占用

綜上,對於一個“有余力”的團隊,安裝包大小的優化還是很有必要的。

安裝包優化的套路

由前面的原因可知,從業務層面來看,安裝包大小的優化是“解鈴還須系鈴人”,即:

  • 壓縮資源
  • 大資源轉成在線拉取
  • 排查無用業務並下線

這些方法都比較常規,更像是對症下葯,下面梳理一些技術上普適的方法,獨立於業務,在上面那些方法都嘗試后,還可以使安裝包大小“更下一層樓”。

安裝包的主要構成就是代碼和資源,所以優化也是從這兩個方面着手。

代碼

混淆

一般是通過ProGuard,但很多用不好,且存在管理問題。最后一看項目,很多類被Keep住了,也不知道歷史背景是啥。

Dex優化

  1. 通過工具移除行號信息,帶來的問題是無法回溯Crash位置,但可以解決
  2. 多Dex時,通過重排Dex避免交叉索引,實現起來比較復雜
  3. Dex壓縮,把實際的Dex壓縮,首次啟動通過一個殼去加載,會影響啟動速度,但是可以解決,也比較復雜

so優化

so的優化手段和Java代碼其實比較類似,核心還是通過機制化的手段去裁剪、壓縮。

資源

資源本身

  • 通過工具掃描無用資源,有些由於項目自身原因,可能沒有顯式引用,但外置的編譯腳本會修改項目自身腳本,這就很坑了
  • 資源格式的優化,如PNG轉JPG(除去alpha通道),轉webp格式等
  • 字體文件只保留使用的,資源自身的二次優化

資源索引

通過AndResGuard工具壓縮資源名稱,進而降低索引文件的大小。

感悟

核心思想

  • 刪除不用的(顯而易見)
  • 壓縮/轉移有用的(如圖片、字體文件,如大資源的轉移,混淆信息的map表也是一種轉移)
  • 精簡系統產生的(dex重排)

常規的手段很容易到達瓶頸,高深的手段又有復雜、兼容性等諸多問題,但綜合來看,還是兩點:

  • 深刻理解底層:apk編譯流程、dex格式、資源引用、啟動流程、加載流程原理等
  • 深刻理解工具:ProGuard(很多人的ProGuard配置都是Copy修改),ReDex,AndResGuard等

權衡之道

很多時候,優化就是權衡,重要的是取舍:

  • 壓縮了Dex,就增加了啟動速度
  • 拿掉了行號,就增加了恢復Crash堆棧的難度
  • 混淆了代碼,就增加了編譯腳本的復雜度
  • 等等

根本出路

  • 建立監控:團隊每年都會優化一次安裝包大小,尤其是刪除、壓縮資源的時候,總是一頭霧水,不明白這個資源引入的目的,也不敢輕舉妄動。最后有一套系統,讓增量時有記錄,讓下線時有提醒,及時解決,而不是每到年底還一次技術債。
  • 制定標准:某種意義上上,安裝包大小的優化不是某個人的事情,而是團隊的事情,最好有相關的實踐指南或CodeReview標准。當有人不合理地引入資源,又或者業務下線后對無效邏輯置之不顧時,能有規則來約束這種行為。

參考

以上


歡迎掃碼關注作者公眾號,及時獲取最新信息。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM