如何查看 apk 的組成
若是要優化 apk 的大小,咱們首先須要知道咱們編譯出來的 apk 都包含哪些東西,而後針對佔用大的作裁剪,或者刪除不須要的東西,從而達到瘦身的目的。html
查看 apk 的內容佔用狀況很簡單,打開 AS ,把 apk 拖到 AS 裏面就能夠查看 apk 包含的內容了。android
能夠看到佔大頭的是 res 代碼等,因此瘦身能夠從這幾個方面來考慮。git
如何減小 res 資源大小
- 刪除冗餘的資源
通常隨着項目的迭代,部分圖片等資源再也不使用了,可是可能仍然被編譯到了 apk 裏面,因此能夠刪除這部分再也不使用的資源,可使用 lint 工具來搜索項目中再也不使用的圖片等資源。github
- 重複資源的優化
除了有冗餘資源,還有些是文件名不同,可是內容同樣的圖片,能夠經過比較 md5 值來判斷是否是同樣的資源,而後編輯 resources.arsc 來重定向。服務器
- 圖片壓縮
未壓縮的圖片文件佔用空間較大,能夠考慮壓縮未壓縮過的圖片來瘦身。經常使用的工具是 tinypng 網站。微信
同時也能夠藉助 TinyPngPlugin 等插件或者其餘開源工具來幫助壓縮圖片。app
- 資源混淆
經過將資源路徑 res/drawable/wechat
變爲 r/d/a
的方式來減小 apk 的大小,當 apk 有較多資源項的時候,效果比較明顯,這是一款微信開源的工具,詳細地址是:AndResGuardide
- 指定語言
若是沒有特殊的需求的話,能夠只編譯中文,由於其餘的語言用不上,若是用不上的語言編譯了,會在 resource 的表裏面佔用大量的空間,故工具
android { defaultConfig { ... // 僅支持 中文 resConfigs "zh" } }
如何減小 so 庫資源大小
- 本身編譯的 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")
- 別人編譯的 so
聯繫做者修改,通常很難聯繫到。
- 動態下發 so
能夠經過服務器下發 so , 下載完後再進入應用,可是體驗很差,可是是一個思路。
- 只編譯指定平臺的 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 位平臺 |
如何減小代碼資源大小
- 一個功能儘可能用一個庫
好比加載圖片庫,不要 glide 和 fresco 混用,由於功能是相似的,只是使用的方法不同,用了多個庫來作相似的事情,代碼確定就變多了。
- 混淆
混淆的話,減小了生成的 class 大小,這樣聚沙成塔,也能夠從必定層度減小 apk 的大小。
- R 文件內聯
經過把 R 文件裏面的資源內聯到代碼中,從而減小 R 文件的大小。
可使用 shrink-r-plugin 工具來作 R 文件的內聯
參考文檔
聯繫我
-
Github: https://github.com/XanderWang
-
Mail: 420640763@qq.com