前言
之前我在微信群里面有說到士八,隨著Android開發(fā)越來越成熟芒珠,關(guān)于Android方面的技術(shù)文章越來越多牺堰,作為開發(fā)者不缺資源佩微,缺乏的是系統(tǒng)的知識(shí)和指導(dǎo),對(duì)于學(xué)生和上班族來講萌焰,更缺乏篩選信息的時(shí)間哺眯。從某個(gè)角度來講,精心篩選整理網(wǎng)絡(luò)上的優(yōu)質(zhì)文章并形成專題扒俯,如果需要學(xué)習(xí)某方面的知識(shí)只需要看這一篇文章就夠奶卓,那意義會(huì)比寫一篇純技術(shù)文章會(huì)有價(jià)值得多。
出于能夠更便捷撼玄、高效獲取優(yōu)質(zhì)資源的角度考慮夺姑,寫一系列專題的想法就誕生了,結(jié)合自己閱讀過的技術(shù)文章和實(shí)際工作經(jīng)驗(yàn)掌猛,將平時(shí)收集的優(yōu)質(zhì)技術(shù)文章按照某個(gè)方面整理成一系列的專題盏浙,比如APK瘦身、插件化荔茬、程序架構(gòu)废膘、性能優(yōu)化、自定義view慕蔚、增量升級(jí)丐黄、移動(dòng)開發(fā)各種技術(shù)解決方案等。這是我目前能夠想到的除了寫書之外最值得做的一件事情了孔飒。
這個(gè)系列從APK瘦身專題開始灌闺,后面會(huì)不定期推出其它專題,發(fā)過的專題也會(huì)不斷更新坏瞄。
APK瘦身的價(jià)值
APK瘦身嚴(yán)格來講不算是對(duì)應(yīng)用性能的優(yōu)化桂对,應(yīng)該算是對(duì)程序體驗(yàn)的優(yōu)化。APK瘦身的價(jià)值主要有幾點(diǎn):
省流量:特別是在4G網(wǎng)絡(luò)下鸠匀,更多的移動(dòng)流量表示需要花費(fèi)更多的錢(別指望著用戶一個(gè)月1蕉斜、2G的流量專門給你騰出幾十M來用于下載安裝包);
給用戶一個(gè)好印象,試想用戶在安裝你的程序需要很長的時(shí)間時(shí)蛛勉,不僅會(huì)影響到他的心情,更是在浪費(fèi)他的生命睦柴;
如果你的APK是預(yù)置到設(shè)備中诽凌,更大的APK表示需要占用更多的存儲(chǔ)空間,也會(huì)增加燒錄的時(shí)間坦敌。
從哪些方面入手
一個(gè)APK實(shí)際上就是一個(gè)壓縮文件侣诵,解壓后可以看到通常包含如下幾種類型的文件或文件夾:
classes.dex源碼;
編譯生成的二進(jìn)制資源文件resources.arsc狱窘;
res資源文件夾杜顺;
assets文件夾;
lib庫文件夾蘸炸;
AndroidManifest.xml清單文件躬络;
依賴關(guān)系配置文件project.properties;
代碼混淆配置文件proguard.cfg搭儒;
簽名信息文件META-INF等穷当。
除了AndroidManifest.xml、proguard.cfg方灾、project.properties鸭蛙、META-INF這些本身很小沒有必要做進(jìn)一步壓縮的文件外忙厌,其它文件或者文件夾都可以進(jìn)一步優(yōu)化,從而減小APK的體積汪疮。下面分別就每一個(gè)文件或者文件夾該如何減小其大小做介紹:
- classes.dex源碼:
1.代碼混淆可以減小該文件的大小,因?yàn)榛煜蟮拇a將較長的文件名毁习、實(shí)例智嚷、變量、方法名等等做了簡化纺且,從而實(shí)現(xiàn)字節(jié)長度上的優(yōu)化纤勒,但代碼混淆會(huì)存在一些問題,比如比較耗時(shí)間隆檀,因?yàn)樾枰业讲荒茏龌煜拇a并在配置文件中注明摇天,其次是調(diào)試起來不太方便;
2.刪掉沒有用到的代碼恐仑,可以借助Android Studio→Inspect Code...對(duì)工程做靜態(tài)代碼檢查泉坐,刪掉無用的代碼;
- resources.arsc:
1.這個(gè)文件主要涉及到資源的ID這些裳仆,優(yōu)化的空間不大腕让,可以借助Android Studio→Inspect Code...刪掉不必要的資源ID;
- res資源文件夾:這是APK瘦身過程中優(yōu)化的大頭,一個(gè)APK里面最占用空間的就是多媒體資源纯丸,圖片偏形、音頻、視頻主要放在res和assets文件夾下觉鼻;
1.通過Android Studio→Inspect Code...對(duì)工程做靜態(tài)代碼檢查俊扭,刪掉沒有用到的資源;
2.一個(gè)APK盡量只用一套圖片坠陈,從內(nèi)存占用和適配的角度考慮萨惑,這一套圖建議放在xhdpi文件夾下;
3.使用tinypng等圖片壓縮工具對(duì)圖片進(jìn)行壓縮仇矾;
4.如果對(duì)壓縮的圖片質(zhì)量不滿意庸蔼,可以考慮使用其它圖片格式,比如不帶alpha值的jpg圖片贮匕、同等質(zhì)量下文件更小的webP圖片格式姐仅;
5.借助微信提供的資源文件混淆工具對(duì)資源文件做混淆,進(jìn)一步壓縮資源文件所占用的空間刻盐;
6.如果raw文件夾下有音頻文件萍嬉,盡量不要使用無損的音頻格式,比如wav隙疚∪雷罚可以考慮相比于mp3同等質(zhì)量但文件更小的opus音頻格式;
7.能不用圖片的就不用圖片(用代碼實(shí)現(xiàn))供屉,如果要用圖片則優(yōu)先使用9圖行冰;
8.考慮引進(jìn)VectorDrawable和svg。
- assets文件夾:assets文件夾相比于res文件夾伶丐,還有可能放字體文件悼做、預(yù)置數(shù)據(jù)和web頁面等
1.使用文中提供的字體壓縮工具對(duì)字體文件進(jìn)行壓縮;
2.如果有web頁面哗魂,可以考慮使用7zip壓縮工具對(duì)該文件夾進(jìn)行壓縮肛走,在正式使用的時(shí)候解壓;
3.盡量不要在APK中打包預(yù)置數(shù)據(jù)录别,做到程序和數(shù)據(jù)分離朽色,如果是不得不,可以考慮用7z壓縮工具對(duì)該文件進(jìn)行壓縮组题,在程序運(yùn)行時(shí)解壓葫男;
- lib庫文件夾:
1.只提供對(duì)主流架構(gòu)的支持,比如arm崔列,對(duì)于mips和x86架構(gòu)可以考慮不支持梢褐,這樣可以大大減小APK的體積;
需要用到的工具
Android Studio→Inspect Code...
值得閱讀的文章
SmallerAPK, Part 4: Multi-APK through ABI and density splits
SmallerAPK, Part 7: Image optimization, Shape and VectorDrawables
忠告
APK瘦身要有一定的度鱼响,如果對(duì)某一方面做大小優(yōu)化需要很長的時(shí)間鸣剪,并且效果不大,可以考慮不做热押。
更多原創(chuàng)文章和優(yōu)質(zhì)資源請關(guān)注公眾號(hào):