Android性能優(yōu)化筆記1

1.UI卡頓有可能是UI布局過(guò)于復(fù)雜,無(wú)法在16ms內(nèi)繪制一幀導(dǎo)致冲簿;可以使用HierarchyViewer來(lái)查找布局是否過(guò)于復(fù)雜粟判,還可以使用TraceView來(lái)觀察CPU的執(zhí)行情況,更加快捷的找到性能瓶頸峦剔。

2.Overdraw(過(guò)度繪制)問(wèn)題档礁,就是同一個(gè)區(qū)域被多次繪制,通過(guò)手機(jī)設(shè)置里面的開(kāi)發(fā)者選項(xiàng)吝沫,打開(kāi)Show GPU Overdraw的選項(xiàng)呻澜,可以觀察UI上的Overdraw情況。藍(lán)色(繪制1次)惨险,淡綠(繪制2次)羹幸,淡紅(繪制3次),深紅(繪制4次)代表了4種不同程度的Overdraw情況辫愉,我們的目標(biāo)就是盡量減少紅色Overdraw栅受,看到更多的藍(lán)色區(qū)域。

3.打開(kāi)手機(jī)里面的開(kāi)發(fā)者選項(xiàng)一屋,選擇Profile GPU Rendering窘疮,選中On screen as bars的選項(xiàng)。通過(guò)這個(gè)工具查看每一幀繪制的時(shí)間冀墨。

4.自定義view時(shí)通過(guò)canvas.clipRect()來(lái)確定需要刷新的區(qū)域闸衫,選定區(qū)域外的地方刷新繪制時(shí)會(huì)被忽略,以此來(lái)減少Overdraw提升流暢度诽嘉。還可以使用canvas.quickreject()來(lái)判斷是否沒(méi)和某個(gè)矩形相交蔚出,從而跳過(guò)那些非矩形區(qū)域內(nèi)的繪制操作。

5.java內(nèi)存回收GC調(diào)用的時(shí)候會(huì)暫停所有的線程虫腋,包括UI線程骄酗,所以頻繁的調(diào)用GC也會(huì)感覺(jué)到卡頓。導(dǎo)致GC頻繁調(diào)用的原因可能是:內(nèi)存抖動(dòng)即大量的對(duì)象被創(chuàng)建又在短時(shí)間內(nèi)馬上被釋放悦冀;瞬間產(chǎn)生大量的對(duì)象會(huì)占用大量Young Generation的內(nèi)存區(qū)域趋翻,達(dá)到閥值時(shí)剩余空間不夠會(huì)觸發(fā)GC。解決辦法盒蟆,在Memory Monitor里面查如果短時(shí)間發(fā)生了多次內(nèi)存的漲跌踏烙,這意味著很有可能發(fā)生了內(nèi)存抖動(dòng)。代碼規(guī)避的點(diǎn)有:避免在for循環(huán)里面分配對(duì)象占用內(nèi)存历等;避免在onDraw方法里面執(zhí)行復(fù)雜的操作讨惩,避免創(chuàng)建對(duì)象;對(duì)于無(wú)法避免的需要頻繁創(chuàng)建的可以考慮使用對(duì)象池寒屯,但是對(duì)象池需要在不用時(shí)自己手動(dòng)進(jìn)行銷毀荐捻。

6.有動(dòng)畫需要對(duì)Bitmap繪制時(shí)可以通過(guò)拆分,只單獨(dú)繪制需要變化的部分,可以通過(guò)setLayerType()方法使得這個(gè)View強(qiáng)制用Hardware來(lái)進(jìn)行渲染处面。對(duì)于動(dòng)畫使用PropertyAnimation或者ViewAnimation來(lái)操作實(shí)現(xiàn)厂置,Android系統(tǒng)對(duì)這些Animation做過(guò)一定的優(yōu)化處理。

7.減少for each的遍歷使用魂角,耗費(fèi)時(shí)間較多的一種遍歷方法农渊。

8.緩存算法,android最常用的一個(gè)緩存算法是LRU(Least Recently Use)或颊;需要注意LRU Cache中被淘汰對(duì)象的回收,否者會(huì)引起嚴(yán)重的內(nèi)存泄露传于。LruCache的構(gòu)建:

ActivityManager am = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
intavailMemInBytes? = am.getMemoryClass()*1024*1024/8;//LruCache最合適的大小
LruCache bitMapCache =newLruCache(availMemInBytes){
? ? @Override
? ? protected intsizeOf(String key,Bitmap value) {
? ? ? ? //讓Cache知道每個(gè)加入的Item的具體大小
? ? ? ? returnvalue.getByteCount();
? ? }
};

9.試用Android Studio中工具欄的Analysis -> Inspect Code的Lint囱挑,靜態(tài)掃描應(yīng)用源碼并找出其中的潛在問(wèn)題。

10.view如果不設(shè)置透明度繪制一次沼溜,如果設(shè)置了透明度繪制時(shí)至少會(huì)繪制兩次平挑。解決辦法直接用GPU進(jìn)行繪制,具體參考Hidden Cost of Transparency

11.提高自定義view的性能的方法:僅僅在View的內(nèi)容發(fā)生改變的時(shí)候才去觸發(fā)invalidate方法系草,盡量使用ClipRect等方法來(lái)提高繪制的性能通熄;減少繪制時(shí)不必要的繪制元素,對(duì)于那些不可見(jiàn)的元素找都,我們需要盡量避免重繪唇辨;對(duì)于不在屏幕上的元素,可以使用Canvas.quickReject把他們給剔除能耻,避免浪費(fèi)CPU資源赏枚。另外盡量使用GPU來(lái)進(jìn)行UI的渲染,這樣能夠極大的提高程序的整體表現(xiàn)性能薯蝎。

12.圖片不同的解碼率占用的內(nèi)存大小也不一樣挤聘,選擇合適的解碼率可以防止oom的出現(xiàn)微猖。

BitmapFactory.Options options =newBitmapFactory.Options();
options.inPreferredConfig= Bitmap.Config.ARGB_8888;//需要的內(nèi)存最大每個(gè)像素占8位
options.inPreferredConfig= Bitmap.Config.ARGB_4444;//每個(gè)像素占4位
options.inPreferredConfig= Bitmap.Config.RGB_565;//沒(méi)有透明度R占5位 G占6位 B占5位
options.inPreferredConfig= Bitmap.Config.ALPHA_8;

13.createScaledBitmap()可以快速的創(chuàng)建縮放的圖片但是需要圖片已經(jīng)加載到內(nèi)存中;options.inSampleSize屬性同樣可以實(shí)現(xiàn)縮放并且不用將圖片加載到內(nèi)存中栗恩;使用inScaled,inDensity洪燥,inTargetDensity的屬性來(lái)對(duì)解碼圖片做處理也可以實(shí)現(xiàn)縮放磕秤;options.inJustDecodeBounds=true可以在不將圖片加載到內(nèi)存中的前提下讀取圖片的寬高等信息;

14.使用bitmapFactoryOptions.inBitmap屬性來(lái)提高bitmap的循環(huán)試用蚓曼,減少內(nèi)存開(kāi)銷亲澡;使用inBitmap屬性可以告知Bitmap解碼器去嘗試使用已經(jīng)存在的內(nèi)存區(qū)域,新解碼的bitmap會(huì)嘗試去使用之前那張bitmap在heap中所占據(jù)的pixel data內(nèi)存區(qū)域纫版,而不是去問(wèn)內(nèi)存重新申請(qǐng)一塊區(qū)域來(lái)存放bitmap床绪。試用限制:在SDK 11 -> 18之間,重用的bitmap大小必須是一致的,例如給inBitmap賦值的圖片大小為100-100癞己,那么新申請(qǐng)的bitmap必須也為100-100才能夠被重用膀斋。從SDK 19開(kāi)始,新申請(qǐng)的bitmap大小必須小于或者等于已經(jīng)賦值過(guò)的bitmap大斜匝拧仰担;新申請(qǐng)的bitmap與舊的bitmap必須有相同的解碼格式,例如大家都是8888的绩社,如果前面的bitmap是8888摔蓝,那么就不能支持4444與565格式的bitmap了。

15.ArrayMap比HasMap更加的節(jié)省內(nèi)存愉耙,遍歷效率也比較高贮尉。但是數(shù)據(jù)最好不要超過(guò)千級(jí)。

16.Android中不推薦使用枚舉(Enum)朴沿,和靜態(tài)常量相比猜谚,枚舉會(huì)耗費(fèi)更多的內(nèi)存,編譯后的文件也更大赌渣。

17.通常魏铅,View會(huì)保持Activity的引用,Activity同時(shí)還和其他內(nèi)部對(duì)象也有可能保持引用關(guān)系坚芜。當(dāng)屏幕發(fā)生旋轉(zhuǎn)的時(shí)候览芳,activity很容易發(fā)生泄漏,這樣的話鸿竖,里面的view也會(huì)發(fā)生泄漏路操。避免的規(guī)則有:避免使用異步回調(diào),異步回調(diào)執(zhí)行時(shí)可能activity已經(jīng)被銷毀千贯;避免使用Static對(duì)象屯仗,static的生命周期過(guò)長(zhǎng),使用不當(dāng)很可能導(dǎo)致leak搔谴;避免把View添加到?jīng)]有清除機(jī)制的容器里面如:WeekHashMap魁袜。

本文章是閱讀胡凱同學(xué)的性能優(yōu)系列文章做出的筆記,特此聲明敦第。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末峰弹,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子芜果,更是在濱河造成了極大的恐慌鞠呈,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,348評(píng)論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件右钾,死亡現(xiàn)場(chǎng)離奇詭異蚁吝,居然都是意外死亡旱爆,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,122評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門窘茁,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)怀伦,“玉大人,你說(shuō)我怎么就攤上這事山林》看” “怎么了?”我有些...
    開(kāi)封第一講書人閱讀 156,936評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵驼抹,是天一觀的道長(zhǎng)桑孩。 經(jīng)常有香客問(wèn)我,道長(zhǎng)框冀,這世上最難降的妖魔是什么洼怔? 我笑而不...
    開(kāi)封第一講書人閱讀 56,427評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮左驾,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘极谊。我一直安慰自己诡右,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,467評(píng)論 6 385
  • 文/花漫 我一把揭開(kāi)白布轻猖。 她就那樣靜靜地躺著帆吻,像睡著了一般。 火紅的嫁衣襯著肌膚如雪咙边。 梳的紋絲不亂的頭發(fā)上猜煮,一...
    開(kāi)封第一講書人閱讀 49,785評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音败许,去河邊找鬼王带。 笑死,一個(gè)胖子當(dāng)著我的面吹牛市殷,可吹牛的內(nèi)容都是我干的愕撰。 我是一名探鬼主播,決...
    沈念sama閱讀 38,931評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼醋寝,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼搞挣!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起音羞,我...
    開(kāi)封第一講書人閱讀 37,696評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤囱桨,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后嗅绰,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體舍肠,經(jīng)...
    沈念sama閱讀 44,141評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡搀继,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,483評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了貌夕。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片律歼。...
    茶點(diǎn)故事閱讀 38,625評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖啡专,靈堂內(nèi)的尸體忽然破棺而出险毁,到底是詐尸還是另有隱情,我是刑警寧澤们童,帶...
    沈念sama閱讀 34,291評(píng)論 4 329
  • 正文 年R本政府宣布畔况,位于F島的核電站,受9級(jí)特大地震影響慧库,放射性物質(zhì)發(fā)生泄漏跷跪。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,892評(píng)論 3 312
  • 文/蒙蒙 一齐板、第九天 我趴在偏房一處隱蔽的房頂上張望吵瞻。 院中可真熱鬧,春花似錦甘磨、人聲如沸橡羞。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 30,741評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)卿泽。三九已至,卻和暖如春滋觉,著一層夾襖步出監(jiān)牢的瞬間签夭,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 31,977評(píng)論 1 265
  • 我被黑心中介騙來(lái)泰國(guó)打工椎侠, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留第租,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,324評(píng)論 2 360
  • 正文 我出身青樓我纪,卻偏偏與公主長(zhǎng)得像煌妈,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子宣羊,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,492評(píng)論 2 348

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

  • 布局優(yōu)化 0, UI渲染機(jī)制 人眼所看到的流暢畫面璧诵,需要的幀數(shù)在40幀每秒到60幀每秒之間,最佳的ftp在60左右...
    hloong閱讀 1,385評(píng)論 0 18
  • 注意事項(xiàng): 布局優(yōu)化仇冯;盡量使用include之宿、merge、ViewStub標(biāo)簽苛坚,盡量不存在冗余嵌套及過(guò)于復(fù)雜布局(...
    HarryXR閱讀 5,155評(píng)論 1 19
  • 原文: http://www.cnblogs.com/yezhennan/p/5442031.html UI性能測(cè)...
    vb12閱讀 4,261評(píng)論 0 9
  • 感悟10 本周學(xué)習(xí)了三個(gè)小節(jié)比被,其中切斷蠱惑人心的“三毒”讓我感觸很深色难,三毒是指貪、瞋等缀、癡枷莉,對(duì)照這次的學(xué)習(xí),我想到在...
    好運(yùn)到來(lái)閱讀 1,970評(píng)論 0 0