Android Apk廋身完整版

Android Apk廋身完整總結(jié)

一.目的

  1. APK在安裝和更新之前都需要經(jīng)過(guò)網(wǎng)絡(luò)將其下載到手機(jī)睁本,如果APK越大消耗的流量就會(huì)越多窗轩,特別是對(duì)于使用移動(dòng)網(wǎng)絡(luò)的用戶來(lái)講,消耗流量越多就代表需要花更多的錢去購(gòu)買流量及穗。同時(shí)一些第三方應(yīng)用商城也會(huì)對(duì)上傳的APK大小有限制挚瘟,所以為了能夠讓產(chǎn)品能夠更受商城和用戶歡迎,APK瘦身是第一步兴猩,更小的APK標(biāo)示著更多地用戶愿意去下載和體驗(yàn)期吓。
    二.問(wèn)題排查

安裝包的組成

要對(duì)安裝包做瘦身,首先需要了解安裝包的組成結(jié)構(gòu)倾芝,這里簡(jiǎn)單的梳理了一下組成各個(gè)部分及其作用:


這里寫(xiě)圖片描述

其中讨勤,在安裝包中占比較大的包括:dex文件箭跳、res文件夾、assets文件夾潭千、lib文件夾以及resource.arsc文件谱姓。所以,接下來(lái)的瘦身優(yōu)化就是讓這些文件變小刨晴,以此達(dá)到瘦身的目的屉来。

在 Android Studio 2.2.3 開(kāi)始,就加入了瀏覽 APK 結(jié)構(gòu)的功能割捅,我們直接把安裝包拖入 IDE 奶躯,就可以直接瀏覽其組成和對(duì)應(yīng)大小,這樣能夠很方便的對(duì)比分析出每一步優(yōu)化后的結(jié)果亿驾。


這里寫(xiě)圖片描述

1.分析so庫(kù)49.2M打包成APK占用22.6M嘹黔,占比67.6

2.dex11M打包占用4.3M,占比12.9

3.資源文件7M打包6M莫瞬,占比17.9

上圖分析出so儡蔓、dex、資源文件總占比98.4疼邀,著手從這三點(diǎn)進(jìn)行優(yōu)化喂江。

三.優(yōu)化建議

  1. 資源瘦身

a) 盡量只保存一份圖片資源。開(kāi)發(fā)目錄下會(huì)有個(gè)mipmap 目錄用于適配不同 dpi 的屏幕旁振,下面是不同命名目錄所適配的 dpi 范圍


這里寫(xiě)圖片描述

目前市面上絕大部分機(jī)型都處于 xxhdpi 的適配范圍获询,所以可以考慮只保留 xxhdpi 目錄下一份圖片資源,具體保留哪個(gè)目錄下的資源和保留幾份資源還得依照應(yīng)用自身的實(shí)際機(jī)型分布決定拐袜。

b) 使用 Drawable XML吉嚣、Color、.9 PNG 代替 PNG

  • 一些情況下蹬铺,我們可以考慮使用 Drawable XML 來(lái)代替 PNG尝哆,如:漸變的背景圖,用幾行 XML
    就可以描繪出來(lái)甜攀,何必使用幾十到上百K的 PNG 文件秋泄;
  • 用 Color 代替 PNG,如:純色的背景规阀;
  • 從性能上看恒序,比起使用圖片資源需要先將其生成 Bitmap 再傳到底層交由 GPU 渲染,用 Drawable XML 和 Color 則更加高效谁撼,它是直接將 Shape 信息傳到底層由 GPU 進(jìn)行渲染歧胁,CPU 和 內(nèi)存的占用會(huì)更少;
  • 用 .9 PNG 代替 PNG,場(chǎng)景很多与帆,不舉例了了赌;

c) 使用 JPG 代替 PNG

  • 用 JPG 代替 PNG,由于 JPG 沒(méi)有 Alpha 通道玄糟,所以文件更小勿她,適用于不需要透明度的圖片可以考慮。

d) 可以使用shape作為背景

  • 很多點(diǎn)擊效果可能會(huì)使用到圖片阵翎,可以換成shape是實(shí)現(xiàn)逢并。

e) 使用vector

  • 每個(gè)drawable都有相應(yīng)尺寸的圖標(biāo),占了不少大小郭卫,后來(lái)部分用vector代替了圖片砍聊。注意一點(diǎn),Button在xml里設(shè)置app:srcCompat居然無(wú)效贰军,只能在代碼里設(shè)置玻蝌。
button.setImageResource(R.drawable.ic_favorite_border_black_24dp)。

f) 謹(jǐn)慎使用 WebP 代替 PNG

由于 WebP 效果好词疼,且相同效果下俯树, WebP 文件比 PNG 文件要小得多。

  • WebP 在 Android 端贰盗,最低只支持 4.0 许饿,要兼容 4.0 以下的環(huán)境需要額外引入兼容庫(kù),反而增大安裝包體積舵盈;

  • 解壓了 BAT 們的應(yīng)用陋率,以及同類競(jìng)品,基本沒(méi)有發(fā)現(xiàn)在資源文件中用 WebP 的秽晚;

g) 有損編碼格式的音頻文件代替無(wú)損格式的音頻文件

從下面這篇官方文檔
https://developer.android.com/guide/topics/media/media-formats.html

可以看到 Android 平臺(tái)支持的音視頻格式瓦糟,下面列出有損和無(wú)損常用的格式(不要認(rèn)為有損編碼就是音質(zhì)很差):

  • 無(wú)損格式:WAV,PCM爆惧,ALS狸页,ALAC锨能,TAK扯再,F(xiàn)LAC,APE址遇,WavPack(WV)

  • 有損格式:MP3熄阻,AAC,WMA倔约,Ogg Vorbis

實(shí)際開(kāi)發(fā)中需要使用音頻文件盡量采用 MP3秃殉、Ogg 這種有損格式,盡量不要用 WAV、PCM 這種無(wú)損音頻钾军。

h) 移除無(wú)用的資源

這里的移除無(wú)用資源文件主要分為兩個(gè)部分:不打包沒(méi)有使用的資源和刪除沒(méi)有使用的資源鳄袍。

  • 不打包沒(méi)有使用的資源,在項(xiàng)目的 build.gradle 中配置 shrinkResources true 即可吏恭。
  • 開(kāi)啟minifyEnabled混淆代碼拗小,在app/build.gradle打開(kāi)minifyEnabled為true
    這里寫(xiě)圖片描述
  • 如果APP支持中文,可以配置resConfigs樱哼,只支持中文
    這里寫(xiě)圖片描述
  • 刪除沒(méi)有使用的資源哀九,通過(guò) Android Studio 選中項(xiàng)目右鍵 => Analyze => Run Inspection by Name => 輸入 Unused resuroces


    這里寫(xiě)圖片描述

i) 工具

  • TinyPNG:https://tinypng.com/ ,支持對(duì) PNG/JPEG 文件做壓縮處理搅幅,效果不錯(cuò)阅束。

  • pngquant:https://pngquant.org/ , 支持 PNG 壓縮茄唐,有時(shí)候 TinyPNG 處理過(guò)的圖片噪點(diǎn)會(huì)稍多息裸,可以考慮用 pngquant 來(lái)處理。

  • ImageOptim:https://imageoptim.com/mac 沪编,支持壓縮 PNG/JPEG/GIF 界牡,而且效果顯著,可以看看這里 https://www.diycode.cc/topics/496 漾抬,遺憾的是它只支持 Mac 宿亡,Windows 黨很難過(guò)。

  • mozjpeg:https://imageoptim.com/mozjpeg 纳令, 用于 PNG 轉(zhuǎn) JPEG挽荠、JPEG 壓縮,效果很好平绩。

  • Adobe Audition CC:http://www.adobe.com/cn/products/audition.html 圈匆,Adobe 出品,支持對(duì)音頻的采樣率捏雌,分辨率和聲道數(shù)目做更改跃赚,以此達(dá)到裁剪音頻的目的(采樣率,分辨率和聲道數(shù)目是音頻文件格式的關(guān)鍵參數(shù)性湿,決定著音頻文件的大形嘲痢)。

  • 使用微信Android資源混淆工具(https://github.com/shwenzhang/AndResGuard
    AndResGuard打包命令行:gradlew resguardRelease肤频,最終的混淆APK會(huì)生成在{App}/build/output/apk/AndResGuard目錄下叹括。

j) 基于dex廋身

  • Facebook出品dex優(yōu)化框架ReDex,啟動(dòng)速度提升 20% 以上宵荒,Dex 大小減小 25%汁雷,對(duì)于內(nèi)存較小的機(jī)型啟動(dòng)速度的優(yōu)化效果尤其明顯净嘀,目前只支持Mac平臺(tái)、Linux平臺(tái)侠讯。

k) Native庫(kù)瘦身

  • Native 庫(kù)瘦身主要是減小對(duì) CPU 架構(gòu)的支持挖藏,配置起來(lái)很簡(jiǎn)單,在 build.gradle 使用 abiFilters 配置需要用到的 CPU 架構(gòu)厢漩,并將不需要兼容的 so 文件從項(xiàng)目中移除即可熬苍。我這邊最終只保留了對(duì) armeabi-v7a 支持。
    這里寫(xiě)圖片描述
  • 綜上所述袁翁,就可以有效的精簡(jiǎn)我們安裝包中的 lib 文件夾大小柴底,從而達(dá)到瘦身目的。也有一種做法是通過(guò)在 build.gradle 配置 include 來(lái)針對(duì)每個(gè) CPU 架構(gòu)生成單獨(dú)的安裝包粱胜,雖然看起來(lái)很不錯(cuò)柄驻,但是很多國(guó)內(nèi)應(yīng)用市場(chǎng)上架的時(shí)候并不支持這種每個(gè) CPU 配置一個(gè)包的做法,所以此做法較為雞肋焙压,不太建議去做鸿脓,如果應(yīng)用只上 Google Play ,那確實(shí)要比配置 abiFilters 好得多涯曲。

l) 代碼瘦身

這里可以做的事情也是很多野哭,主要如下:

  • 移除廢棄功能的代碼,反正有AS 幻件,刪了代碼隨時(shí)可以找回拨黔;

  • 移除重復(fù)的代碼,如:已經(jīng)有了的功能代碼绰沥,團(tuán)隊(duì)成員不知道自己又寫(xiě)了一套篱蝇,只能靠代碼 Review 解決了;

  • 移除功能重疊的框架徽曲,如:項(xiàng)目中有幾套網(wǎng)絡(luò)訪問(wèn)框架 Volley零截、Retrofit 等,同樣只能靠代碼 Review 解決秃臣;

  • 移除無(wú)用的 dependencies 或者 jar 包涧衙;

  • 減小對(duì) Support 兼容包的依賴,Support-V4 包非常大奥此,項(xiàng)目引入無(wú)疑會(huì)增大 dex 文件的大小弧哎,Google 已經(jīng)意識(shí)到這個(gè)問(wèn)題,所以 Support-V7 一開(kāi)始就做了拆分得院,并且開(kāi)始對(duì) Support-V4 做拆分傻铣,雖然目前成果還不明顯章贞,不過(guò)還是蠻值得期待的祥绞,特別是發(fā)現(xiàn)你少了 Support-V4 包后非洲,可能就從2個(gè) dex 變成1個(gè) dex 了呢;

  • 插件化蜕径,一種懶加載思想的體現(xiàn)两踏,先讓用戶能夠安裝宿主包,對(duì)于一些功能模塊做插件化兜喻,在特定的時(shí)機(jī)再下載安裝梦染;

參考:


 1. http://wuxiaolong.me/2017/03/19/ReduceAPKSize/?nsukey=52PBvRoPKrEz6vkSDHnnP1%2B%2FW5qJfm%2FOnA%2B1hvysYEEaCVd0IEgOQaWcv4Dc3HzKWh92wlOskWJ3ZXDPnHqhvsPU2d8ALMkpaJ54l5StPASm8bFZejhB80UIBcedUDia7GMYSEbOPnJ4FVE3OPCiVK5LinXoZRAR%2BsWA2J%2F04ipHrD5rVr1QLes9kY4snbaZ

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市朴皆,隨后出現(xiàn)的幾起案子帕识,更是在濱河造成了極大的恐慌,老刑警劉巖遂铡,帶你破解...
    沈念sama閱讀 211,376評(píng)論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件肮疗,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡扒接,警方通過(guò)查閱死者的電腦和手機(jī)伪货,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,126評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)钾怔,“玉大人碱呼,你說(shuō)我怎么就攤上這事∽谡欤” “怎么了愚臀?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,966評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)矾利。 經(jīng)常有香客問(wèn)我懊悯,道長(zhǎng),這世上最難降的妖魔是什么梦皮? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,432評(píng)論 1 283
  • 正文 為了忘掉前任炭分,我火速辦了婚禮,結(jié)果婚禮上剑肯,老公的妹妹穿的比我還像新娘捧毛。我一直安慰自己,他們只是感情好让网,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,519評(píng)論 6 385
  • 文/花漫 我一把揭開(kāi)白布呀忧。 她就那樣靜靜地躺著,像睡著了一般溃睹。 火紅的嫁衣襯著肌膚如雪而账。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,792評(píng)論 1 290
  • 那天因篇,我揣著相機(jī)與錄音泞辐,去河邊找鬼笔横。 笑死,一個(gè)胖子當(dāng)著我的面吹牛咐吼,可吹牛的內(nèi)容都是我干的吹缔。 我是一名探鬼主播,決...
    沈念sama閱讀 38,933評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼锯茄,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼厢塘!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起肌幽,我...
    開(kāi)封第一講書(shū)人閱讀 37,701評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤晚碾,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后喂急,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體迄薄,經(jīng)...
    沈念sama閱讀 44,143評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,488評(píng)論 2 327
  • 正文 我和宋清朗相戀三年煮岁,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了讥蔽。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,626評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡画机,死狀恐怖冶伞,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情步氏,我是刑警寧澤响禽,帶...
    沈念sama閱讀 34,292評(píng)論 4 329
  • 正文 年R本政府宣布,位于F島的核電站荚醒,受9級(jí)特大地震影響芋类,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜界阁,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,896評(píng)論 3 313
  • 文/蒙蒙 一侯繁、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧泡躯,春花似錦贮竟、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,742評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至写穴,卻和暖如春惰拱,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背啊送。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,977評(píng)論 1 265
  • 我被黑心中介騙來(lái)泰國(guó)打工偿短, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留欣孤,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,324評(píng)論 2 360
  • 正文 我出身青樓翔冀,卻偏偏與公主長(zhǎng)得像导街,于是被迫代替她去往敵國(guó)和親披泪。 傳聞我的和親對(duì)象是個(gè)殘疾皇子纤子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,494評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容

  • 本文來(lái)自尚妝Android團(tuán)隊(duì)青峰發(fā)表于尚妝博客 APK瘦身探索 最近幾周一直在研究如何為APK瘦身,折騰了很久款票,...
    尚妝產(chǎn)品技術(shù)刊讀閱讀 1,781評(píng)論 1 23
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,761評(píng)論 25 707
  • 最近幾周一直在研究如何為APK瘦身控硼,折騰了很久,是時(shí)候?qū)懫┛涂偨Y(jié)一下了艾少,雖然已經(jīng)準(zhǔn)備了下周一要在客戶端周會(huì)分享用...
    風(fēng)清袖一閱讀 1,045評(píng)論 1 10
  • 本文會(huì)不定期更新卡乾,推薦watch下項(xiàng)目。如果喜歡請(qǐng)star缚够,如果覺(jué)得有紕漏請(qǐng)?zhí)峤籭ssue幔妨,如果你有更好的點(diǎn)子可以...
    天之界線2010閱讀 18,200評(píng)論 19 153
  • 2017年還沒(méi)卸任 你看2018賊頭賊腦的的樣子 就要逼走它 差點(diǎn)忘記了 這年的春節(jié)我曾醉在紹興 . 小時(shí)候 一直...
    周延龍閱讀 246評(píng)論 0 2