Android 性能優化 - APK 瘦身

如何查看 apk 的組成

若是要優化 apk 的大小,咱們首先須要知道咱們編譯出來的 apk 都包含哪些東西,而後針對佔用大的作裁剪,或者刪除不須要的東西,從而達到瘦身的目的。html

查看 apk 的內容佔用狀況很簡單,打開 AS ,把 apk 拖到 AS 裏面就能夠查看 apk 包含的內容了。android

資源預覽

能夠看到佔大頭的是 res 代碼等,因此瘦身能夠從這幾個方面來考慮。git

如何減小 res 資源大小

  1. 刪除冗餘的資源

通常隨着項目的迭代,部分圖片等資源再也不使用了,可是可能仍然被編譯到了 apk 裏面,因此能夠刪除這部分再也不使用的資源,可使用 lint 工具來搜索項目中再也不使用的圖片等資源。github

  1. 重複資源的優化

除了有冗餘資源,還有些是文件名不同,可是內容同樣的圖片,能夠經過比較 md5 值來判斷是否是同樣的資源,而後編輯 resources.arsc 來重定向。服務器

  1. 圖片壓縮

未壓縮的圖片文件佔用空間較大,能夠考慮壓縮未壓縮過的圖片來瘦身。經常使用的工具是 tinypng 網站。微信

同時也能夠藉助 TinyPngPlugin 等插件或者其餘開源工具來幫助壓縮圖片。app

  1. 資源混淆

經過將資源路徑 res/drawable/wechat 變爲 r/d/a 的方式來減小 apk 的大小,當 apk 有較多資源項的時候,效果比較明顯,這是一款微信開源的工具,詳細地址是:AndResGuardide

  1. 指定語言

若是沒有特殊的需求的話,能夠只編譯中文,由於其餘的語言用不上,若是用不上的語言編譯了,會在 resource 的表裏面佔用大量的空間,故工具

android {
    defaultConfig {
        ...
        // 僅支持 中文
        resConfigs "zh" 
    }
}

如何減小 so 庫資源大小

  1. 本身編譯的 so

release 包的 so 中移除調試符號。可使用 Android NDK 中提供的 arm-eabi-strip 工具從原生庫中移除沒必要要的調試符號。gradle

若是是 cmake 來編譯的話,能夠再編輯腳本添加以下代碼

set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -s")
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -s")
  1. 別人編譯的 so

聯繫做者修改,通常很難聯繫到。

  1. 動態下發 so

能夠經過服務器下發 so , 下載完後再進入應用,可是體驗很差,可是是一個思路。

  1. 只編譯指定平臺的 so

通常咱們都是給 arm 平臺的機器開發,若是沒有特殊狀況,咱們通常只須要考慮 arm 平臺的。具體的方法是 app 下的 build.gradle 添加以下代碼

android {
    defaultConfig {
        ndk {
            abiFilter "armeabi"
        }
    }
}

各個平臺的差異以下:

平臺 說明
armeabi-v7a arm 第 7 代及以上的處理器,2011 年後的設備基本都是
arm64-v8a arm 第 8 代 64 位處理器設備
armeabi arm 第 五、6 代處理器,早期的機器都是這個平臺
x86 x86 32 位平臺,平板和模擬器用的多
x86_64 x86 64 位平臺

如何減小代碼資源大小

  1. 一個功能儘可能用一個庫

好比加載圖片庫,不要 glide 和 fresco 混用,由於功能是相似的,只是使用的方法不同,用了多個庫來作相似的事情,代碼確定就變多了。

  1. 混淆

混淆的話,減小了生成的 class 大小,這樣聚沙成塔,也能夠從必定層度減小 apk 的大小。

  1. R 文件內聯

經過把 R 文件裏面的資源內聯到代碼中,從而減小 R 文件的大小。

可使用 shrink-r-plugin 工具來作 R 文件的內聯

參考文檔

Android App包瘦身優化實踐

聯繫我

相關文章
相關標籤/搜索