Android 最佳實踐-性能-減少APK大小

減小APK大小

    用戶通常避免下載過大的應用,尤其是新興市場,那裏的設備通常鏈接的是2G/3G網絡或者是按流量收費的,這篇文章講解如何減小你的APP包大小,從而讓更多的用戶下載。

理解apk的結構

    在討論如何減小app大小之前,先了解app包的結構對此是很有幫助的。APK包由一個ZIP文檔組成,該文檔包含了組成APP的所有文件,包括了 java class文件,資源文件,以及由資源編譯而來的文件。

    一個APK包含以下的目錄

    META-INF/ : 包括CERT.SF 和 CERT.RSA 兩個簽名文件以及 MANIFAST.MF 清單文件。

    ASSETS/: APP的額外資源文件,這些資源可以通過ASSETMANAGER對象進行檢索。

    res:/    包含沒有被編譯進resouces.arsc的資源文件。

    lib/:    包含了特定與處理器的軟件層代碼,這個目錄下包含有對應平臺的子目錄比如 armeabi , armeabi-v7a,arm64-v8a,x86,x86-64, mips

    APK文檔也包括如下的文件,其中只有Androidmanifest.xml是不可或缺的。

    resource.arsc : 包含編譯過的資源,這個文件包含了從 res/value中抽取的各個配置下的XML內容,經過打包後,這些內容轉 爲 二進制格式並歸檔,這些內容包括語言字符串和風格,以及那些沒有被編譯進來的資源的路徑,比如佈局文件和圖像等等。

    classes.dex : 包含了被編譯進該文件的class,這種格式可被devik/art虛擬機識別。

    Androidmanifest.xml : 包含了核心組件信息的清單文件,列明瞭名字,版本,存取權限,這個文件是以android二進制XML保存的

減小資源數量和大小

APK的大小影響APP的加載時間,內存使用和電量消耗。讓APK變小的最簡單方法之一就是減少資源的數量和大小,尤其是刪除沒有用到的資源,以及用可縮放drawable對象替換圖像文件,這一節將會討論這個方法已經其他幾個能減小apk大小的方法。

去掉沒有使用的資源

lint 工具,這是一個被集成到android studio 的靜態代碼分析器,用來檢查res文件夾下未使用到的資源,可以通過指定build.gradle配置中的shrinkResource 爲 enable 開啓這個功能,gradle會替你自動刪除這些資源。

使用該功能前必須先開啓shrinkResource,在構建過程中,proguard會去掉未用到的代碼,但是不會刪除未用到的資源,這些資源稍後由gradle刪除。

android gradle 插件0.7及以上,可以聲明APP支持的配置,gradle 用 resconfig,resconfigs,defaultconfig 將這些信息傳遞給構建系統,構建系統會阻止相關未配置的資源出現在APK中,從而減小APK的大小。

res/layout/preferences.xml: Warning: The resource R.layout.preferences appears
    to be unused [UnusedResources]
android {
   
// Other settings

    buildTypes
{
        release
{
            minifyEnabled
true
            shrinkResources
true
            proguardFiles getDefaultProguardFile
('proguard-android.txt'), 'proguard-rules.pro'
       
}
   
}
}

庫資源使用最小化

在開發android app的時候,通常會使用外部庫來增加可用性和功能。比如你會使用android support libaries 來增加用戶在舊平臺的體驗,或者使用 google play service 來對文本自動翻譯。

如果這個庫被設計用在桌面或者服務器端,那麼它可能包含未用到的方法和對象,爲了使用只包含需要用到的代碼,你可在許可證允許的情況下編輯庫文件或者使用對移動端友好的替代方案來添加所需的功能。

支持特定像素密度

Android 支持很多不同像素密度的設備,android 4.4及以上,framework支持多種密度 ; ldpi, mdpi,tvdpi,xhdpi,xxhdpi,xxxhdpi。

雖然android 支持所有這些像素密度,但是你不需要匹配每一種情況。

如果你知道你的用戶中有很小的一部分使用了特定的像素密度,那麼考慮是否需要匹配該密度。如果沒有與該像素密度匹配的的資源,android 會自動使用其他密度的資源進行縮放處理。

如果你的app只需要 可縮放的圖像文件,那麼可以把它們放在res/drawable-nodpi/文件夾下來節省更多空間,我們推薦每個APP至少在XXhdpi 下放置一個對應密度的圖像

使用 drawable 對象

一些圖像並不需要靜態圖片資源,framework可以在運行期間動態生成圖像,drawable 對象會佔用apk的一部分空間,此外,XML格式的drawable可以產生滿足材料設計語言規範的單色圖像。

重用資源

你可以分別使用不同的資源來展示不同的圖像變體,着色,陰影,旋轉版本的相同圖片。但是,我們建議用同一套資源,在運行時根據需要進行客製化。

android 提供了多種工具來改變物體的顏色,android 5.0或者以上 用 android:tint 或者android:tintmode,低版本則用 clolorfilter。

你不需要一張僅僅是旋轉了方向的圖片,下面的代碼片段提供了一個從拇指向上轉爲向下的旋轉180度的例子。

<?xml version="1.0" encoding="utf-8"?>
<rotate xmlns:android="http://schemas.android.com/apk/res/android"
   
android:drawable="@drawable/ic_thumb_up"
   
android:pivotX="50%"
   
android:pivotY="50%"
   
android:fromDegrees="180" />

使用代碼渲染

你可以通過代碼渲染圖片,從而減小APK體積,你不必存儲圖片所以減小了APK的大小。

處理PNG文件

aapt工具科技通過無損壓縮的方式優化放在res/drawable 的圖片,比如 aapt工具可以將使用不超過256種顏色的PNG圖片轉換爲8位的PNG圖片,轉換後的圖片質量相同但是內存佔用更少。

但是aapt有以下的限制

    不優化assets文件夾下的png圖片

    png圖片使用的顏色不能超過256種

    aapt會解壓已經壓縮的png圖片,爲了防止這樣,可以指定cruncherenable 這個標識爲disable來禁用該功能

壓縮png和jpeg文件

可以通過pngcrush,pngquant,zopflipng 來無損的壓縮png文件。其中 pngcrush 特別有效,這個工具通過遍歷png過濾器和壓縮特徵,使用兩者的結合來壓縮圖片,並選擇最小的壓縮配置進行輸出,至於壓縮jpeg文件,你可以使用packjpg和guetzli。

使用WebP文件格式

除了png和jpg,還可以使用webp這種格式,webp提供了有損的壓縮以及透明度,但是比jpeg和png有更好的壓縮效果。你可以使用Android studio 來轉化 BMP,JPG,PNG或者靜態gif爲 Webp格式。

使用向量圖形

你可以使用向量圖形來創建分辨率獨立的圖片和可縮放的媒體。使用這些圖形可以極大的減小APK的大小。

向量圖形在android 中表示爲vectorDrawable對象,一個100 比特的vectordrawable對象 可以生成整個屏幕大小的清晰圖像。

然而渲染vectorDrawable 會花費系統顯著的時間,更大的圖像意味着更多的時間,因此應該在只展示小圖像的時候使用vectorDrawable。

爲動畫圖片使用向量圖形

不要使用animateDrawable來創建逐幀動畫,因爲每一幀都需要對應的圖片,這樣會顯著的增加APK的大小,你可以使用animateVectorDrawable 來替代。

減少native和java代碼

這裏有幾個方法可以減少native和java代碼,刪除非必需的生成代碼,一個枚舉可以給classes.dex增加1k到1.4K大小,這種增加會在複雜系統和共享庫內會快速積累。如果可能使用@indef註釋將枚舉類抽取爲整形,這種轉換保留了枚舉類型所有的安全特點,減少了本地二進制文件大小。如果你使用本地代碼和NDK,同樣可以通過優化代碼減少文件大小。有兩個有用的技術,分別是刪除調試標記和不提取本地庫。

刪除調試標記

在開發時使用調試標記是很有用的,使用NDK提供的armeabi-string 工具去除不必要的調試標記,之後再編譯用於發佈的版本。

避免抽取本地庫

在apk中存儲未壓縮的so文件,以及在manifest文件的application 標籤設置 android:extranativelib 爲 false ,這樣會禁用packagemanager在apk安裝過程中將 so文件拷貝到文件系統,這對增量更新有好處,這會減小更新的大小。

維護多個瘦APK

你的apk可能包含了用戶下載了而沒有使用的資源,比如地區和語言信息。爲了使用戶的下載量最小你可以分割apk,按屏幕大小,GPU支持的紋理劃分。用戶下載你的APP時,設備會根據設置和特徵收到正確的apk,在這種方式下設備不會收到不支持特徵所使用的資源。比如用戶的設備是ldpi像素密度,那麼他不需要xxxhdpi的資源這些是爲更高像素密度的設備準備的。


文章轉自:CSDN:https://blog.csdn.net/sd3425973/article/details/80338593

原文鏈接 https://developer.android.com/topic/performance/reduce-apk-size
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章