apk性能優化--瘦身的那些事兒

前言:

你是否曾今被迫接手一個浩瀚又陌生的項目,面對繁雜的代碼總有些力不從心且心聲厭倦;你是否曾今經歷碼字五分鐘,編譯兩小時;你是否曾今在下載某一款app時因爲要下載很久而吐槽或放棄。而這些或多或少都和代碼不規範、冗餘,apk體積過大有關,因此apk瘦身在android應用的性能優化上來說也是不可繞過的一部分。接下來我們就來聊聊apk瘦身的那些事兒。

 

Apk Analyzer:

爲了更好、更直觀的說明apk瘦身的必要性,我特意找了一個以前無用的代碼,接下來我們就給這個代碼瘦個身。

Apk analyzer是android studio2.2之後自帶的apk分析工具,它能夠通過apk文件查看各個目錄及文件的大小,可以查看apk版本信息、也可以直接比較新舊版本apk,直觀的發現文件大小變化。我們可以通過點擊Android studio菜單欄Build -> Analyze Apk...彈窗選擇我們需要分析的apk。打開後視圖如下:

apk analyzer
通過apk analyzer分析apk

通過上圖可知,這個apk大小爲172.6MB,通過Google play壓縮大小爲121.1MB,其中lib、assets、res是體積過大的主要文件夾。因此該apk的優化思路就是儘量去除無用的資源及jar包。接下來我們可以開始進行瘦身了,最後再通過Apk Analyzer來做一個前後比較,這樣我們就可以很直觀的發現是哪些地方瘦下去了。

 

Lint:

Lint是android開發者們常用的工具之一,也是Android Studio自帶的代碼掃描工具。它可以識別出項目中那些沒有被任何代碼所引用的資源文件,硬編碼,重複的圖標等一系列的問題。我們可以通過點擊Android Studio菜單欄中的Analyze->Inspect Code...彈窗選擇要掃描的具體範圍然後進行掃描。我們對項目的全部內容進行掃描,結果如下圖所示。

掃描結果展示
Inspect Code掃描結果

左邊是問題的列表,右邊是錯誤的類型、文件的檢測報告,也提供了一些操作建議。一般情況下我們可能只想直接清除無用資源而不關心掃描的問題。那麼我們可以點擊Analyze->Run Inspection by name彈窗直接搜索"unuser resources"無用資源來進行掃描。掃描結果如下,點擊Remove All Unused Resources來清除無用資源。

Lint掃描結果

我們也可以在Gradle中配置lintOptions來更好的使用Lint。

    lintOptions {   //關於Lint的Gradle配置
        // 關閉對您指定的問題ID的檢查。
        disable 'TypographyFractions','TypographyQuotes'
        // 打開對您指定的問題ID的檢查。
        enable 'RtlHardcoded','RtlCompat', 'RtlEnabled'
        // 要僅對問題ID的子集啓用檢查並忽略所有其他問題,請改爲使用“ check”屬性列出問題ID。
        // 此屬性將覆蓋您使用上述屬性啓用或禁用的所有問題ID。
        check 'NewApi', 'InlinedApi'
        // 如果設置爲true,則關閉lint的分析進度報告。
        quiet true
        // 如果設置爲true(默認值),則在發現錯誤時停止構建。
        abortOnError false
        // 如果爲true,則僅報告錯誤
        ignoreWarnings true
    }

 

減小libs體積:

在NDK開發過程中往往會加入一些.so動態庫,它們會被添加到“x86”、“x86_64”,“armeabi”、“armeabi-v7a”和“arm64-v8a”下,在實際的引用中應用程序會根據手機的cpu來選擇對應文件夾下面的so庫去執行。因此優化思路就是去除那些不會被cpu所調用的動態庫文件。“x86”和“x86_64”通常在android模擬器上被使用,它們的區別在於是32位還是64位系統,“armeabi”針對的是普通的或舊的arm cpu,而"armeabi-v7a"則針對有浮點預算和高級擴展功能的arm v7 cpu。“arm64-v8a”是針對64位arm。瞭解了這些之後,我們可以根據應用的受衆羣體來合理的配置動態庫。我們這裏可以只支持"armeabi-v7a"即可,刪除其他所有的文件夾及文件夾下的so庫(記得備份喲),並在Gradle下配置abiFilters,如下所示:

    defaultConfig {
        ......      
        ndk {     //設置支持的SO庫架構(開發者可以根據需要,選擇一個或多個平臺的so)
            abiFilters "armeabi-v7a"
        }
    }

 

圖片和動畫的優化處理:

瘦身無非就兩點,一個是“刪除”、一個是“壓縮”。通過上面的方式該刪除的也都刪的差不多了,接下來就是壓縮的事兒了。首先我們可以將大部分圖片格式替換成webp格式。webp是2010發佈的,目的是爲了減少文件大小,但達到與jpeg格式相同的圖片質量。那麼我們該如何將PNG、JPG等格式的圖片轉化爲webp格式的文件呢。其實Android Studio就支持轉webp格式,選擇圖片資源右鍵,找到Convert to webp...即可轉爲爲webp格式的圖片。轉換後對比如下,這張圖片從3.5KB縮小到了1.8KB,效果顯著。

其次是儘量不要使用幀動畫,由於幀動畫的特殊性會佔用大量的空間,因此在項目中能避免就避免使用幀動畫,有時候交給UI解決會比我們自己處理好很多。最後有些圖片資源也可以交由服務器存儲,在必要時再下載使用。

 

其他:

有時候我們會引用一些第三方的jar包,但是又只用了裏面一小部分功能,那麼這時候我們可以考慮下載並引用完整代碼來替換jar包,同時刪除我們不需要的代碼,只保留需要的功能代碼即可,當然刪減別人的代碼這並不容易,因此我們可以在所有的優化瘦身完成之後再考慮優化這些第三方jar包。

如果項目中只需要支持少量的語言,我們也可以在Gradle中配置:

    defaultConfig {
        ......
        resConfigs "zh"
    }

另外我們還可以設置shrinkResources爲true來在編譯過程中刪除所有未被使用到的資源文件,其優點是不需要我們刪除物理資源。要使得shrinkResources起作用,必須保證minifyEnabled 爲true,因此其配置如下:

    buildTypes {
        release {
            minifyEnabled true
            shrinkResources true    //刪除所有未被使用到的資源文件
        }
    }

 

總結:

最後我們再通過apk analyzer的比較功能來比較一下瘦身前後的apk的體積變化。

apk瘦身前後對比圖
apk瘦身前後對比圖

從上圖我們可以看到經過一系列瘦身之後的apk總大小減少了65.9MB,減小了38.2%,效果還是很顯著的。當然這裏lib中的一些第三方jar包,assets中的資源還可以進一步優化壓縮,我這裏就沒有一一演示了。

 

參考資料:

Android性能優化之APK瘦身詳解(瘦身73%)

Android 工程師進階 34 講

Android Develop -- WebP

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章