Android 瘦身之道 ---- so文件
1. 前言
目前Android 瘦身只有幾個方面可以入手,因為apk的結構就已經固定了。
- res 目錄下的資源文件。(通常是壓縮圖片,比如 矢量圖 --> webp --> png 等。)
- src 目錄下的java文件。(通常是混淆,壓縮等。)
- asset 目錄下的資源文件。(類似 res 目錄。)
- lib 目錄下的第三方庫。(gradle 依賴的其實也可以算到這個目錄下,一般就是不要引用重復功能的第三方庫等。)
- so庫 (這個其實是很頑固的東西,你沒法壓縮它,如果沒有用到還好,用到了它體積3MB就是 3MB 沒有壓縮的空間了,更要命的是通常還不止放一套!本文主要談這個。)
關於 APK 瘦身,我覺得這篇文章總結的不錯:Android-APP終極瘦身指南
2. ABI 的種類
官方的一張表格列舉了常用的幾種 CPU 架構。

3. 目前主流 APP 所用的 ABI 各是哪些
數據是 2017/4/8看的市場最新版,采集的幾個代表性樣本如下:
僅有 armeabi : 微博,今日頭條,淘寶,QQ,微信。
armeabi 與 armeabi-v7a: UC 瀏覽器。
armeabi,armeabi-v7a,armeabi-x86:優酷,嗶哩嗶哩動畫。
7種類型全有:知乎。

我也看了目前流行的游戲 王者榮耀(因為我只安裝了它。。。哈哈),發現它僅有 armeabi-v7a。
4. ABI 兼容性
目前搜索的資料總結如下:
- armeabi-v7a :armeabi-v7a向下兼容armeabi
- arm64-v8a : 能兼容 armeabi-v7a 和 armeabi
- x86_64 : 兼容 x86
- mips64 : 兼容 mips
注意: 兼容只是理論上的,實際還是可能有極少數手機會崩潰,這是不可避免的。
5. 動態加載 so 文件
當你加上更多的支持架構之后,發現包體的增長已經影響了用戶的下載意願。廣告的轉化率提不上去啊,運營會找你麻煩的!
可能的一個解決方法是:分別發不同架構的包,讓用戶自己去選擇(太傻了,而且用戶哪有那么聰明)。
最好的方案還是動態下載 so 文件,發布的 APK 不包含 Native 代碼,啟動時根據不同的架構下載相應的 so 文件。
道理很簡單,而且網上也有一堆堆的教程,我也不細說。需要注意的是一定要將下載的 so 文件放置在程序目錄才可以 load,否則會遇到權限問題。
6. 總結
實際我們只需要保留 armeabi差不多就夠了,更好的方案是動態的加載 so文件,已達到兼容性和apk文件大小的控制的目的。
