隨著移動技術的深入發展,各種炫酷效果的更新,在我們追求UI與UE的同時一個不如忽視的問題逐漸暴露出來,那就是apk文件越來越大,可能有的童鞋會說現在都是wifi環境,apk文件增大幾M不是什么大不了的問題,這其實也是有一定道理的,但是作為開發人員的我們這絕不是我們認為可以忽略這個問題的理由。優化Apk大小也是優化我們App體驗的一個重要方面,雖然可能它不是那么的重要。
那么到底是那些原因讓我們的Apk文件變得越來越大呢?
多屏幕是適配問題,移動設備的多樣化導致了一個app需要N鐘不同尺寸的設置,從而增加了安裝文件中資源文件的種類與大小;
* 各種開發框架,開發工具的改進,雖然方便了我們開發者重復造輪子,但是這也間接的增加了安裝文件的大小;
* 在追求各種動畫、UI效果的內在需求,顯而易見的更加炫酷的UI、UE效果會客觀上增減Apk文件的大小;
* 開發人員溝通不足,冗余代碼過多造成打出來的apk文件增大;
* 為了滿足性能、安全性的需求,增添.so庫;
好吧,既然我們知道了為何我們的apk文件越來越大,我們就可以有針對性的提出解決辦法,為了更好的說明問題,這里我簡單的列一下apk文件的組成:
* 源碼文件即源代碼文件等
* 資源文件包括apk文件中的各種布局文件,資源文件,圖片文件,原生文件等等
* 本地代碼文件這里主要指的是.so文件
那么在知道了apk文件的組成之后,如何減少apk文件的大小就很簡單了
減小apk文件的大小,已經是一件很重要的事情。上面我們知道了apk文件的組成部分,就可以根據這些組成部分做一些優化安裝文件的工作了。。下面是我總結的一些減小apk文件大小的方式:
**源碼文件方面的優化方式**:
* 掌握良好的編碼習慣,復用代碼,對于一些重復性的代碼邏輯復用;
* 使用Proguard對代碼混淆,優化,壓縮(它不僅僅是一個牛擦的混淆工具在代碼優化方面也是很棒滴)。
* 減少一些無用代碼庫的引用,經常的一個場景就是可能一些代碼庫已經不需要了,但是還是在代碼中引用著,這樣做的后果就是無用的代碼庫也會被編譯到apk文件中;
* 定期進行代碼review,這是一個很重要的工作,可以是團隊成員之間熟悉彼此代碼同時也可以查找出一些自己看不出來的bug以及減小一些無用代碼;
* 做一些代碼lint之類的工作,android studio已經提供了這樣的功能,定期執行代碼lint操作是一個比較不錯的習慣;
**資源文件方面的優化方式**:
* 對于一些不必要的設備尺寸,不必要全部設備(主要看產品需求)
* 對資源文件,主要是圖片資源進行壓縮;
* 一些UI效果可以使用代碼渲染替代圖片資源;
* 資源文件的復用,比如兩個頁面的背景圖片相同底色不同,就可以復用背景圖片,設置不同的底色;
**本地代碼文件方面的優化方式**:
* 限制app支持的cpu架構的數目,在當前的Android 生態系統中,讓你的app支持 armabi 和 x86 架構就夠了;
* 盡可能的重用so庫文件;
最后重點講一下圖片的壓縮工作,其實上面所講的所有的減小apk大小的技巧中最重要的就是對圖片的壓縮工作。一般而言圖片壓縮對減小Apk大小所產生的效果占到你所有減小Apk努力的效果50%以上,因而要想減小Apk大小就考慮一下怎么減小圖片的大小吧。
這里推薦一個比較不錯的圖片壓縮網站:https://tinypng.com/ 支持對jpg與png圖片資源的壓縮。
我們可以具體的測試一下不同大小圖片資源的壓縮情況:

可以看到當圖片資源大于100k之后壓縮率都是65%左右,在10k+的圖片資源上表現同樣很牛擦,當圖片資源小于10k的隨著圖片大小的減小,逐漸減少。
后來具體在我們的apk文件中都是用這種方式壓縮一遍之后,apk文件的大小從11.86M減少到了10.52M,可見apk文件減小的效果還是很明顯的。
PS: 最新的Android Studio2.2提供了一個Apk分析器,能夠查看Apk文件的組成部分一起各自大小所占的比重,相當不錯哈。有興趣的同學可以研究一下,多如何減小Apk大小還是很有幫助的。
打開Android Studio --> Build --> Analyze Apk

**總結**
以上減少apk文件的方式相對來說,體驗方面就需要有一定的取舍,設計就是在一個約束集里面找出最好的方案。顯然apk文件的大小就是一個約束。不要害怕為了讓多個方面變得更好而放松一個方面的約束。你需要將app各方面進行整體考慮,而不是僅僅幾個方面的斟酌。
另外對產品研發技術,技巧,實踐方面感興趣的同學可以參考我的:
[android產品研發(一)-->實用開發規范 ](http://blog.csdn.net/qq_23547831/article/details/51534013)
[android產品研發(二)-->啟動頁優化 ](http://blog.csdn.net/qq_23547831/article/details/51541277)
[android產品研發(三)-->基類Activity](http://blog.csdn.net/qq_23547831/article/details/51546974)
- 前言
- (一)–>實用開發規范
- (二)-->啟動頁優化
- (三)-->基類Activity
- (四)-->減小Apk大小
- (五)-->多渠道打包
- (六)-->Apk混淆
- (七)-->Apk熱修復
- (八)-->App數據統計
- (九)-->App網絡數據解析
- (十)-->盡量不使用靜態變量保存數據
- (十一)-->應用內跳轉Scheme協議
- (十二)-->App長連接實現
- (十三)-->App輪詢操作
- (十四)-->App升級與更新
- (十五)-->內存對象序列化
- (十六)-->開發者選項
- (十七)-->Hybrid開發
- (十八)-->webview問題集錦
- (十九)-->Android studio中的單元測試
- (二十)-->代碼Review
- (二十一)-->Android中的UI優化
- (二十二)-->Android實用調試技巧
- (二十三)-->Android中保存靜態秘鑰實踐
- (二十四)-->內存泄露場景與檢測
- (二十五)-->MVC/MVVM/MVP簡單理解