App 體積減小

目錄

一削咆、分析app大小

1.使用Android Studio2.2新功能直接分析APK的大小

Build > Analyz APK

Paste_Image.png

2.各個文件介紹

assets:存放一些配置文件
res:資源文件,圖片蠢笋、字符串拨齐、xml等
classes.dex:字節(jié)碼文件
resources.arsc:編譯后的二進制資源文件
META-INF:存放的是簽名信息,用來保證apk包的完整性和系統(tǒng)的安全昨寞。
接下來就從classes.dex , lib , assets下入手瞻惋。


二、app 體積減小方案

1.使用一套資源

對于絕大對數(shù)APP來說援岩,只需要取一套設計圖就足夠了歼狼。鑒于現(xiàn)在分辨率的趨勢,建議取1280 * 720p的資源享怀,放到xxhdpi目錄羽峰。相對于多套資源,只使用720P的一套資源添瓷,在視覺上差別不大梅屉,但卻能顯著的減少資源占用大小。


Paste_Image.png

注意:單套圖導致的壓縮和放大鳞贷,對性能的影響顯而易見坯汤。權衡利弊。


2.開啟minifyEnabled混淆代碼

在gradle使用minifyEnabled進行Proguard混淆的配置搀愧,可大大減小APP大卸枘簟:

android {
    buildTypes {
        release {
            minifyEnabled true
        }
    }
}

在proguard中疆偿,是否保留符號表對APP的大小是有顯著的影響的,可酌情不保留搓幌,但是建議盡量保留用于調試杆故。

3.開啟shrinkResources去除無用資源

在gradle使用shrinkResources去除無用資源,效果非常好鼻种。

android {
    buildTypes {
        release {
            shrinkResources true
        }
    }
}

注意:在release下可能會引發(fā)Resources$NotFoundException: Resource ID #0x4反番,把有用的資源移除掉了。添加了shrinkResources true打完包時候要多測一測叉钥。
解決辦法:
方案一
放棄使用shrinkResources true
方案二
參考google關于shrink resource
新建 res/raw/keep.xml后加入如下示例:

<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:tools="http://schemas.android.com/tools"
    tools:keep="@layout/l_used*_c,@layout/l_used_a,@layout/l_used_b*,@drawable/icon"
    tools:discard="@layout/unused2" />

保留文件規(guī)則簡單介紹罢缸,資源文件相對路徑加上圖片文件名(不需要擴展名)
執(zhí)行 ./gradlew clean assembleRelease –info|grep “Skipped unused resource” 觀察是否安全圖片給壓縮同時檢查解壓縮后文件是否為0


4.刪除無用的語言資源以及圖片資源

大部分應用其實并不需要支持幾十種語言的國際化支持。還好強大的gradle支持語言的配置投队,比如國內應用只支持中文

android {
    defaultConfig {
        resConfigs "zh"
        resConfigs "nodpi", "hdpi", "xhdpi", "xxhdpi", "xxxhdpi"
    }
}

5.對圖片進行無損壓縮

android打包本身會對png進行無損壓縮枫疆,所以使用像tinypng這樣的有損壓縮是有必要的。
重點是Tinypng使用智能有損壓縮技術敷鸦,以盡量少的失真換來圖片大小的銳減息楔,效果非常好,強烈推薦扒披。


6.使用jpg格式

如果對于非透明的大圖值依,jpg將會比png的大小有顯著的優(yōu)勢,雖然不是絕對的碟案,但是通常會減小到一半都不止愿险。
在啟動頁,活動頁等之類的大圖展示區(qū)采用jpg將是非常明智的選擇价说。


7.使用webp格式

一種圖片文件格式辆亏,在相同壓縮標準下,webp的有損壓縮能比jpg小25-34%鳖目。webp支持透明度扮叨,壓縮比比jpg更高但顯示效果卻不輸于jpg,官方評測quality參數(shù)等于75均衡最佳领迈。
相對于jpg彻磁、png,webp作為一種新的圖片格式狸捅,限于android的支持情況暫時還沒用在手機端廣泛應用起來衷蜓。從Android 4.0+開始原生支持,但是不支持包含透明度薪贫,直到Android 4.2.1+才支持顯示含透明度的webp,使用的時候要特別注意刻恭。使用Fresco支持webp格式圖片瞧省。
如果在API<14的系統(tǒng)也要支持webP圖片加入扯夭。

// 在API < 14的系統(tǒng)如也要支持 webP圖片的話加入
compile 'com.facebook.fresco:animated-base-support:0.12.0'
// 支持Gif圖片,需加入
compile 'com.facebook.fresco:animated-gif:0.12.0'
// 支持webP圖片的動態(tài)圖鞍匾,需加入
compile 'com.facebook.fresco:animated-webp:0.12.0'
// 支持webP圖片的靜態(tài)圖交洗,需加入
compile 'com.facebook.fresco:webpsupport:0.12.0'

常用的webp轉換工具:XnConvet , 智圖 , ISparta


8.縮小大圖

如果經(jīng)過上述步驟之后,你的工程里面還有一些大圖橡淑,考慮是否有必要維持這樣的大尺寸构拳,是否能適當?shù)目s小。
事實上梁棠,由于設計師出圖的原因置森,我們拿到的很多圖片完全可以適當?shù)目s小而對視覺影響是極小的。


9.覆蓋第三庫里的大圖

有些第三庫里引用了一些大圖但是實際上并不會被我們用到符糊,就可以考慮用1x1的透明圖片覆蓋凫海。
你可能會有點不舒服,因為你的drawable下竟然包含了一些莫名其妙的名稱的1x1圖片…

1×1像素圖片.png

10. 刪除armable-v7包下的so

CPU(7) ABI
ARMV5 armeabi
ARMV7 armeabi-v7a
X86 X86
MIPS mips
ARMV8 arm64-v8a
MIPS64 mips64
x86_64 x86_64

Android 目前支持的CPU架構和對應的二進制接口ABI (Application Binary Interface)

CPU(7) ABI
ARMV5 armeabi
ARMV7 armeabi-v7a
X86 X86
MIPS mips
ARMV8 arm64-v8a
MIPS64 mips64
x86_64 x86_64

基本上armable的so也是兼容armable-v7的男娄,armable-v7a的庫會對圖形渲染方面有很大的改進行贪,如果沒有這方面的要求,可以精簡模闲。
這里不排除有極少數(shù)設備會Crash建瘫,可能和不同的so有一定的關系,請大家務必測試周全后再發(fā)布尸折。


11.限制app支持的CPU架構的數(shù)目啰脚。刪除x86包下的so

在當前的Android生態(tài)系統(tǒng)中,讓app只支持armabi和x86架構就能夠了翁授。
與第十條不同的是拣播,x86包下的so在x86型號的手機是需要的,如果產(chǎn)品沒用這方面的要求也可以精簡收擦。
建議實際工作的配置是只保留armable贮配、armable-x86下的so文件,算是一個折中的方案塞赂。


12.使用微信資源壓縮打包工具

微信資源壓縮打包工具通過短資源名稱泪勒,采用7zip對APP進行極致壓縮實現(xiàn)減小APP的目標,效果非常的好宴猾,強烈推薦圆存。
詳情參考:Android資源混淆工具使用說明
原理介紹:安裝包立減1M–微信Android資源混淆打包工具
建議開啟7zip,注意白名單的配置仇哆,否則會導致有些資源找不到沦辙,官方已經(jīng)發(fā)布AndResGuard到gradle中了,非常方便:

apply plugin: 'AndResGuard'
buildscript {
    dependencies {
        classpath 'com.tencent.mm:AndResGuard-gradle-plugin:1.1.7'
    }
}
andResGuard {
    mappingFile = null
    use7zip = true
    useSign = true
    keepRoot = false
    // add <your_application_id>.R.drawable.icon into whitelist.
    // because the launcher will get thgge icon with his name
    def packageName = <your_application_id>
    whiteList = [
        //for your icon
        packageName + ".R.drawable.icon",
        //for fabric
        packageName + ".R.string.com.crashlytics.*",
        //for umeng update
        packageName + ".R.string.umeng*",
        packageName + ".R.string.UM*",
        packageName + ".R.string.tb_*",
        packageName + ".R.layout.umeng*",
        packageName + ".R.layout.tb_*",
        packageName + ".R.drawable.umeng*",
        packageName + ".R.drawable.tb_*",
        packageName + ".R.anim.umeng*",
        packageName + ".R.color.umeng*",
        packageName + ".R.color.tb_*",
        packageName + ".R.style.*UM*",
        packageName + ".R.style.umeng*",
        packageName + ".R.id.umeng*"
    ]
    compressFilePattern = [
        "*.png",
        "*.jpg",
        "*.jpeg",
        "*.gif",
        "resources.arsc"
    ]
    sevenzip {
        artifact = 'com.tencent.mm:SevenZip:1.1.7'
        //path = "/usr/local/bin/7za"
    }
}

會生成一個andresguard/resguard的Task讹剔,自動讀取release簽名進行重新混淆打包油讯。


13.使用provided編譯

對于一些庫是按照需要動態(tài)的加載详民,可能在某些版本并不需要,但是代碼又不方便去除否則會編譯不過陌兑。
使用provided可以保證代碼編譯通過沈跨,但是實際打包中并不引用此第三方庫,實現(xiàn)了控制APP大小的目標兔综。
但是也同時就需要開發(fā)者自己判斷不引用這個第三方庫時就不要執(zhí)行到相關的代碼饿凛,避免APP崩潰。


14.使用shape背景

特別是在扁平化盛行的當下软驰,很多純色的漸變的圓角的圖片都可以用shape實現(xiàn)涧窒,代碼靈活可控,省去了大量的背景圖片碌宴。


15.使用著色方案

相信你的工程里也有很多selector文件杀狡,也有很多相似的圖片只是顏色不同,通過著色方案我們能大大減輕這樣的工作量贰镣,減少這樣的文件呜象。
借助于android support庫可實現(xiàn)一個全版本兼容的著色方案,參考代碼:DrawableLess.java


16.在線化素材庫

如果你的APP支持素材庫(比如聊天表情庫)的話碑隆,考慮在線加載模式恭陡,因為往往素材庫都有不小的體積。
這一步需要開發(fā)者實現(xiàn)在線加載上煤,一方面增加代碼的復雜度休玩,一方面提高了APP的流量消耗,建議酌情選擇


17.避免重復庫

避免重復庫看上去是理所當然的劫狠,但是秘密總是藏的很深拴疤,一定要當心你引用的第三方庫又引用了哪個第三方庫,這就很容易出現(xiàn)功能重復的庫了独泞,比如使用了兩個圖片加載庫:Glide和Picasso呐矾。
通過查看exploded-aar目錄和External Libraries或者反編譯生成的APK,盡量避免重復庫的大小懦砂,減小APP大小蜒犯。


18.使用更小的庫

同樣功能的庫在大小上是不同的,甚至會懸殊很大荞膘。
如果并無對某個庫特別需求而又對APP大小有嚴格要求的話罚随,比較這些相同功能第三方庫的大小,選擇更小的庫會減小APP大小羽资。


19.支持插件化

過去的一年淘菩,插件化技術雨后春筍一樣的都冒了出來,這些技術支持動態(tài)的加載代碼和動態(tài)的加載資源屠升,把APP的一部分分離出來了潮改,對于業(yè)務龐大的項目來說非常有用费奸,極大的分解了APP大小。
因為插件化技術需要一定的技術保障和服務端系統(tǒng)支持进陡,有一定的風險,如無必要(比如一些小型項目微服,也沒什么擴展業(yè)務)就不需要了趾疚,建議酌情選擇。


20.精簡功能業(yè)務

這條完全取決于業(yè)務需求以蕴。
從統(tǒng)計數(shù)據(jù)分析砍掉一些沒用的功能是完全有可能的糙麦,甚至干脆去掉一些花哨的功能出個輕聊版、極速版也不是不可以的丛肮。


21.重復執(zhí)行第1到20條

多次執(zhí)行上述步驟赡磅,你總能發(fā)現(xiàn)一些蛛絲馬跡,這是一個好消息宝与,不是嗎焚廊?


22 Facebook的redex優(yōu)化字節(jié)碼

redex是facebook發(fā)布的一款android字節(jié)碼的優(yōu)化工具,需要按照說明文檔自行配置一下习劫。

redex input.apk -o output.apk --sign -s <KEYSTORE> -a <KEYALIAS> -p <KEYPASS>

下面我們來看看它的效果咆瘟,僅redex的話,減小了157k:


Paste_Image.png

先進行微信混淆诽里,再進行 redex 袒餐。
據(jù)反應redex后會有崩潰的現(xiàn)象,這個要留意一下谤狡,我這里壓縮之后都是可以正常運行的灸眼。

三、后續(xù)補充
如果不是非要用到v7包可以將v7包刪掉墓懂,可以小1兆


簡要評估

指南條例 適用范圍 易用性 風險指數(shù) 備注
使用一套資源 非極高UI要求的APP -
開啟minifyEnabled 全部 -
開啟shrinkResources 全部 -
刪除無用的語言資源 非全球國際化應用 -
使用tinypng有損壓縮 非極高UI要求的APP -
使用jpg格式 僅限非透明大圖 -
使用webp格式 僅限4.0+,4.2+設備 -
縮小大圖 限允許縮小的大圖 -
覆蓋第三庫里的無用大圖 全部 -
刪除armable-v7包下的so 限允許對極少數(shù)設備不兼容 -
刪除x86包下的so 限允許對x86設備不兼容 -
使用微信資源壓縮打包工具 全部 切記要配置白名單
使使用provided編譯 全部 容錯處理
使用shape背景 全部 -
使用著色方案 全部 -
表情在線化 限含表情包的APP -
避免重復庫 全部 -
使用更小的庫 全部 -
支持插件化 限擴展性要求高的APP -
精簡功能業(yè)務 限允許精簡的APP -
Redex優(yōu)化字節(jié)碼 全部 -
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末焰宣,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子拒贱,更是在濱河造成了極大的恐慌宛徊,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,110評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件逻澳,死亡現(xiàn)場離奇詭異闸天,居然都是意外死亡,警方通過查閱死者的電腦和手機斜做,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,443評論 3 395
  • 文/潘曉璐 我一進店門苞氮,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事伍宦。” “怎么了签舞?”我有些...
    開封第一講書人閱讀 165,474評論 0 356
  • 文/不壞的土叔 我叫張陵贷帮,是天一觀的道長戚揭。 經(jīng)常有香客問我,道長撵枢,這世上最難降的妖魔是什么民晒? 我笑而不...
    開封第一講書人閱讀 58,881評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮锄禽,結果婚禮上潜必,老公的妹妹穿的比我還像新娘。我一直安慰自己沃但,他們只是感情好磁滚,可當我...
    茶點故事閱讀 67,902評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著宵晚,像睡著了一般垂攘。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上淤刃,一...
    開封第一講書人閱讀 51,698評論 1 305
  • 那天搜贤,我揣著相機與錄音,去河邊找鬼钝凶。 笑死仪芒,一個胖子當著我的面吹牛,可吹牛的內容都是我干的耕陷。 我是一名探鬼主播掂名,決...
    沈念sama閱讀 40,418評論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼哟沫!你這毒婦竟也來了饺蔑?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,332評論 0 276
  • 序言:老撾萬榮一對情侶失蹤嗜诀,失蹤者是張志新(化名)和其女友劉穎猾警,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體隆敢,經(jīng)...
    沈念sama閱讀 45,796評論 1 316
  • 正文 獨居荒郊野嶺守林人離奇死亡发皿,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,968評論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了拂蝎。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片穴墅。...
    茶點故事閱讀 40,110評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出玄货,到底是詐尸還是另有隱情皇钞,我是刑警寧澤,帶...
    沈念sama閱讀 35,792評論 5 346
  • 正文 年R本政府宣布松捉,位于F島的核電站夹界,受9級特大地震影響,放射性物質發(fā)生泄漏隘世。R本人自食惡果不足惜掉盅,卻給世界環(huán)境...
    茶點故事閱讀 41,455評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望以舒。 院中可真熱鬧,春花似錦慢哈、人聲如沸蔓钟。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,003評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽滥沫。三九已至,卻和暖如春键俱,著一層夾襖步出監(jiān)牢的瞬間兰绣,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,130評論 1 272
  • 我被黑心中介騙來泰國打工编振, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留缀辩,地道東北人。 一個月前我還...
    沈念sama閱讀 48,348評論 3 373
  • 正文 我出身青樓踪央,卻偏偏與公主長得像臀玄,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子畅蹂,可洞房花燭夜當晚...
    茶點故事閱讀 45,047評論 2 355

推薦閱讀更多精彩內容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,178評論 25 707
  • 本文會不定期更新健无,推薦watch下項目。如果喜歡請star液斜,如果覺得有紕漏請?zhí)峤籭ssue累贤,如果你有更好的點子可以...
    天之界線2010閱讀 18,234評論 19 153
  • 紫馨瑜伽館(組織)為了招收學員(目的),周六在公園舉辦免費瑜伽教學(商業(yè)經(jīng)營活動)少漆。通過認真的教授動作臼膏,和仔細的糾...
    依依999閱讀 182評論 0 0
  • applogin.jsp row到底是什么?還有value是什么示损? formatter是單元格的格式化函數(shù)讶请,需要三...
    keaidelele閱讀 591評論 0 50
  • 安全型依附(Secure attachment) 編輯 一個安全型依附的小孩在陌生情境中,當主要照顧者(普遍為媽媽...
    陳瀟絲閱讀 1,154評論 0 0