隨著版本迭代,功能增加安裝包體積也會慢慢增大愚战。
今日頭條576版本APK達(dá)到了25M宗兼,通過一系列的優(yōu)化,到目前的607版本為12M蜕窿。本文主要是介紹頭條APK瘦身中用到的一些方法谋逻。
APK分析
既然是要優(yōu)化APK的大小,那首先就得看下APK文件的構(gòu)成桐经。
Android Studio在2.2版本添加 APK Analyzer功能毁兆,可以直接打開apk文件,如下圖所示
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上可以使用如下命令開啟:
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包掰曾,具體介紹可參看官方說明旭蠕。
4、如果想整體移除res下某個文件夾可以添加如下aaptOptions配置旷坦,而不用打包時(shí)手工刪除掏熬,多個文件夾用:隔開
arsc文件
resource.arsc文件記錄了資源id和資源的對應(yīng)關(guān)系(字符串的內(nèi)容,圖片的相對路徑等)
減少語言支持
目前包括各種語言(v7包引入)塞蹭,點(diǎn)擊resources.arsc可以看到支持80種可以通過修改gradle配置孽江,去除不需要部分讶坯,這里我們保留4種
資源混淆
開源解決方案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配置
比如:微信佛呻、微博裳朋、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,但是出于方便性暫未移除试躏。
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)依賴,如下:
不過目前各家APP對于support包的使用較深仍秤,support包各模塊也會有相關(guān)依賴關(guān)系,具體能不能使用還需要看實(shí)際情況了可很。
2诗力、使用ReDex優(yōu)化,這是Facebook開源的一個減小安卓app大小以提高性能的工具我抠,集成的話有風(fēng)險(xiǎn)需要多測試苇本,教程。
3菜拓、減少java隱藏開銷瓣窄,比如一些自動生成的函數(shù)等。