前言
Android優(yōu)化方式侃侃而談?wù)呱醵嘀才郏瑓s可能并沒(méi)有做過(guò)一次惧眠,今記錄吾之方式,待朕回憶于个,IDE基于AS2.3.3氛魁。
工具
AndroidStudio自帶的Analyze,就在IDE上面工具欄中览濒。
方式
- 對(duì)包大小動(dòng)手
- 代碼優(yōu)化呆盖、布局優(yōu)化、內(nèi)存優(yōu)化
1.對(duì)包大小動(dòng)手
使用AndroidStudio Build下的分析工具贷笛,先分析出apk哪部分占用最大应又,做出對(duì)應(yīng)的處理,工具顯示如下圖:
但是這個(gè)只能分析出包大小處在哪里乏苦,我們能做的只是縮小包的體積株扛,分析內(nèi)容大致如下圖:
從這里可以看出我的apk文件大就大在assets和第三方so包尤筐,我的包大小約為60M,但是這兩個(gè)就占了我80%大小洞就,約為44.1M盆繁,這個(gè)巨驚人,我也驚呆了旬蟋,不可放任其自由發(fā)展:
- ProGuard
這個(gè)東西能夠?qū)ava 庫(kù)類中的代碼進(jìn)行壓縮(Shrink),優(yōu)化(Optimize),混淆(Obfuscate),預(yù)檢(Preveirfy)油昂。
1. 壓縮(Shrink):在壓縮處理這一步中,用于檢測(cè)和刪除沒(méi)有使用的類倾贰,字段冕碟,方法和屬性。
2. 優(yōu)化(Optimize):在優(yōu)化處理這一步中匆浙,對(duì)字節(jié)碼進(jìn)行優(yōu)化安寺,并且移除無(wú)用指令。
3. 預(yù)檢(Preveirfy):在預(yù)檢這一步中首尼,主要是在Java平臺(tái)上對(duì)處理后的代碼進(jìn)行預(yù)檢挑庶。
4. 混淆(Obfuscate):在混淆處理這一步中,使用a,b,c等無(wú)意義的名稱软能,對(duì)類迎捺,字段和方法進(jìn)行重命名。
參考博客 》》http://blog.csdn.net/shanshan_blog/article/details/53169315
從以上可以看出混淆這一步可以說(shuō)是很重要的埋嵌,雖然我叫它混淆打包破加,但是它可不只做了混淆這一件事。很遺憾我的當(dāng)前工程出現(xiàn)了不少問(wèn)題雹嗦,我強(qiáng)行在編譯時(shí)蓋住了報(bào)錯(cuò)范舀,在這里用不了混淆這塊,故此沒(méi)探究了罪。 - 縮減圖片大小
其實(shí)Android是支持webp格式的圖片的
0.WebP 的優(yōu)勢(shì)體現(xiàn)在它具有更優(yōu)的圖像數(shù)據(jù)壓縮算法锭环,能帶來(lái)更小的圖片體積,而且擁有肉眼識(shí)別無(wú)差異的圖像質(zhì)量泊藕;同時(shí)具備了無(wú)損和有損的壓縮模式辅辩、Alpha 透明以及動(dòng)畫(huà)的特性,在 JPEG 和 PNG 上的轉(zhuǎn)化效果都相當(dāng)優(yōu)秀娃圆、穩(wěn)定和統(tǒng)一玫锋。操作如下圖
圖片.png
右擊給他轉(zhuǎn)換下即可
我這里使用的方式是:
1.將圖片放在mimap文件夾中,這是紋理圖文件夾讼呢,據(jù)說(shuō)Mipmap紋理技術(shù)是目前解決紋理分辨率與視點(diǎn)距離關(guān)系的最有效途徑,它會(huì)先將圖片壓縮成很多逐漸縮小的圖片撩鹿。當(dāng)然關(guān)于drawable與mipmap文件夾的爭(zhēng)議是很多的,個(gè)人偏向于mipmap文件夾存放圖片悦屏。
下面為摘自https://stackoverflow.com/questions/23935810/mipmap-drawables-for-icons%E3%80%82的一段話节沦。
不同設(shè)備上的不同主屏幕啟動(dòng)器應(yīng)用程序顯示各種分辨率的應(yīng)用程序啟動(dòng)器圖標(biāo)键思。當(dāng)應(yīng)用程序資源優(yōu)化技術(shù)為未使用的屏幕密度移除資源時(shí),啟動(dòng)器圖標(biāo)可能會(huì)顯得模糊甫贯,因?yàn)閱?dòng)器應(yīng)用程序必須升級(jí)顯示器的較低分辨率圖標(biāo)吼鳞。為了避免這些顯示問(wèn)題,應(yīng)用程序應(yīng)該使用mipmap/資源文件夾作為啟動(dòng)器圖標(biāo)叫搁。Android系統(tǒng)保留這些資源赔桌,無(wú)論密度剝離,并確保發(fā)射器應(yīng)用程序可以挑選最佳分辨率的圖標(biāo)進(jìn)行顯示常熙。*
2.我用眾所周知的 tinypng
對(duì)文件夾內(nèi)圖片進(jìn)行壓縮纬乍,實(shí)踐證明,這真的是款神器裸卫,這款神器一次性可壓縮20張圖片,壓縮完我習(xí)慣是刷新頁(yè)面纽竣,不然無(wú)法再次壓縮墓贿,它會(huì)直接顯示壓縮失敗。
說(shuō)明:優(yōu)異關(guān)系為:有損webP>tinypng>無(wú)損webP,但是有損webP在一些灰度圖中進(jìn)一步模糊內(nèi)容,譬如加載圖片時(shí)用的placeholder灰色文字圖片蜓氨,故我一直使用的為tinypng.人工壓縮后關(guān)閉編譯時(shí)配置Android默認(rèn)的圖片壓縮聋袋,它不咋地 傳送門(mén)。
android {
…
buildTypes {
release {
crunchPngs false
}
}
}
- so文件夾減少
通過(guò)大量百度穴吹,知識(shí)匯集幽勒,其中的知識(shí)點(diǎn)涉及cpu abi,最后得出結(jié)論只保留 armeabi-v7a 文件夾港令。 額啥容。。目前還沒(méi)有發(fā)生什么不兼容問(wèn)題顷霹,
至此App大小減小的比較喜人咪惠,貢獻(xiàn)最大的其實(shí)還是so文件夾的減小,現(xiàn)在大小直接看下圖淋淀,剔除了一半多遥昧,很高興。
2. 代碼優(yōu)化
1). Analyze → Inspect Code
我們?cè)趯?xiě)代碼過(guò)程中總有自己的小習(xí)慣朵纷,但是這個(gè)習(xí)慣谷歌爸爸是看不起的炭臭,他要求絕對(duì)的規(guī)范和美觀,所以他給了代碼審查也定義了這個(gè)規(guī)則袍辞,我們只要使用 Analyze → Inspect Code
從這里我們看出里面都是報(bào)錯(cuò)和警告鞋仍,在這里根據(jù)提醒修改你能使絕大多數(shù)代碼規(guī)范,但是提示不是萬(wàn)能的革屠,不能都改凿试,仁者見(jiàn)仁吧排宰,查看過(guò)程中還發(fā)現(xiàn)了一個(gè)有趣的事兒,如下圖:
這里它嫌棄我同事寫(xiě)的script代碼放的方式,直接將其判定為錯(cuò)誤那婉,而且還給出明確提示板甘,代碼結(jié)構(gòu)是這樣的:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta charset="utf-8" />
<title>...</title>
<!--引用百度地圖API-->
<style type="text/css">...</style>
<script type="text/javascript" src="http://api.map.baidu.com/api?key=&v=1.1&services=true"></script>
</head>
<body onload="initMap();">
</body>
<script type="text/javascript">
...
</script>
</html>
2). Analyze → Code Cleanup
這個(gè)直接能對(duì)你的一些代碼進(jìn)行寫(xiě)法調(diào)優(yōu),但是我使用了下详炬,沒(méi)發(fā)現(xiàn)什么有效盐类,不建議使用。
2. 查看ViewTree(Hierarchy Viewer生成樹(shù)圖).
布局樹(shù)圖呛谜,這個(gè)都是大家所知道在跳,什么減少嵌套,多用ViewStub隐岛、include標(biāo)簽復(fù)用猫妙,多用Merge標(biāo)簽合并之類的,其實(shí)大多數(shù)時(shí)候我們都不會(huì)理會(huì)這個(gè)東西聚凹,但是真的會(huì)有層級(jí)過(guò)多而導(dǎo)致崩潰問(wèn)題割坠,所以我們?cè)谧鰞?yōu)化的時(shí)候呢,雖然知道自己改動(dòng)的幾率不大妒牙,但是還是要生成樹(shù)圖圖片然后查看一番彼哼,翻翻有沒(méi)有確實(shí)很過(guò)分的布局,有的話我們必須改掉它湘今。
具體做法:
按照上圖打開(kāi)監(jiān)視器敢朱。你沒(méi)有看錯(cuò),這個(gè)監(jiān)視器也可以查看data/data文件夾下的數(shù)據(jù)摩瞎,我們知道查看data/data文件夾一般都是越獄手機(jī)或者虛擬機(jī)拴签,這個(gè)也不例外,要想獲取Tree圖必須使用虛擬機(jī)愉豺,下圖是我首頁(yè)Tree圖的大概情況篓吁。
頁(yè)面那么多,怎么可能一個(gè)個(gè)分析蚪拦,我一般一個(gè)個(gè)點(diǎn)擊Activity頁(yè)面杖剪,觀察這上面的樹(shù)層級(jí),感覺(jué)有點(diǎn)多的就點(diǎn)擊看看結(jié)構(gòu)再對(duì)比實(shí)際視圖修改下驰贷,原則就是不過(guò)分怎么都好說(shuō)盛嘿。
3.內(nèi)存優(yōu)化
內(nèi)存優(yōu)化真的是一個(gè)老大難的問(wèn)題,我百度了很多博客括袒,都是侃侃而談次兆,有些有步驟,可是最后結(jié)論大體都可歸納為 經(jīng)驗(yàn)之談锹锰,有很多有借鑒意義芥炭,可是不是我想要的漓库,我這里也暫時(shí)沒(méi)什么好的干貨,僅做此次研究的記載:
這個(gè)作為最大的參考文章:http://blog.csdn.net/qq_23191031/article/details/63685756
開(kāi)局先看App
就是這種炫酷餅圖园蝠,我沒(méi)用到它
AS上各種顯示渺蒿,反正我沒(méi)搞懂,我就記下我能弄的步驟:
1.將dump下來(lái)的堆快照生成標(biāo)準(zhǔn)hprof文件以能夠讓MAT工具正常打開(kāi)
2.Activity A->ActivityB
至于MAT比較這里不再贅述彪薛,記住去除虛引用之類的茂装,方可見(jiàn)真文章,
最簡(jiǎn)單的就是A->B->A->B,收集快照,然后打開(kāi)做些操作去除干擾善延,截圖少态,反復(fù)操作幾次,對(duì)比截圖內(nèi)容,這個(gè)東西太耗時(shí)間了易遣。
-
拓展:
Android代碼內(nèi)存優(yōu)化建議-Android資源篇
http://www.androidperformance.com/2015/07/20/Android-Performance-Memory-AndroidResource.html
Android代碼內(nèi)存優(yōu)化建議-Android官方篇
http://www.androidperformance.com/2015/07/20/Android-Performance-Memory-Google.html#7-%E7%9F%A5%E6%99%93%E5%86%85%E5%AD%98%E7%9A%84%E5%BC%80%E6%94%AF%E6%83%85%E5%86%B5
Android代碼內(nèi)存優(yōu)化建議-OnTrimMemory優(yōu)化
http://www.androidperformance.com/2015/07/20/Android-Performance-Memory-onTrimMemory.html
Android代碼內(nèi)存優(yōu)化建議-Java官方篇
http://www.androidperformance.com/2015/07/20/Android-Performance-Memory-Java.html