APK體積優化的一些總結

面對那種無節操的產品,大家怎麼辦?php

產品:「apk的體積是否能夠優化如下,這樣比較好推廣!」java

我:「不能夠!」android

產品:「apk的體積是否能夠優化如下,這樣比較好推廣!」git

我:「不能夠!」程序員

產品:「apk的體積是否能夠優化如下,這樣比較好推廣!」github

我:「我考慮一下!」web

沒辦法面對這樣的產品咱們怎麼能慫!老子寫代碼都是一把梭!!!api

可是回頭想一想,這個和寫代碼有個毛線關係!!!瀏覽器

好了,吐槽環節到此結束!!!微信

今天咱們就來討論一下,apk體積優化的一些方式:

本文知識點:

apk優化的一些奇淫技巧!!!

本文分爲以下幾個步驟去優化,有什麼不對的還請大神們見諒!小弟仍是個菜鳥。。。 哈哈 !!

  1. svg的使用與優化
  2. Tint着色器的使用與優化
  3. 資源打包配置優化
  4. 動態庫的打包配置優化
  5. 移除無用的資源(物理與非物理刪除)
  6. 代碼混淆
  7. webp轉換(api等級18)
  8. 資源混淆

這個須要api的等級最低爲18,如今基本上均可以知足需求!

這個使用的時候很簡單,選中圖片直接右鍵,conver to Webp...直接就能轉換過來!越大的圖片轉換節約的體積也就越大! 8. 資源混淆

基本上我優化的時候就從以上幾個方面去進行的,在和以前沒進行優化的項目比較,可使體積減小至少30%!不信能夠在你的項目中實驗一下!省的說我開車不穩,翻車了!!!

1. svg的使用與優化

首先咱們先來了解一下什麼是svg在百度百科是這麼說的!!!,其實咱們只要關注主要的概念就行了!可縮放的矢量圖形。其實人話就是在不一樣大小的地方顯示不變形!具體的概念,看看百度百科就行了!!!

爲了方便給你們演示!這裏呢?我特地找了個網站阿里矢量圖,在這個網站中你能夠下載各類的矢量圖,而後呢?就沒有而後了。。。

下載以後呢?會有一個醜醜的ie瀏覽器的圖標後綴爲.svg的東西!這個怎麼用呢?強大的android studio 爲咱們作好了準備工做!

res->new->vector Asset

展現效果圖

以後會蹦出來這麼個玩意

展現效果圖

前一個紅框是系統的圖標,後一個是本地的圖標!這樣你就會生成一個以.xml爲結尾的圖標了!

裏面的代碼大概是這個樣子的!

<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="24dp" android:height="24dp" android:viewportWidth="24.0" android:viewportHeight="24.0">
    <path android:fillColor="#FF000000" android:pathData="M20,11H7.83l5.59,-5.59L12,4l-8,8 8,8 1.41,-1.41L7.83,13H20v-2z" />
</vector>
複製代碼

其實裏面的具體語法我也不太瞭解,應該是在指定區域中分紅寬和高的等份,而後填充的!感興趣的能夠本身瞭解一下!

使用的話,和以前的src不一樣了!必須這樣使用!

app:srcCompat="@drawable/ic_arrow_back_black_24dp" 
複製代碼

這裏不少人會有兩個疑問?

  • 這個和apk體積優化有個毛線關係?
  • 美工每每給不少張圖片,總不能一張一張轉換吧?

關於上面這兩個問題,咱們分別來講一下:

  1. 首先svg是可縮放矢量圖,因此呢?你在項目中只要添加一張svg就能夠替換相應的以前美工給你的一套圖,一下減小了好幾張圖片,你說是否有關係呢?其次svg轉換成xml後大小也有相應的縮減,這個真的是成倍減小大的! 可是,可是,可是。。。這個在須要適配,適配,適配!FUCK 0.0!話說Android在適配這點上真心難受!仍是看解決辦法吧!在你的app->build.gradle中的defaultConfig標籤中添加以下內容:
//5.0的兼容適配
        //5.0如下 將svg圖片生成指定維度的png圖片,下面寫幾個就會生成幾個相應的圖片
        vectorDrawables.generatedDensities('xhdpi','xxhdpi')
        //5.0以上 以上使用support-v7進行兼容
        vectorDrawables.useSupportLibrary = true
複製代碼

這個是我找到的解決方案,可是我編譯了一下試了試。若是我單寫頂上那一句,會在相應的文件夾下生成出圖片,可是加上後面這句,相應的圖片就沒有了!我就好奇了,爲何呢?而後我找到了相應的手機試了一下,加不加上面這句沒有什麼卵用!我是在19版本上測試的!找這樣的手機真心費勁,要不是我父母我還真找不到!!!因此呢?你們斟酌一下吧!!!

  1. 這個問題,大神們早就幫咱們解決了!!!

下面這個是一個批量轉換工具!話說沒有什麼事情能難倒程序員!!!(對我失效)

MegatronKing/SVG-Android 下載這個jar包->svg2vector-cli-1.0.1.jar

而後一波小命令!!!咔咔咔

java -jar svg2vector-cli-1.0.1.jar -d D:\svg -o D:\vector
    
    -d 指定svg文件所在目錄
    -f 指定當個svg文件
    -h 設置轉換後svg高
    -w 設置轉換後svg寬
    -o 輸出android vector圖像目錄
複製代碼

而後轉換完成,而後複製就行了!!!

2. Tint着色器的使用與優化

你們在開發的時候不知道有沒有過這種體驗!在使用狀態選擇器的時候,須要使用兩張同樣顏色不一樣的相同圖片?其實使用tint屬性徹底能夠搞定(可是這裏指的是純色的那種圖片,那種花花綠綠的你仍是乖乖弄吧,除非你想把他變成純色!)

其實真的很簡單,只要在展現的圖片中添加

app:tint="顏色值"
複製代碼

這樣就能夠改變圖片的顏色,那麼狀態選擇器呢?怎麼用呢?其實很簡單了!下面咱們來看代碼!

先來看看兩個狀態選擇器的代碼:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@drawable/ic_arrow_back_black_24dp" android:state_pressed="true" />
    <item android:drawable="@drawable/ic_arrow_back_black_24dp" android:state_pressed="false" />
</selector>
複製代碼

可能你會奇怪了,爲何兩個圖片是同樣的?看到後面你就懂了!

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:color="@android:color/white" android:state_pressed="true" />
    <item android:color="@android:color/black" />
</selector>
複製代碼

其實原理是這樣的,狀態選擇器的話呢?只要你經過tint的狀態選擇器改變圖片的顏色就能夠了!

可是這裏面有幾個點須要注意下:

  1. 顏色的那個狀態選擇器要方法color文件夾下;
  2. 設置tint的時候要使用app爲前綴,不然5.0如下的會報錯;
  3. 若是你設置的是svg的圖片要使用srcCompat若是是正常圖片使用src就行了。

基本上這層優化就到這裏了!

3. 資源打包配置優化

其實這個標題說的有點大,其實就是刪除沒必要要的語言!!!

可能大家沒有留意過,在你用Android Studio查看你的apk的時候,會看到這樣的東西!

效果圖

在我畫框的地方,有不少中語言的使用?你會好奇的問?我沒有設置過語言啊?這都從哪裏跑出來的呢?其實實在v7包中的!其實咱們通常的應用不會涉及到這些語言的!因此咱們只留下其中的一種或幾種就能夠了。具體怎麼作呢?其實就只有一行代碼。。。

在app的build.gradle中的defaultConfig中添加這樣一句就能夠了!

resConfigs('zh-rCN'')
複製代碼

這裏其實你還能夠添加多個,直接用逗號鏈接就能夠了!

優化後就變成下面這個樣子了!!!

效果圖

4. 動態庫的打包配置

其實說到動態庫的話,基本上就是.so引入的動態庫,其實這裏有很大的優化空間!其實你能夠解壓比較大型的項目,其實沒有那麼多so文件的類型!

平時咱們開發的時候,基本上都是這麼寫的!

sourceSets{
        main{
            jniLibs.srcDirs = ['libs']
        }
    }
複製代碼

而後

ndk{
        abiFIlters('armeabi','armeabi-v7a','xxx'....)
    }
複製代碼

是否是每次像導入百度語音等第三方庫的時候,說明文檔上這麼寫的咱們也就這麼弄的!可是其實咱們不須要這麼多的架構!

這裏簡單說一下經常使用的幾個

armeabi 真機 x86 模擬器

其實咱們真是開發的話,直接使用armeabi就能夠了,若是你作那種定製化的apk的話,把其它的加上還能夠,可是若是正常的手機應用的話,這裏只須要armeabi的就能夠了!

若是你怎麼不知道用哪一個?你把比較大的項目解壓一下看看人家用哪一個你就用哪一個!哈哈

5. 移除無用的資源(物理與非物理刪除)

5.1 物理刪除(沒法找回,慎用)

關於物理刪除其實不少都不建議這麼使用,由於這個真的沒有什麼節操!這裏說兩個問題:

  • 若是大家項目沒有項目管理的話,真的不建議這麼使用,由於刪除以後你真的找不到了!是真的找不到了(若是git的話,拉個分支使勁磕就能夠)!
  • 若是有反射或者動態加載id的(ids.xml)的會直接刪除!可能會報錯!

好了,前提說好了!別到時候後刪了以後找我。。。

方案一: Refactor->Remove Unused Resource... 這裏會談個框,會有三個選項:

  • (Refactor)第一個是直接刪除了
  • (Preview)第二個會在下面彈出一個提醒,讓你選擇性的刪除
  • (Cancel)取消

方案二: Analyze->Run Inspection by name 這裏也會彈出個框輸入 unused ressources 而後又彈出個框,這裏就按照上面的圈圈點點,而後點OK這個時候你會發現底下會出現相應的無用資源這個時候你看哪一個不用就直接按照右邊的提示刪除就行了

再次強調,這個是物理刪除,刪除了就沒了!!!

5.2 非物理刪除

其實我估計google爸爸早就考慮到這個問題了,其實還有一種非物理刪除的,是在混淆的時候!相信你們在混淆的時候都寫過這句吧!

shrinkResources true
複製代碼

開始的時候我也不知道是什麼鬼,後來看別人說這個是啓動資源壓縮!

可是,若是你看過壓縮後的apk的話,這個資源壓縮是使用了一個佔位符而不是把相應的文件刪除!

其實這個資源壓縮還有一個比較又意思的點,能夠自定義要保留的內容:

res->raw->keep.xml 自定義要保留的東西

<resources 
    tools:keep="@layout/activity_main1"   保留誰這裏就能夠寫誰
    tools:shrinkMode="strict"/> 
複製代碼

這個是看谷歌文檔中寫的!可是真的不知道爲何還要保留?處於什麼緣由呢?還請懂的大神指點!!!

6. 代碼混淆

關於這個我不許備在這裏講,代碼混淆網上一搜一大把!基本上一個固定模板加上你引入的第三方庫的混淆就ok了(注意實體類就行了,每次我都忘)!

7. webp轉換(api等級18)

關於webp百度百科是這麼解釋的。 這個須要api的等級最低爲18,如今基本上均可以知足需求!

這個使用的時候很簡單,選中圖片直接右鍵,conver to Webp...直接就能轉換過來!越大的圖片轉換節約的體積也就越大!直接看相應的轉換就能夠了!

這裏我多嘮叨一句,其實有這個圖片壓縮網站仍是不錯的!每次美工給我圖片的時候我都會選擇壓縮一下,能節省點體積!關鍵是這個網站能夠批量上傳,這個纔是重點!而後你再webp就能夠了!其實我我的以爲,除非引導圖等...比較大的圖,不然沒有必要使用webp!我的感受而已。。。

8. 資源混淆

關於資源混淆基本上是美團和微信的兩大方案,我還在整理!

  • 微信的方案開源了!
  • 美團的貌似是沒有開源,可是在相應的技術博客中寫了

等整理好了以後在貼出來!


基本上我如今的項目體積優化的話,就弄了這麼多,還請大佬們指點!!!

相關文章
相關標籤/搜索