Android 性能優(yōu)化小結(jié)

本周有個需求近忙,對某個界面進行優(yōu)化宦赠,然后看了一些文章,并進行小結(jié),為了方便以后回頭查看蝇庭。

僅供個人參考

我還可以繼續(xù)戰(zhàn)斗

一呈础、界面繪制優(yōu)化

1. 頁面卡頓原因

  • 布局 Layout 過于復(fù)雜耸三,無法在16 ms 內(nèi)完成渲染澎埠。
  • 同一時間動畫執(zhí)行的次數(shù)過多,導(dǎo)致 CPU 或 GPU 負載過重
  • View 過度繪制溶弟,導(dǎo)致某些像素在同一幀時間內(nèi)被繪制多次
  • UI 線程中做了稍微耗時的操作

2. 解決工具

  • 開發(fā)者選項-打開GPU渲染
  • 使用 Systrace
  • 使用 TraceView
  • 使用 Hierarchy Viewer 觀察每個 View 的繪制時間

3. 解決策略

  • 如果布局層數(shù)比較多的時候女淑,推薦使用 RelativeLayout
  • 如果布局嵌套比較多,推薦使用 LinearLayout (RelativeLayout 的view的排列方式是基于彼此于彼此依賴)
  • 使用 include 標(biāo)簽進行布局復(fù)用
  • 使用 merge 標(biāo)簽去除多余層級
    • merge 標(biāo)簽最好是替代 FrameLayout 或者是布局一致的 LinearLayout辜御,比如當(dāng)前布局的 LinearLayout 是垂直方向的鸭你,被包含的布局的 LinearLayout 也是垂直方向的則可以使用 merge 標(biāo)簽。
  • 使用 ViewStub 延遲加載布局提高加載速度
    • ViewStub 只能加載一次擒权,加載后 ViewStub 被置為空
    • ViewStub 不能嵌套 merge 標(biāo)簽
    • ViewStub 操作的是布局文件袱巨,如果想操作具體的 view,還是要使用 view 的visible 屬性
  • 避免過度繪制碳抄、重繪
    • 移除不需要的 background
    • 在自定義 view 的 onDraw 方法中愉老,用 canvas.clipRect 來指定繪制的區(qū)域,放置重疊的組件發(fā)生過度繪制

二纳鼎、內(nèi)存泄露

1. 主要原因分類

  1. 開發(fā)人員自己編寫代碼造成的內(nèi)存泄漏
  2. 第三方框架造成的泄漏
  3. 由 Android 系統(tǒng)或者第三方 ROM 造成的內(nèi)存泄漏

2. 泄露場景

  • 非靜態(tài)內(nèi)部類的靜態(tài)實例
    • 如果非靜態(tài)內(nèi)部類里面創(chuàng)建的實例是靜態(tài)的俺夕,那么它會間接的長期維持著外部的引用裳凸,阻止被系統(tǒng)回收
  • 匿名內(nèi)部類的靜態(tài)實例
  • Handler 的內(nèi)存泄露
    • 如果 Handler 是非靜態(tài)的贱鄙,那么 Handler 也會導(dǎo)致引用它的 Activity劝贸、Service or Fragment,導(dǎo)致內(nèi)存泄露
  • 未正確使用 Context (最常見的就是單例模式)
  • 靜態(tài)的 view
  • 資源對象未關(guān)閉(curson file)
  • 集合中對象未清理
  • Bitmap 對象
    • 避免靜態(tài)變量持有比較大的 btimap 對象或者其他大的數(shù)據(jù)對象逗宁,如果已持有映九,要盡快置空靜態(tài)變量
  • 監(jiān)聽器未關(guān)閉
    • 很多系統(tǒng)的服務(wù) TelephonyManager SensorManager 記得取消注冊,或者注冊 null

三瞎颗、開發(fā)過程中遵循的守則

1. 編程思想

應(yīng)用層的性能優(yōu)化通臣可以從以下幾個方面考慮:

  • 了解編程語言的編譯原理,使用高效編碼方式從語法上提高程序性能哼拔;
  • 采用合理的數(shù)據(jù)結(jié)構(gòu)和算法提高程序性能引有,這往往是決定程序性能的關(guān)鍵;
  • 重視界面布局優(yōu)化倦逐;
  • 采用多線程譬正、緩存數(shù)據(jù)、延遲加載檬姥、提前加載等手段曾我,解決嚴重的性能瓶頸;
  • 合理配置虛擬機堆內(nèi)存使用上限和使用率健民,減少垃圾回收頻率抒巢;
  • 合理使用native代碼;
  • 合理配置數(shù)據(jù)庫緩存類型和優(yōu)化SQL語句加快讀取速度秉犹,使用事務(wù)加快寫入速度蛉谜;
  • 使用工具分析性能問題,找出性能瓶頸崇堵;

2. 編程技巧

不執(zhí)行不必要的操作(CPU)悦陋、不分配不必要的內(nèi)存(內(nèi)存)

  • 避免創(chuàng)建不必要的對象
    • 分配內(nèi)存本身需要時間,虛擬機運行時堆內(nèi)存使用量是有上限的筑辨,容易出發(fā) GC俺驶,使進程暫停,造成嚴重卡頓棍辕。
  • 合理使用 static 成員
  • 不需要操作運行時的動態(tài)變量和方法暮现,那么可以講方法設(shè)置為 static
  • 常量字段要聲明為 static final,因為常量會被放在 dex 文件的靜態(tài)字段初始化器中被直接訪問楚昭。否在運行時會通過編譯器自動生成一些函數(shù)來初始化此規(guī)則只對基本類型和 String 類型有效
  • 避免創(chuàng)建 static 的 view or context栖袋,持有 Activity 的引用容易造成內(nèi)存泄露
  • 避免內(nèi)部的 getter 和 setter
    • 盡量直接聲明為 public,直接訪問的速度比間接訪問要快7倍
  • 合理使用浮點類型
    • 在 Android 設(shè)備中抚太,浮點型大概比整形數(shù)據(jù)處理速度慢兩倍
  • 移除 Activity 默認背景塘幅,提升 Activity 加載速度
    • getWindow().setBackgroundDrawable(null);
  • cursor stream 的關(guān)閉
  • 廣播的注冊和取消注冊
  • 合理使用 StringBuffer StringBuilder String
  • 盡量使用局部變量
  • 調(diào)用方法時傳遞的參數(shù)已經(jīng)調(diào)用中創(chuàng)建的臨時變量都保存在 stack 中昔案,速度較快,其他變量(靜態(tài)變量电媳、成員變量)都在 heap 中創(chuàng)建踏揣,速度較慢
  • IntentService 代替 Service
  • 使用 ApplicationCotext 代替 Activity 的 Context
  • 集合中的對象及時清理
  • 記得在 onDestory() 方法中,及時銷毀 webView
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末匾乓,一起剝皮案震驚了整個濱河市捞稿,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌拼缝,老刑警劉巖娱局,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異咧七,居然都是意外死亡衰齐,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進店門继阻,熙熙樓的掌柜王于貴愁眉苦臉地迎上來耻涛,“玉大人,你說我怎么就攤上這事穴翩∪冢” “怎么了?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵芒帕,是天一觀的道長歉嗓。 經(jīng)常有香客問我,道長背蟆,這世上最難降的妖魔是什么鉴分? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮带膀,結(jié)果婚禮上志珍,老公的妹妹穿的比我還像新娘。我一直安慰自己垛叨,他們只是感情好伦糯,可當(dāng)我...
    茶點故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著嗽元,像睡著了一般敛纲。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上剂癌,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天淤翔,我揣著相機與錄音,去河邊找鬼佩谷。 笑死旁壮,一個胖子當(dāng)著我的面吹牛监嗜,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播抡谐,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼裁奇,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了童叠?” 一聲冷哼從身側(cè)響起框喳,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤课幕,失蹤者是張志新(化名)和其女友劉穎厦坛,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體乍惊,經(jīng)...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡杜秸,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了润绎。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片撬碟。...
    茶點故事閱讀 38,161評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖莉撇,靈堂內(nèi)的尸體忽然破棺而出呢蛤,到底是詐尸還是另有隱情,我是刑警寧澤棍郎,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布其障,位于F島的核電站,受9級特大地震影響涂佃,放射性物質(zhì)發(fā)生泄漏励翼。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,351評論 3 307
  • 文/蒙蒙 一辜荠、第九天 我趴在偏房一處隱蔽的房頂上張望汽抚。 院中可真熱鬧,春花似錦伯病、人聲如沸造烁。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽惭蟋。三九已至,卻和暖如春季研,著一層夾襖步出監(jiān)牢的瞬間敞葛,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評論 1 261
  • 我被黑心中介騙來泰國打工与涡, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留惹谐,地道東北人持偏。 一個月前我還...
    沈念sama閱讀 45,618評論 2 355
  • 正文 我出身青樓,卻偏偏與公主長得像氨肌,于是被迫代替她去往敵國和親鸿秆。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,916評論 2 344

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

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,527評論 25 707
  • 太長不看版:在 Android UI 布局過程中怎囚,遵守一些慣用卿叽、有效的布局原則,可以制作出高效且復(fù)用性高的 UI恳守。...
    Mupceet閱讀 3,822評論 0 14
  • 性能優(yōu)化系列閱讀 Android性能優(yōu)化 性能優(yōu)化 - 消除卡頓 性能優(yōu)化- 內(nèi)存優(yōu)化 性能分析工具 - Trac...
    JackChen1024閱讀 1,305評論 1 20
  • 昨天考婴,與一久未謀面事業(yè)有成的老朋友聊天敘舊,相談甚歡催烘。朋友突然話題一轉(zhuǎn)沥阱,滿懷心事地和我說: “你知道么?我特別怕回...
    于工移山閱讀 798評論 0 2
  • 某一天伊群,小白蓮在寢室蹲坑的時候發(fā)表了一些感想考杉,“我每次在寢室拉粑粑都要拉好久,但是去別人寢室借廁所都不敢拉粑粑舰始〕缣模”...
    涵簫琪閱讀 277評論 0 0