APK瘦身三步曲
前言
背景
115於2009年推出的網路資料線上儲存服務,一直以來都有階段性對應用進行安裝包的體積優化,因為公司也沒有硬性的指標規定,所以這塊的重視程度也一直不高。對比了目前競品的一個情況,如下:
應用 | 版本號 | 大小 |
---|---|---|
115 | V8.1.1 | 50.26M |
微雲 | V6.6.4 | 37.67MB |
百度雲 | V9.0.2 | 48.3MB |
使用Android+Studio/">Android Studio的APK Analyzer具體詳細分析如下:
目錄 | 115 | 微雲 | 百度雲 |
---|---|---|---|
res | 31.8M | +assert 10.2M | +assert 17.4M |
lib | 7M | 18.2M | 13.1M |
classes | 7.3M | 6.8M | 13.9M |
resource.arsc | 1.9M | 1.6M | 2.2M |
分析
雖然各個應用的功能集不一致,但是主要都是提供儲存服務,這裡的對比也是從某個層面進行比較。通過分析對比表可以得知。
- 微雲體積最少,百度雲次之,115最大
- 115體積主要最大的地方在res圖片資源這塊
- 115的lib及classes是最小的
所以從分析的結果上來看,115的體積優化的主要方向要從res圖片資源入手。
瘦身三步曲(刪除、壓縮、混淆)
刪除
刪除無用的程式碼
刪除無用的程式碼,這個放在第一位是因為這個是問題的根源。
隨著專案版本的迭代及業務快速的更迭,有時候為了趕時間,廢棄的程式碼及資源都不會及時清理,日積月累的堆積,慢慢APK的體積就會越來越臃腫。
如果屬於這種情況,應該先自己進行人工的整理及清除。這個時候可以先不管資源(後面用工具進行清理),但是類相關的呼叫及無用的類要及時進行清理。否則後面的圖片及資源也會照樣被識別為有引用,打包進APK。
Lint工具檢查
Android Studio給我們提供了強大的檢查工具。只需要選中res目錄,右鍵選擇Refactor然後再選擇Remove Unused Resources。
建議先使用Preview,然後再進行刪除。

Lint使用

Lint Preview
這裡需要注意,特別有使用第三方的SDK,有些程式碼是在jar包裡面,但是資源獨立拷貝進工程,這樣也會被識別成無引用的資源。但是這類資源一般都有特定的命名格式。
Grdle配置
android { buildTypes { release { minifyEnabled true //是否開啟混淆 shrinkResources true //壓縮 zipAlignEnabled true ////去掉無用的resourse檔案 } } }
啟用shrinkResources,gradle在打包的時候會自動進行資源的清理。
壓縮
PNG壓縮優化
推薦使用 ofollow,noindex">tinypng 。
tinypng通過合併圖片中相似的顏色,通過將 24 位的 PNG 圖片壓縮成小得多的 8 位色值的圖片,並且去掉了圖片中不必要的 metadata(元資料,從 Photoshop 等工具中匯出的圖片都會帶有此類資訊),這種方式幾乎能完美支援原圖片的透明度。有部分文件指出tinypng同時採用了pngquant、optipng、advpng幾種指令碼。圖片的壓縮率能達到50%以上。
webp使用
WebP格式,谷歌(google)開發的一種旨在加快圖片載入速度的圖片格式。無失真壓縮比PNG檔案小45%,即使PNG已經過其他的優化,也能達到28%。缺點,載入比PNG慢。
Android Studio自帶了對WebP的轉換支援。選中資源,右鍵Convert to WebP。

PNG 轉 WebP
通過刪除及壓縮前兩步的操作,115的優化情況如下:
目錄 | 115 | 115優化 |
---|---|---|
res | 31.8M | 26.1MM |
lib | 7M | 7M |
classes | 7.3M | 7.3M |
resource.arsc | 1.9M | 1.8M |
優化情況分析:優化後為44.46M,約節省5.8M,優化11%
混淆
Proguard程式碼混淆
- 刪除註釋和無用的程式碼
- 將java檔案檔名及方法名改成短名 a.java
支援的方式也很簡單,Gradle預設支援
android { buildTypes { release { minifyEnabled true //是否開啟混淆 proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } }
資源混淆
AndResGuard 是一個幫助你縮小APK大小的工具,他的原理類似Java Proguard,但是隻針對資源。他會將原本冗長的資源路徑變短,例如將res/drawable/wechat變為r/d/a。
具體的原理可參看 安裝包立減1M--微信Android資源混淆打包工具
整合也非常簡單,詳細參看Github中的使用說明則可。
通過資源混淆後,115的優化情況如下:
目錄 | 115 | 115優化 | 115資源混淆 |
---|---|---|---|
res | 31.8M | 26.1MM | 25.4M |
lib | 7M | 7M | 6.7M |
classes | 7.3M | 7.3M | 6.9M |
resource.arsc | 1.9M | 1.8M | 280.3KB |
優化情況分析:優化後為41.32M,相比沒做資源混淆,約節省3.14M,體積優化7%
總結
經過瘦身三步曲的優化後,最終115應用的一個優化情況如下:
目錄 | 115 | 115最終優化版本 |
---|---|---|
res | 31.8M | 25.4M |
lib | 7M | 6.7M |
classes | 7.3M | 6.9M |
resource.arsc | 1.9M | 280.3KB |
優化情況分析:優化後為41.32M,相比沒做優化前,約節省8.94M,體積優化17.7%
115的APK體積優化,現階段只能說是做了一個初步優化,特別是對於第一步的刪除,由於歷史的遺留原因。對於一些遺留的程式碼還待進一步的整理和清除,體積也是還有繼續優化的空間。
其他方案
除了常規的瘦身三步曲,對於APK體積當然還有其他的方案。如:
- 資源動態載入(如表情包動態下載)
- 外掛化(動態載入)
方案當然還有很多,本文只介紹常規使用的一些方法,有興趣的夥伴可以繼續深入瞭解。