Android SDK開發藝術探索(六)壓縮與優化

1、前言

本篇是Android SDK開發藝術探索系列的第六篇文章,簡單介紹了SDK開發中關於SDK包體積優化相關的知識。包括APK與AAR組成分析、SDK包大小與集成增量的概念以及SDK開發中的資源壓縮與優化思路。包體積的控制是一個極其繁瑣的系統工程,有很是多的方案能夠實踐,關鍵在於投入產出比。本文不曾想羅列網文中的全部優化方案,而是但願經過介紹簡單可行的配置來壓縮、優化SDK。更但願這是一個思惟上的啓發,喚醒一顆持續優化的心,以及在SDK開發中對於壓縮與優化實踐的特色。認識SDK組成,探索SDK開發在包體積壓縮、控制集成增量上的最佳實踐。android

系列文章:api

Android SDK開發藝術探索(一)開篇與設計安全

Android SDK開發藝術探索(二)Exception or ErrorCodemarkdown

Android SDK開發藝術探索(三)初始化網絡

Android SDK開發藝術探索(四)個性化配置app

Android SDK開發藝術探索(五)安全與校驗工具

Android SDK開發藝術探索(六)壓縮與優化oop

Android SDK開發藝術探索(七)依賴原則與打包方法佈局

2、apk與aar組成分析

2.一、APK文件組成

APK 文件由一個 Zip 壓縮文件組成,包含了構成應用的全部文件。包括 Java 類文件、資源文件和包含已編譯資源的文件。post

APK 包含以下目錄:

  • META-INF/:包含 CERT.SFCERT.RSA 簽名文件,以及 MANIFEST.MF 清單文件。
  • assets/:包含應用的資源;應用可使用 AssetManager 對象檢索這些資源。
  • res/:包含未編譯到 resources.arsc 中的資源。
  • lib/:包含特定於處理器軟件層的已編譯代碼。此目錄包含每種平臺類型的子目錄,如 armeabiarmeabi-v7aarm64-v8ax86x86_64mips

APK 還包含如下文件。在這些文件中,只有 AndroidManifest.xml 是必需的。

  • resources.arsc:包含已編譯的資源。此文件包含 res/values/ 文件夾的全部配置中的 XML 內容。打包工具會提取此 XML 內容,將其編譯爲二進制文件形式,並壓縮內容。此內容包括語言字符串和樣式,以及未直接包含在 resources.arsc 文件中的內容(例如佈局文件和圖片)的路徑。
  • classes.dex:包含以 Dalvik/ART 虛擬機可理解的 DEX 文件格式編譯的類。
  • AndroidManifest.xml:包含核心 Android 清單文件。此文件列出了應用的名稱、版本、訪問權限和引用的庫文件。該文件使用 Android 的二進制 XML 格式。

APK文件組成概覽

2.二、AAR文件組成

AAR 文件的文件擴展名爲 .aar,此文件自己也是一個 zip 文件,其中必須包含如下文件/目錄:

  • /AndroidManifest.xml
  • /classes.jar
  • /res/
  • /R.txt

此外,AAR 文件可能包含如下一個或多個可選文件/目錄:

  • /assets/
  • /libs/name.jar
  • /jni/abi_name/name.so(其中 abi_name 是 Android 支持的ABI之一)
  • /proguard.txt
  • /lint.jar
  • /api.jar
  • /public.txt(官方文檔將其定義爲必須包含,實測是能夠不包含的)

AAR文件組成概覽

3、SDK包大小與集成增量

首先咱們要區分一下這兩個概念:

**SDK包大小:**是指SDK包如AAR文件的大小,所佔體積;

**SDK集成增量:**是指APK集成AAR後的增量,也就是集成先後的APK體積差值。

這裏能夠明確的是:集成AAR後的APK體積**<集成AAR前的APK體積+**AAR體積。舉個例子:假如AAR有30M,APP集成該AAR後的增量通常都不會超過30M。而增量具體多少,跟主工程的實際資源或者依賴配置有關。而另外一種可能,某些AAR只能支持一種ABI,集成時爲了適配而修改了配置,最終反而使得整個APK的體積變小。

所以,爲了科普這一律念,不妨在SDK文檔或產品說明中備註SDK包大小以及預估的集成增量。對於APK大小敏感的用戶就能夠有一些心理準備。

4、SDK開發中的資源壓縮與優化思路

正如前言所說,本文無心羅列網文說起的全部壓縮優化方案,更多筆墨在於SDK開發場景下的簡單可行有效果的優化思路,以及針對SDK進行配置時潛在的那些坑。

4.一、常規編譯配置

資源優化與壓縮的常規作法就是開啓壓縮、混淆和優化功能。區別於app模塊,library模塊不能開啓shrinkResources的,這個編譯器會有提示:Resource shrinker cannot be used for libraries.

android {
        buildTypes {
            //注意,如下配置僅對項目的release版本生效,需注意調試時配置區別形成的版本差別問題
            release {
                // 開啓代碼壓縮,混淆和優化。
                minifyEnabled true
                // 開啓資源縮減,須要注意的是,library模塊不能開啓這一選項。
                shrinkResources true
                //默認加載的ProGuard規則文件,能夠在這裏加入自定義文件,或在proguard-rules.pro中配置排除的規則
                proguardFiles getDefaultProguardFile(
                        'proguard-android-optimize.txt'),
                        'proguard-rules.pro'
            }
        }
        ...
    }
複製代碼

4.二、資源壓縮與原生類庫配置

4.2.一、資源文件壓縮

資源文件指的是相似於:圖片、音頻、視頻等多媒體資源,這些資源均可以進行必定程度的壓縮優化。而且,若是你的項目不曾作過相似優化,簡單處理便可出效果。

針對圖片、音頻、視頻的壓縮、替換網絡上都有很是多的成熟方案,這裏就再也不一一說起了。

4.2.二、精簡原生類庫

按需配置jniLibs下保留的ABI目錄,如:armeabi-v7a、arm64-v8a

defaultConfig {
        ...
        ndk {
            abiFilters 'armeabi-v7a','arm64-v8a' //指定支持的ABIs
        }
        ...
    }
複製代碼

在SDK的開發與集成中,若是你的代碼包含SO庫,那麼這個配置很是重要。因爲不一樣的組件可能有不一樣的jniLibs目錄,若是不加以限制,那麼打包時就會將不完整的目錄打包進去,致使App崩潰。

舉個例子:

原App工程中只支持armeabi-v7a(因爲目錄刪的夠乾淨,gradle不配置也沒問題),此時若新增集成了一個包含armeabi-v7a,arm64-v8a兩種ABI的AAR,卻並無在gradle配置中限定須要支持的ABIs,那打出來的APK就會存在兩份SO文件,但只有armeabi-v7a文件夾下的SO是齊全的。這個APK在被支持arm64-v8a的手機加載時,就會默認去檢索arm64-v8a目錄下的SO,由於找不到原App相關的SO模塊,程序就崩潰了。

5、結語

本篇簡單介紹了SDK的文件組成、體積控制、優化方面的知識,以及在SDK開發與集成時須要注意的壓縮優化配置,但願喚起開發者對於SDK包體積與集成增量的感性認知與優化意識,爲探索如何開發一個優秀的SDK提供一些思路。項目優化來源於外部需求,更來源於開發者自身的認知與意識。

最後,若是本篇文檔對您的開發有所幫助或啓發,點贊/關注/分享三連就是對做者持續創做最好的激勵,感謝支持!

參考文章

版權聲明:

本文首發於個人專欄 AndDev安卓開發 已受權鴻洋公衆號獨家發佈。

相關文章
相關標籤/搜索