本篇是Android SDK開發藝術探索系列的第六篇文章,簡單介紹了SDK開發中關於SDK包體積優化相關的知識。包括APK與AAR組成分析、SDK包大小與集成增量的概念以及SDK開發中的資源壓縮與優化思路。包體積的控制是一個極其繁瑣的系統工程,有很是多的方案能夠實踐,關鍵在於投入產出比。本文不曾想羅列網文中的全部優化方案,而是但願經過介紹簡單可行的配置來壓縮、優化SDK。更但願這是一個思惟上的啓發,喚醒一顆持續優化的心,以及在SDK開發中對於壓縮與優化實踐的特色。認識SDK組成,探索SDK開發在包體積壓縮、控制集成增量上的最佳實踐。android
系列文章:api
APK 文件由一個 Zip 壓縮文件組成,包含了構成應用的全部文件。包括 Java 類文件、資源文件和包含已編譯資源的文件。post
APK 包含以下目錄:
META-INF/
:包含 CERT.SF
和 CERT.RSA
簽名文件,以及 MANIFEST.MF
清單文件。assets/
:包含應用的資源;應用可使用 AssetManager
對象檢索這些資源。res/
:包含未編譯到 resources.arsc
中的資源。lib/
:包含特定於處理器軟件層的已編譯代碼。此目錄包含每種平臺類型的子目錄,如 armeabi
、armeabi-v7a
、arm64-v8a
、x86
、x86_64
和 mips
。APK 還包含如下文件。在這些文件中,只有 AndroidManifest.xml
是必需的。
resources.arsc
:包含已編譯的資源。此文件包含 res/values/
文件夾的全部配置中的 XML 內容。打包工具會提取此 XML 內容,將其編譯爲二進制文件形式,並壓縮內容。此內容包括語言字符串和樣式,以及未直接包含在 resources.arsc
文件中的內容(例如佈局文件和圖片)的路徑。classes.dex
:包含以 Dalvik/ART 虛擬機可理解的 DEX 文件格式編譯的類。AndroidManifest.xml
:包含核心 Android 清單文件。此文件列出了應用的名稱、版本、訪問權限和引用的庫文件。該文件使用 Android 的二進制 XML 格式。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
(官方文檔將其定義爲必須包含,實測是能夠不包含的)首先咱們要區分一下這兩個概念:
**SDK包大小:**是指SDK包如AAR文件的大小,所佔體積;
**SDK集成增量:**是指APK集成AAR後的增量,也就是集成先後的APK體積差值。
這裏能夠明確的是:集成AAR後的APK體積**<集成AAR前的APK體積+**AAR體積。舉個例子:假如AAR有30M,APP集成該AAR後的增量通常都不會超過30M。而增量具體多少,跟主工程的實際資源或者依賴配置有關。而另外一種可能,某些AAR只能支持一種ABI,集成時爲了適配而修改了配置,最終反而使得整個APK的體積變小。
所以,爲了科普這一律念,不妨在SDK文檔或產品說明中備註SDK包大小以及預估的集成增量。對於APK大小敏感的用戶就能夠有一些心理準備。
正如前言所說,本文無心羅列網文說起的全部壓縮優化方案,更多筆墨在於SDK開發場景下的簡單可行有效果的優化思路,以及針對SDK進行配置時潛在的那些坑。
資源優化與壓縮的常規作法就是開啓壓縮、混淆和優化功能。區別於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'
}
}
...
}
複製代碼
資源文件指的是相似於:圖片、音頻、視頻等多媒體資源,這些資源均可以進行必定程度的壓縮優化。而且,若是你的項目不曾作過相似優化,簡單處理便可出效果。
針對圖片、音頻、視頻的壓縮、替換網絡上都有很是多的成熟方案,這裏就再也不一一說起了。
按需配置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模塊,程序就崩潰了。
本篇簡單介紹了SDK的文件組成、體積控制、優化方面的知識,以及在SDK開發與集成時須要注意的壓縮優化配置,但願喚起開發者對於SDK包體積與集成增量的感性認知與優化意識,爲探索如何開發一個優秀的SDK提供一些思路。項目優化來源於外部需求,更來源於開發者自身的認知與意識。
最後,若是本篇文檔對您的開發有所幫助或啓發,點贊/關注/分享三連就是對做者持續創做最好的激勵,感謝支持!
參考文章
版權聲明:
本文首發於個人專欄 AndDev安卓開發 已受權鴻洋公衆號獨家發佈。