Android 性能優化之工具和優化點總結

来源:https://www.cnblogs.com/jiangzhishan/archive/2018/07/20/9342003.html
-Advertisement-
Play Games

Android性能優化學習 最近公司主抓性能優化工作,藉此春風也學習到了許多Android性能優化方面的知識。由於組內隊友的給力,優化的成果也是比較喜人。同時也學習和實踐了不少知識,特此記錄。 1.性能優化分析工具學習 在開始代碼優化之前,先得學會使用性能分析工具。以下三個工具都是谷歌官方推出的,可 ...


Android性能優化學習

最近公司主抓性能優化工作,藉此春風也學習到了許多Android性能優化方面的知識。由於組內隊友的給力,優化的成果也是比較喜人。同時也學習和實踐了不少知識,特此記錄。

1.性能優化分析工具學習

在開始代碼優化之前,先得學會使用性能分析工具。以下三個工具都是谷歌官方推出的,可以幫助我們定位分析問題,從而優化我們的APP。

  • System Trace

  Systrace是一個收集和檢測時間信息的工具, 它能顯示CPU和時間被消耗在哪兒了, 每個進程和線程都在其CPU時間片內做了
  什麼事兒. 而且會指示哪個地方出了問題, 以及給出Fix建議。給出的結果trace文件是以html形式打開的,直接用瀏覽器打開
  查看十分方便。打開方法:打開DDMS後,連接手機,點擊手機上方一排按鈕中的SysTrace按鈕。

  打開的效果如下圖:
  

  在代碼中打點方式如下

  

  • Hierarchy Viewer

  Hierarchy Viewer提供了一個可視化的界面來觀測佈局的層級, 讓我們可以優化佈局層級, 刪除多餘的不必要的View
  層級, 提升佈局速度。另外,開發者模式中調試GPU過度繪製選項也可以進行視圖層級調試。在SDK-> tools目錄下
  打開hierarchyviewer.bat即可。

  效果如下圖:
  

  • TraceView

  一個圖形化的工具, 用來展示和分析方法的執行時間。也是一款性能優化的神器。可以通過像打log一樣的方式去定位代碼的執行時
  間,從而可以準確定位是哪一段代碼的執行消耗了太多時間。相比SysTrace,功能更強大,使用起來也更複雜。

   

2.佈局優化

佈局優化相對比較容易,優化可以先從佈局來展開。使用Hierarchy Viewer和開發者模式中關於佈局繪製的選項,可以查到一些問題然後進行修改。

  • 佈局嵌套過深 有的時候為了趕進度,佈局設計的不是很好。層級嵌套過深的話,深度遍歷各個節點會非常消耗時間,這也是佈局優化餘地最大的一個點了。很多過深的層級是不必要的。如果佈局真的很複雜,不深度嵌套沒法實現想要的效果。試試最新的約束佈局Constraintlayout吧。沒有使用過的話,下麵這篇官方文檔可以幫助你:
    Constraintlayout官方介紹文檔

  • 使用合適的佈局 三種常見的ViewGroup的繪製速度:FrameLayout > LinerLayout > RelativeLayout。當然,如果用RelativeLayout可以避免佈局嵌套的話是值得的。可以根據這些去決定選用什麼樣的佈局。

  • 列表控制項優化 不論是ListView還是RecycleView都有優化點,一個是convertView的復用,一個是ViewHolder的使用避免重覆遍歷節點。當然這些都是基礎中的基礎了。如果發現項目中的代碼ListView或者RecycleView的使用不規範的話,趕緊進行修改吧。

  • 使用include標簽 在佈局文件中,<include>標簽可以指定插入一段佈局文件到當前佈局。這樣的話既提高了佈局復用,也減少了我們的代碼書寫。另外,<merge>標簽可以和<include>的標簽一起使用從而減少佈局層級。

  • ViewStub延時載入 有些佈局,比如網路出錯的佈局,沒必要在所有時候都載入出來。使用ViewStub可以實現按需載入。ViewStub本身沒有寬高,載入起來幾乎不消耗什麼資源。當對他setVisibility(View.VISIBLE)的時候會調用它引用的真實佈局填充到當前位置,從而實現了延時載入,節省了正常載入的時間。

  • 移除Activity預設背景 只要我們不需要Activity的預設背景,就可以移除掉,以減少Activity啟動時的渲染時間,提升啟動效率。移動方法見下:

3.線程優化

線程的創建和銷毀會帶來比較大的性能開銷。因此線程優化也很有必要。查看項目中是否存在隨意new thread,線程缺乏管理的情況。使用AsyncTask或者線程池對線程進行管理,可以提升APP的性能。另外,我比較推薦使用Rxjava來實現非同步操作,既方便又優雅。

推薦一篇Rxjava的入門文章

4.記憶體泄露

記憶體泄露會導致APP占用記憶體過高,影響效率,嚴重的話會導致OOM。因此如果項目存在記憶體泄露的話要優先解決。查找記憶體泄露可以用LeakCanary等工具,具體怎麼解決,有哪些泄露點,以後有時間也寫篇總結。

5.演算法優化

毋庸置疑,使用合適的演算法處理事務可以大幅提升APP的性能。當然演算法不是我的強項,也只能給出一些大致的點:查詢考慮二分查找節省時間,儘量不要使用耗時的遞歸演算法。必要的時候可以空間換時間來提高APP運行效率。

6.其他優化點

  • 非同步處理耗時任務 在Activity、Fragemnt的onCreate等初始化方法中,如果執行了太耗時的操作(例如讀取各種數據),會影響頁面的載入速度,讓用戶覺得APP太慢。這時候可以非同步處理這些耗時任務,減小應用啟動的時候的負擔。

  • 替換矢量圖 儘管矢量圖有諸多優點,但矢量圖的繪製是消耗性能的。在應用初始化載入等比較影響用戶體驗的地方,還是建議使用Bitmap來代替矢量圖,提高APP開啟效率。

  • 正則表達式 經小伙伴用TraceView不斷的打點發現,正則表達式非常消耗時間。因此儘管正則表達式非常優雅,涉及到性能問題的時候,可以改為其他判斷方式來提高APP性能。

  • 浮點類型 在Java中浮點類型的運算大概比整型數據慢兩倍,因此整型數據能解決的問題儘量用整型。

  • 減少冗餘log 開發的時候用於調試的log,在項目上線的時候沒用的要及時刪除。當然有用的log還是要留下,以便以後分析問題。

  • 刪除無用資源 沒用用的資源會增大APK大小,既然沒有用了,上線的時候當然要及時刪除。

  • Lint代碼檢查 使用Lint等靜態代碼檢查工具可以幫助我們發現很多隱藏的問題。Lint檢查出來的問題越少,說明代碼越規範,越不容易出現各種問題,APP性能自然也會提升。

  • 濫用全局廣播 全局廣播也是十分消耗性能的一個點。對於應用內的通訊,使用介面回調,EventBus等手段比起廣播是更好地選擇。動態註冊廣播的時候,也不要忘了廣播的註銷。

7.總結

可以看到除了工具的使用外,性能優化是很考驗代碼功底的。因此想要做好性能優化,強化基本功不可少。性能優化也是一件相對枯燥而難度大的工作。因為很多優化的努力可能立馬看不到效果,或者說優化的成果在數據上難以體現。我們在做性能優化的時候也遇到果瓶頸,找不到優化方向而感到泄氣。但是堅持下來,利用好工具,從各個點去優化,總會有撥開雲霧見青天的一天!



作者:業松
鏈接:https://www.jianshu.com/p/31485a3cf5ca
來源:簡書
簡書著作權歸作者所有,任何形式的轉載都請聯繫作者獲得授權並註明出處。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • Kafka的存儲機制以及可靠性 一、kafka的存儲機制 1、segment 1..log 2..index 3.命名規則 2、讀取數據 二、可靠性保證 1、AR 1.ISR 2.OSR 3.LEO 4.HW 5.HW截斷機制 2、生產者可靠性級別 3、leader選舉 4、kafka可靠性的保證 ...
  • 歡迎您的閱讀,本人微信公眾號 "星際互聯網中心"或者 "歡樂的馬小紀" 歡迎關註 ...
  • 1.瀏覽器無法直接通過url訪問 可能原因 :主機名未配置,因此無法識別,在 c:\windows\system32\drivers\etc 目錄添加主機名賀對應ip hostname1 *.*.*.8 2.訪問需要很長時間 hadoop配置文件,jobhistory緩存任務數太多,導致訪問緩慢 在 ...
  • 前言 儘管在Hadoop與NoSQL部署方面做足了準備,同樣的問題仍然一次又一次反覆出現。現在業界是時候儘快搞定這些麻煩事了。 有時候一艘巨輪的側方出現了破洞,但業界卻決定坐等船體下沉、並把希望寄托在銷售救生艇身上。 也有些時候,這些問題似乎並沒到要鬧出人命的地步——類似我家裡浴室的狀況,只有往一邊 ...
  • 經常有初學者在博客和QQ問我,自己想往大數據方向發展,該學哪些技術,學習路線是什麼樣的,覺得大數據很火,就業很好,薪資很高。如果自己很迷茫,為了這些原因想往大數據方向發展,也可以,那麼我就想問一下,你的專業是什麼,對於電腦/軟體,你的興趣是什麼?是電腦專業,對操作系統、硬體、網路、伺服器感興趣? ...
  • 一.概述 在前幾章介紹過 sql server 性能調優資源等待之PAGEIOLATCH,PAGEIOLATCH是出現在sql server要和磁碟作交互的時候,所以加個IO兩個字。這次來介紹PAGELATCH。PAGELATCH類型是sqlserver在緩衝池裡的數據頁面上經常加的另一類latch ...
  • 怎麼盜別人的微信號密碼最簡單方法與軟體及如何盜取對方的微信密碼? 微信可以說是十分重要的一個社交軟體,隨著用戶數量日益增多,人們在生活和中工作中往往離不開微信。但是關於微信的一些話題曾出不窮,甚至讓人防不勝防。因為稍不留神微信號便會被盜,所以只要是使用微信的朋友,在收到僵屍粉的同時,一定要儘快將其清 ...
  • 揭曉黑客步驟:盜微信號密碼最簡單方法與軟體以及怎麼盜取微信密碼? 隨著信息時代的來臨,很多人使用上了微信,微信的出現使得人們的生活變的十便利。人們不僅在工作中使用它,在社交中也讓其發揮了重要的作用。微信現在已經漸漸成為了人們生活中不能缺少的一部分。使用微信除了其方便快捷性之外,其賬號的安全性也引發了 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...