頭條APK瘦身之路

隨著版本迭代,功能增加安裝包體積也會慢慢增大愚战。

今日頭條576版本APK達(dá)到了25M宗兼,通過一系列的優(yōu)化,到目前的607版本為12M蜕窿。本文主要是介紹頭條APK瘦身中用到的一些方法谋逻。

APK分析

既然是要優(yōu)化APK的大小,那首先就得看下APK文件的構(gòu)成桐经。

Android Studio在2.2版本添加 APK Analyzer功能毁兆,可以直接打開apk文件,如下圖所示


image

APK文件主要有如下幾部分組成:

       res主要是存放圖片資源

       lib主要是存放so庫阴挣,各個cpu架構(gòu)

       classes.dex是java源碼編譯后生成的java字節(jié)碼文件气堕,因方法數(shù)限制拆分了多個dex

       assets主要存放不需要編譯處理的文件

       resources.arsc是編譯后的二進(jìn)制資源文件,包括圖片、文本索引等

       META-INF 簽名信息

       AndroidManifest.xml 描述配置文件

從APK的構(gòu)成中可以看出占比較大的幾個部分茎芭,可以著重對其優(yōu)化

優(yōu)化

res文件夾

圖片資源壓縮

1揖膜、ImageOptim

提供了相應(yīng)客戶端,支持通過客戶端批量處理梅桩,mac上可以使用如下命令開啟:

image

2次氨、TinyPng

沒有提供客戶端,支持拖拽到網(wǎng)頁處理摘投;提供了HTTP API來批量處理煮寡,但是有數(shù)量限制,每個key每個月可以壓縮500張犀呼。 開發(fā)了一個gradle插件來批量操作幸撕,網(wǎng)上也有一些類似的插件:TinyPng Gradle插件

移除無用資源

1、通過使用Lint檢測刪除無用資源外臂,某些業(yè)務(wù)代碼刪除的時(shí)候遺漏了相應(yīng)資源坐儿,可以寫個腳本檢測移除不再使用的資源

2、添加shrinkResources設(shè)置項(xiàng)(官方說明)宋光,有0.18M的優(yōu)化空間貌矿,但是該設(shè)置有風(fēng)險(xiǎn)如果要使用需要做好測試

3、選擇支持合適的圖片罪佳,目前有l(wèi)dpi mdpi hdpi xhdpi xxhdpi xxxhdpi資源文件夾逛漫,可根據(jù)自己app的用戶設(shè)備選擇支持2-3種即可(當(dāng)然一套也行)
高版本的gradle已不再支持通過resConfigs "nodpi", "hdpi", "xhdpi", "xxhdpi"配置支持的資源,只能人肉刪除赘艳。如果你只想打包某一種屏幕密度的資源酌毡,可以使用分包策略,添加如下density配置可以只支持打包xhdpi資源(如果出現(xiàn)某些資源xhdpi沒有蕾管,而其他文件夾包含的情況也不用擔(dān)心枷踏,gradle會保留相應(yīng)資源),這種配置最終會出多個apk包掰曾,具體介紹可參看官方說明旭蠕。

image

4、如果想整體移除res下某個文件夾可以添加如下aaptOptions配置旷坦,而不用打包時(shí)手工刪除掏熬,多個文件夾用:隔開

image

arsc文件

resource.arsc文件記錄了資源id和資源的對應(yīng)關(guān)系(字符串的內(nèi)容,圖片的相對路徑等)

減少語言支持

目前包括各種語言(v7包引入)塞蹭,點(diǎn)擊resources.arsc可以看到支持80種
image

可以通過修改gradle配置孽江,去除不需要部分讶坯,這里我們保留4種

image

只保留"zh-rCN", "zh-rHK", "zh-rTW", "en" 減少不必要的語言(80種減到5種番电,有一個default)apk可減少0.61M
image

資源混淆

開源解決方案AndResGuard可以看下,通過使用段路徑和壓縮可以減小apk,需要注意的是你的項(xiàng)目中某些資源需要keep漱办,減少了1.5M这刷。

lib文件夾

架構(gòu)支持

Android系統(tǒng)目前支持以下七種不同的CPU架構(gòu):ARMv5,ARMv7 (從2010年起)娩井,x86 (從2011年起)暇屋,MIPS (從2012年起),ARMv8洞辣,MIPS64和x86_64 (從2014年起)

每一個CPU架構(gòu)對應(yīng)一個ABI:armeabi咐刨,armeabi-v7a,x86扬霜,mips定鸟,arm64-v8a,mips64著瓶,x86_64

所有的x86联予、x8664、armeabi-v7a材原、arm64-v8a設(shè)備都支持armeabi架構(gòu)的.so文件沸久,x86設(shè)備能夠很好的運(yùn)行ARM類型函數(shù)庫,但并不保證100%不發(fā)生crash余蟹,特別是對舊設(shè)備卷胯。64位設(shè)備(arm64-v8a, x8664, mips64)能夠運(yùn)行32位的函數(shù)庫,但是以32位模式運(yùn)行威酒,在64位平臺上運(yùn)行32位版本的ART和Android組件诵竭,將丟失專為64位優(yōu)化過的性能(ART,webview兼搏,media等等)卵慰。所以一般的應(yīng)用完全可以根據(jù)自己業(yè)務(wù)需求選擇使用armeabi或者armeabi-v7a一種支持就行。

可以通過gradle配置

image

比如:微信佛呻、微博裳朋、QQ只保留了armeabi,F(xiàn)acebook吓著、Twitter鲤嫡、Instagram只保留了armeabi-v7a

假設(shè)只支持了armeabi,如果有特殊要求(比如視頻應(yīng)用)需要用到部分armeabi-v7a的so绑莺,可以通過改名放到armeabi文件夾中暖眼,根據(jù)手機(jī)實(shí)際情況選擇加載。

動態(tài)下發(fā)

比較大的so可以選擇動態(tài)下發(fā)的形式延遲加載纺裁,代碼上需要加一些判斷邏輯诫肠。

dex文件

1司澎、添加設(shè)置minifyEnabled true,混淆栋豫、壓縮代碼挤安,這個設(shè)置現(xiàn)在app應(yīng)該都已經(jīng)添加了。

2丧鸯、刪除一些無用庫蛤铜,早期為了兼容低版本手機(jī),添加了一些兼容庫丛肢,隨著時(shí)間推移APP支持的最低版本也在升高围肥,之前的一些無用庫就可以移除。

3蜂怎、插件下發(fā)業(yè)務(wù)模塊 添加插架框架虐先,將部分代碼延遲下發(fā)加載,這部分效果顯著派敷。

其他

極端情況下可以考慮以下兩種方式蛹批,可以優(yōu)化約1M的空間

debug信息

一般我們會配置Proguard保留行號等信息用于線上日志分析,極端情況下也可考慮移除這部分篮愉,會有5%-10%的效果腐芍,可以減少了0.5M,但是出于方便性暫未移除试躏。

image

supportv7包

如果對supportv7包依賴的不多猪勇,可以直接把使用到的內(nèi)容copy出來單獨(dú)處理,畢竟該包會增加至少0.4M的體積颠蕴,業(yè)務(wù)復(fù)雜后這部分并不好操作和后續(xù)維護(hù)泣刹,頭條暫時(shí)并沒有使用。

TODO

功能迭代不止犀被,瘦身事業(yè)不息椅您。

要維持和繼續(xù)減小apk包,必須要不斷優(yōu)化寡键,現(xiàn)在又如下思路還沒有實(shí)施掀泳,可以看下

1、Google的support-v4包新版本已經(jīng)做了拆分西轩,24.2.0版本拆分成了5個module:support-compat员舵、support-core-utils、support-core-ui藕畔、support-media-compat马僻、support-fragment,可以根據(jù)自己需要單獨(dú)引用相應(yīng)的module注服。
v7包也會依賴v4韭邓,maven依賴有個好處措近,可以通過exclude單獨(dú)剔除相應(yīng)依賴,如下:

image

不過目前各家APP對于support包的使用較深仍秤,support包各模塊也會有相關(guān)依賴關(guān)系,具體能不能使用還需要看實(shí)際情況了可很。

2诗力、使用ReDex優(yōu)化,這是Facebook開源的一個減小安卓app大小以提高性能的工具我抠,集成的話有風(fēng)險(xiǎn)需要多測試苇本,教程。

3菜拓、減少java隱藏開銷瓣窄,比如一些自動生成的函數(shù)等。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末纳鼎,一起剝皮案震驚了整個濱河市俺夕,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌贱鄙,老刑警劉巖劝贸,帶你破解...
    沈念sama閱讀 222,729評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異逗宁,居然都是意外死亡映九,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,226評論 3 399
  • 文/潘曉璐 我一進(jìn)店門瞎颗,熙熙樓的掌柜王于貴愁眉苦臉地迎上來件甥,“玉大人,你說我怎么就攤上這事哼拔∫校” “怎么了?”我有些...
    開封第一講書人閱讀 169,461評論 0 362
  • 文/不壞的土叔 我叫張陵倦逐,是天一觀的道長轿曙。 經(jīng)常有香客問我,道長僻孝,這世上最難降的妖魔是什么导帝? 我笑而不...
    開封第一講書人閱讀 60,135評論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮穿铆,結(jié)果婚禮上您单,老公的妹妹穿的比我還像新娘。我一直安慰自己荞雏,他們只是感情好虐秦,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,130評論 6 398
  • 文/花漫 我一把揭開白布平酿。 她就那樣靜靜地躺著,像睡著了一般悦陋。 火紅的嫁衣襯著肌膚如雪蜈彼。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,736評論 1 312
  • 那天俺驶,我揣著相機(jī)與錄音幸逆,去河邊找鬼。 笑死暮现,一個胖子當(dāng)著我的面吹牛还绘,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播栖袋,決...
    沈念sama閱讀 41,179評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼拍顷,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了塘幅?” 一聲冷哼從身側(cè)響起昔案,我...
    開封第一講書人閱讀 40,124評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎电媳,沒想到半個月后爱沟,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,657評論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡匆背,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,723評論 3 342
  • 正文 我和宋清朗相戀三年呼伸,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片钝尸。...
    茶點(diǎn)故事閱讀 40,872評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡括享,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出珍促,到底是詐尸還是另有隱情铃辖,我是刑警寧澤,帶...
    沈念sama閱讀 36,533評論 5 351
  • 正文 年R本政府宣布猪叙,位于F島的核電站娇斩,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏穴翩。R本人自食惡果不足惜犬第,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,213評論 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望芒帕。 院中可真熱鬧歉嗓,春花似錦、人聲如沸背蟆。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,700評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至志珍,卻和暖如春橙垢,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背伦糯。 一陣腳步聲響...
    開封第一講書人閱讀 33,819評論 1 274
  • 我被黑心中介騙來泰國打工柜某, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人舔株。 一個月前我還...
    沈念sama閱讀 49,304評論 3 379
  • 正文 我出身青樓莺琳,卻偏偏與公主長得像还棱,于是被迫代替她去往敵國和親载慈。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,876評論 2 361

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