隨著android項(xiàng)目不斷迭代,apk包會(huì)越來越大,那么這篇文章來講下一些基本的瘦身策略。
一、資源優(yōu)化
1.1 Lint工具去掉項(xiàng)目中的冗余項(xiàng)目
android stuido自帶的檢驗(yàn)工程規(guī)范的工具,可以檢測內(nèi)容包括如下幾點(diǎn):
- 未使用的布局
- 未使用的資源(如:圖片)
- values中string.xml 、colors.xml 、dimens.xml 、styles.xml 中未使用的屬性項(xiàng)
使用:
AS菜單欄Analyze -> Run Inspection by Name -> 輸入unused resources -> 選擇Whole project -> 檢測
然后會(huì)在工程下方得到檢測結(jié)果:

會(huì)列出優(yōu)化項(xiàng),但是不建議選擇右邊紅框標(biāo)識(shí)的按鈕,執(zhí)行一鍵清除。Lint只是給出建議,你還是根據(jù)項(xiàng)目需要來刪除無用資源會(huì)好點(diǎn)。
1.2 圖片資源優(yōu)化
經(jīng)過Lint過濾之后,會(huì)減少部分無用資源。再從剩余的圖片文件下手:
大圖片壓縮(也可以歸設(shè)計(jì)處理):
圖片壓縮工具:tinypng.com/
圖片壓縮轉(zhuǎn)換工具:isparta.github.io/合理選擇圖片格式:
png: 無損 圖片質(zhì)量高 但是占用存儲(chǔ)比JPEG大
jpeg: 有損 圖片質(zhì)量稍差 但是占用存儲(chǔ)比PNG小
svg:一些圖片的描述,犧牲CPU的計(jì)算能力的,節(jié)省空間。使用的原則:簡單的圖標(biāo)。
WebP: (https://developers.google.com/speed/webp/)的格式(Facebook、騰訊、淘寶在用。)缺點(diǎn):加載相比于PNG要慢很多。 但是配置比較高。
1.3 資源混淆
使用微信開源庫AndResGuard,它是一個(gè)縮小APK大小的工具,它的原理類似Java Proguard,但是只針對(duì)資源。它會(huì)將原本冗長的資源路徑變短。
集成:
在整個(gè)Project build.gradle中:
dependencies {
classpath 'com.tencent.mm:AndResGuard-gradle-plugin:1.2.10'
}
在app build.gradle中:
apply plugin: ‘AndResGuard'
andResGuard {
mappingFile = null
use7zip = true
useSign = true
keepRoot = false
compressFilePattern = [
"*.png",
"*.jpg",
"*.jpeg",
"*.gif",
"resources.arsc"
]
whiteList = [
// your icon
"R.drawable.icon",
// Umeng sdk
"R.anim.umeng*",
"R.string.umeng*",
"R.string.UM*",
"R.string.tb_*",
"R.layout.umeng*",
"R.layout.socialize_*",
"R.layout.*messager*",
"R.layout.tb_*",
"R.color.umeng*",
"R.color.tb_*",
"R.style.*UM*",
"R.style.umeng*",
"R.drawable.umeng*",
"R.drawable.tb_*",
"R.drawable.sina*",
"R.drawable.qq_*",
"R.drawable.tb_*",
"R.id.umeng*",
"R.id.*messager*",
"R.id.progress_bar_parent",
"R.id.socialize_*",
"R.id.webView"
]
sevenzip {
artifact = 'com.tencent.mm:SevenZip:1.2.10'
//path = "/usr/local/bin/7za" --- Linux
//path = "D:\7za\7za.exe" --- Windows
}
}
其中whiteList(白名單)中指定不需要進(jìn)行混淆的資源路徑規(guī)則,主要是一些第三方SDK,因?yàn)橛行㏒DK的代碼中引用到對(duì)應(yīng)的資源文件,如果對(duì)其進(jìn)行混淆,會(huì)導(dǎo)致找不到對(duì)應(yīng)資源文件,出現(xiàn)crash,所以不能對(duì)其資源文件進(jìn)行混淆。由于公司的項(xiàng)目中使用到了友盟和融云,所以將這兩個(gè)SDK加入白名單,更多的白名單可以查看:
配置完,同步Gradle之后:

例如想打release包:雙擊使用andresguard :resguardRelease
對(duì)應(yīng)項(xiàng)目中打出如左邊顯示的包。
經(jīng)過上面的優(yōu)化,對(duì)應(yīng)一般的瘦身要求來說就已經(jīng)足夠了,如果對(duì)優(yōu)化有極致追求的話,那接下來就考慮優(yōu)化下代碼吧。
二、代碼優(yōu)化
2.1 過大第三方工程引入造成的代碼量冗余
有些三方工具非常好用,功能也很齊全,但是我們項(xiàng)目中可能只用到它很小的一部分功能,所以對(duì)于大項(xiàng)目追求優(yōu)化極致的,可以考慮去掉部分功能,或者重構(gòu)。另外有些可有可無的三方工具:比如Butterknife,只是給coder稍微省了點(diǎn)代碼量,但是對(duì)工程沒有其他半點(diǎn)好處,雖然不是很大,建議也別用了。
2.2 項(xiàng)目代碼冗余
這部分只能靠保持良好的編碼習(xí)慣,對(duì)你的代碼進(jìn)行持續(xù)的優(yōu)化或者重構(gòu),減少代碼的重復(fù),實(shí)現(xiàn)代碼的復(fù)用。不用的代碼別大段大段地注釋掉在那,變量名、方法名別太冗長等等也是一個(gè)方面。
2.3 代碼混淆
代碼混淆不僅能夠提高APK的反編譯,還能較小APK大??;混淆可以刪除注釋和無用的代碼;可以將Java文件,變量,方法名登改為短名,這樣就可以縮減字符所占的空間,當(dāng)然不是所有文件都能混淆的,這屬于混淆配置的范疇了。
好了,就總結(jié)這么多,文章不介紹原理機(jī)制了,有興趣的可以看看這篇:https://blog.csdn.net/chenliguan/article/details/54176626