最近在進(jìn)行App包的體積優(yōu)化覺得有點(diǎn)意義于是想記錄下來分享給大家
需求是這樣的:最近項(xiàng)目在進(jìn)行但是有客戶以及產(chǎn)品提出App的體積過大安裝包.apk 達(dá)到了73.5M的體積猴蹂,提出要減小體積悄窃。一開始是想抽點(diǎn)點(diǎn)時(shí)間來進(jìn)行這個需求不想花太多時(shí)間慰于,開會的時(shí)候召集IOS工程師以及Android工程師一起提了幾個思路包括:
- 1.查看無用的第三方庫;
- 2.查看無用的圖片;
- 3.查看是否有過大的圖片;
因?yàn)锳pp經(jīng)過了幾波開發(fā)和設(shè)計(jì)所以可能里面會有些亂怜俐,先讓工程師先去查找并且報(bào)上來,隔了2天左右報(bào)上來的Android 這邊沒有無用的第三方庫邓尤,無用圖片已經(jīng)去掉拍鲤,似乎沒有過大的圖片,整體體積優(yōu)化幾M都不到后來趕項(xiàng)目就做項(xiàng)目去了沒有繼續(xù)跟蹤汞扎,但是最近又提到了體積大的問題這次我決定自己去看個究竟季稳。
我的思路比原來多了一點(diǎn):
- 0.查看是否有無用的資源;
- 1.查看無用的第三方庫澈魄;
- 2.查看無用的圖片景鼠;
- 3.查看是否有過大的圖片;
我和工程師方向不同他們是從開發(fā)項(xiàng)目入手痹扇,我打算從release包入手這樣才能真正分析過大的原因铛漓,分析release包兩種方案:利用Android studio就可以很方便分析還可以查看下載大小的情況;可以手動解壓縮查看里面的文件夾鲫构,我兩種都用了于是拿了一個release包來下手看看情況浓恶,首先不用說了下載解壓,查看App各個文件夾的情況结笨,發(fā)現(xiàn)了如下幾個情況:
assets文件夾里面有個fonts的字體文件體積非常大(大約14M)然后我又去項(xiàng)目中搜了下引用這個字體的class類找到了包晰,但是這個引用的class類居然沒有被其他引用最后讓工程師叫過來詢問說是以前需求要求改變字體但是后來需求取消了湿镀,于是找到了第一條大的
進(jìn)入lib文件夾里面這個文件夾體積最大很多so的庫在里面先按照體積排一個序,發(fā)現(xiàn)最大的是叫做libhyphenate_av.so的庫在arm64-v8a 文件夾里面有7.1M伐憾,在armeabi-v7a里面也有個4.5M 非常大于是先從這個入手詢問了新相關(guān)開發(fā)的工程師這個庫是集成的一個聊天的庫他覺得沒問題勉痴,但是我又發(fā)現(xiàn)了一個名字叫l(wèi)ibhyphenate.so的庫(體積排名不靠前但是還是被我發(fā)現(xiàn)了,這個庫arm64-v8a里面只有2.6M树肃,armeabi-v7a只有1.6M)另其查詢發(fā)現(xiàn)_av.so的庫是個帶音視頻的功能更強(qiáng)大蒸矛,但是我們只用到了最基本的功能因此是不需要的,馬上去掉編譯運(yùn)行看看效果果然可以運(yùn)行胸嘴,說明了導(dǎo)入第三方庫的時(shí)候要搞清楚需求以及庫的作用雏掠,又給我抓到一個大魚
最后是res文件夾這個里面體積也大主要是圖片多,分為hdpi xxhdpi xxxhdpi主要是三類打開最大的xxxhdpi查看依然是排序查看筛谚,居然一個開機(jī)啟動圖片達(dá)到了1.9M也太大了而且只是這一個文件夾其他的文件夾估計(jì)也大,查找到了幾個大于幾百K的圖片這些是肯定要改的停忿,剩下的很多200多K-20K的圖片咋一開始覺得沒問題驾讲,但是查看幾個以后發(fā)現(xiàn)還是有問題因?yàn)橛行﹫D片按鈕,小ICON的體積達(dá)到了20-30K以經(jīng)驗(yàn)來看覺得是有問題的席赂,一般來說大廠的會在幾K左右吮铭,于是我下載了幾個大廠的.apk下來,讓UI一起過來解壓看看里面類似的圖片體積颅停,翻了好幾個文件夾果不其然他們類似的圖片比我們要小得多谓晌,于是和UI溝通UI說圖片是sketch直接弄出來的當(dāng)時(shí)沒有發(fā)現(xiàn)很大對比才知道需要用PS去修改下尺寸以及體積,最后把圖片大于5K的圖片都交給UI去檢查修改癞揉,這次圖片文件夾體積估計(jì)能減小將近一半左右纸肉,
PS:另外Android圖片的體積優(yōu)化如果不夠還可以用Android Studio自帶的工具進(jìn)行優(yōu)化(我個人覺得首先要UI先解決本身的問題,再利用這個工具進(jìn)行壓縮而不是一開始就用這個工具進(jìn)行壓縮)喊熟,大概原理就是利用支持的WebP的格式進(jìn)行優(yōu)化具體操作如下柏肪,最后面要強(qiáng)調(diào)的圖片也要仔細(xì)檢查因?yàn)橛行﹫D片是第三方庫使用的,像這些圖片可以先不動優(yōu)先處理自己App的圖片
http://www.reibang.com/p/e388520a9edc移除無用的資源還是利用Android Studio的自帶工具進(jìn)行點(diǎn)擊AS上的Analyze菜單按鈕芥牌,選擇Run Inspection by Name烦味,會出現(xiàn)一個彈窗, 輸入unused resources壁拉,會彈出“inspaction scope”選擇窗口谬俄,選擇檢查的范圍,一般選擇整個項(xiàng)目或模塊弃理±B郏“inspaction scope”窗口下面還可以設(shè)置文件過濾,選擇好后點(diǎn)ok就開始檢查了痘昌,如果資源文件是通過反射機(jī)制調(diào)用的蔬芥,Lint是無法知道的梆靖,所以使用lint檢查出的每一個資源都需要人工進(jìn)行確認(rèn),防止發(fā)生異常刪除笔诵,
PS:Gradle構(gòu)建系統(tǒng)支持自動移除無用的資源返吻,只需要在你的Gradle配置文件中加入minifyEnabled true shrinkResources true 但是搜索以后發(fā)現(xiàn)這個其實(shí)還是有問題的因?yàn)橛行﹫D片是被動態(tài)加載的這句指令會影響整體運(yùn)行所以不太推薦移除低配置手機(jī)的.so庫(其實(shí)是第四點(diǎn)的補(bǔ)充),說白了就是移除armabi里面的庫乎婿,因?yàn)閍rmabi指的是armV5指令集的手機(jī)测僵,應(yīng)該是比較老的一類了當(dāng)然有些App為了全面性還是支持的,但是我們做的是智能家居產(chǎn)品的App所以應(yīng)該可以去掉谢翎,去掉的時(shí)候要注意些細(xì)節(jié)就是要進(jìn)去對比下armeabi捍靠,armeabi-v7a,arm64-v8a這三個文件夾要確定armeabi里面的庫armeabi-v7a森逮,arm64-v8a對應(yīng)都有才行榨婆,比如我就遇到了有一個庫在armeabi里面而不再armeabi-v7a里面,我就把這個庫拷貝到了armeabi-v7a里面褒侧,然后在gradle里面的配置去掉armeabi選項(xiàng)不編譯即可