Android APK瘦身

APK瘦身可以為我們帶來什么好處?

提高傳輸及編譯效率。無論是上傳應(yīng)用商店還是公司內(nèi)部傳輸以及我們自己編譯,越小的apk也就代表著所需的時間越少。

提高用戶轉(zhuǎn)化率。能實現(xiàn)同樣功能的apk,用戶在下載時一般會選擇那個較小的,因為這樣在下載速度上也快,占用手機內(nèi)存也小,如果用戶使用的流量,那么越大的apk也就代表著下載的可能性越小。

所以針對apk瘦身,我們可以從以下幾點入手:

一、Vector矢量圖的使用

我們項目中平時最常見的就是jpg、png格式的圖片,俗稱位圖,特點是縮放會失真。還有一種svg格式的矢量圖,特點就是縮放不會失真,所以同樣的圖片,無論你在屏幕中是放大顯示還是縮小顯示,清晰度都一樣。Android從5.0才開始對矢量圖的支持,但并不能直接像jpg或png那樣使用,需要將svg轉(zhuǎn)換成Vector形式的xml文件,存放于drawable目錄下。因為矢量圖不能使用GPU緩存及繪制效率問題,官方建議我們最好使用在色彩較簡單及小于200*200的圖片內(nèi)。

1、通過Android Studio提供的Vector Asset對svg進行轉(zhuǎn)換,Clip Art中提供了studio內(nèi)置的一些svg圖片,Local file中可進行本地svg或psd格式圖片的轉(zhuǎn)換。

Vector Asset

2、使用第三方svg2vector jar包對svg進行轉(zhuǎn)換,可批量。命令:java -jar svg2vector.jar -d source/ -o svg

-d:批量轉(zhuǎn)換的源文件夾地址

-f:單個轉(zhuǎn)換的源文件地址

-o:轉(zhuǎn)換后要輸出的文件地址

-h:輸出的高

-w:輸出的寬

svg2vector下載地址

注意:如果轉(zhuǎn)換時提示不支持的錯誤信息,請查看圖片中是否引用了濾鏡等特效,或使用了字體,字體可轉(zhuǎn)換為形狀后再使用。

3、關(guān)于兼容Android 5.0之前的版本,有兩種方案:

第一種: 在build.gradle 配置generatedDensities,這種方式實際就是在5.0以下設(shè)備中,Android會在對應(yīng)的drawable中生成png圖片。

generatedDensities

第二種:使用谷歌提供的VectorDrawable依賴庫,詳細的使用方法可自行查找,這里就不過多講解了。

二、合理的導(dǎo)入lib中的so文件

首先我們先簡單的介紹一下so文件,so是由ndk編譯出來的動態(tài)庫,由c/c++寫的,因為c不是跨平臺的,所以針對不同的CPU架構(gòu),也就對應(yīng)著不同的so文件,目前Android支持的有armeabi,armeabi-v7a,arm64- v8a,x86,x86_64,mips,mips64。而armeabi-v7a向下兼容armeabi;arm64- v8a兼容armeabi-v7a及armeabi;x86_64兼容x86;mips64兼容mips。mips64與x86_64在市場上又很少見到,所以只需要導(dǎo)入arm64- v8a的即可。我們看一下微信的apk也只是導(dǎo)入了arm64- v8a的。

微信

三、國際化資源配置

我們平時在引用有些第三方依賴庫時,因為其是針對國際的,所以針對國際化做了很好的適配,而我們的應(yīng)用如果不針對國際化或只針對少數(shù)國家時,引入這些依賴庫后會多出很多無用資源,這個時候可以在build.gradle中配置resConfigs屬性,減少無用資源打包進apk。

resConfigs

下面提供兩張沒配置resConfigs和配置后的圖片對比。

配置前
配置后

四、移除已經(jīng)不在使用的資源

隨著我們項目的不斷開發(fā),有些廢棄功能的資源可能還會保留在我們的項目中,這個時候可以使用以下幾種方式來對這些資源進行刪除。

1、使用【Refactor】【Remove Unused Resources】對沒有引用的資源進行查看,這種方式有一個弊端,當(dāng)代碼中使用動態(tài)方式(如:getResources().getIdentifier())獲取資源時,也會被列入未使用資源范圍內(nèi)。

【Remove Unused Resources】

2、使用Lint代碼檢測工具,這種方式和上面的基本類似。

Lint

五、在build.gradle中配置混淆壓縮。

shrinkResources

注意,shrinkResources如果開啟,則minifyEnabled也必須開啟才能生效,并且這種方式只會對apk打包后res目錄下的資源起作用,如layout,drawable這些,其結(jié)果是將layout布局文件的內(nèi)容清空,drawable的圖片換成只有1像素的大小,而對于存放于resources.arsc中的string,color等資源無效。

配置shrinkResources后

我們還可以在res/raw/keep.xml中配置壓縮規(guī)則,其中tools:keep定義了哪些資源可以被保留,tools:discard定義了哪些資源可以被壓縮,tools:shrinkMode="strict"開啟嚴格模式。這個文件最終并不會打入apk包中。

六、AndResGuard的使用

AndResGuard是微信提供的一套開源工具,旨在對Android中的資源性文件進行混淆,在起到安全作用的同時也會達到瘦身的效果,因為它會把資源的目錄及名稱等替換為a,b,c ……等名稱。其關(guān)鍵在于修改了apk包下resources.arsc中的映射。據(jù)說使用了AndResGuard的應(yīng)用無法通過Google Play的審核上架(自己未驗證過)。具體使用及原理可參考以下鏈接:AndResGuard

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 背景 在開發(fā)的過程中,發(fā)現(xiàn)應(yīng)用程序apk大小越來越大,相對于它能提供的功能而言,它是在不應(yīng)該擁有那么大的體積,沒干...
    c_o_c_o閱讀 382評論 0 3
  • Android APK瘦身經(jīng)驗總結(jié) 寫在前面: 無論手機的內(nèi)存有多大, 我們自然都希望一個應(yīng)用的安裝包能越小越好,...
    MeloDev閱讀 4,702評論 1 35
  • App瘦身 代碼瘦身 移除無用代碼、功能,縮減方法數(shù); 移除無用的庫、避免功能雷同的庫; 啟用Proguard,讓...
    LoveXiaer閱讀 164評論 0 1
  • 規(guī)畫:已讀 微笑:完成 自我確認:我是健康幸福光明喜悅寬容的。 愛的表達:對寶寶說愛你,對愛人說我愛你。 1 感恩...
    好皓灝閱讀 143評論 0 1
  • 鳳凰湖是我最喜愛的一個地方。那里景色優(yōu)美,樹影搖曳,湖天相接,非常美麗。 剛走入鳳凰湖就可以看見...
    b63c062a16a8閱讀 205評論 0 1

友情鏈接更多精彩內(nèi)容