QPM 性能監控組件總篇

QPM (Quality Performance Monitor) 是一個質量性能監控組件,可以很方便的查看當前 App 的性能和常用數據。目前主要運行在 Android 平臺上,通過集成 QPM 組件,可以在 App 中通過懸浮窗可視化相關實時數據。意在幫助廣大開發者和測試同學快速了解 App 中存在的性能問題,并展示了很多常用的數據,減少重重復雜的操作。

經過了好幾個月的方案調研,不斷的優化,以及內部版本迭代與測試,目前已經趨于穩定。在北京2018年 GDG 活動中分享了該性能優化組件,并且內部做過深一層次的分享與探討,將大家需要的功能,外加整理,只為更方便的服務于廣大 Android 開發者。現在 QPM 官宣開源啦: github.com/ZhuoKeTeam/…

歡迎各位 Star, 不管你是有什么樣光怪陸離想法或者創意,都非常期待。盡情的 Issue 和 PR,雖然不能完全的滿足,但是我們會盡力。

QPM 目前擁有的功能:

  1. 獲取手機常用的基本信息 (是否 root, 版本號,wifi, 硬件信息等等)。
  2. 實時獲取當前 App 的 CPU 和內存信息,可判斷手機是否占用更多資源。
  3. UI界面卡不卡,就看 FPS(綠色表示正常,紅色表示卡頓)。
  4. 輕松獲取當前運行的 Activity 名字,快速在代碼中定位當前界面。
  5. App 當前開啟多少線程,可用于判斷是否占用過多資源。
  6. 查看 App 運行后在3G,4G 的流量消耗情況。
  7. 監控 H5 頁面,可以判斷出白屏時間資源請求時間
  8. 不方便抓包的時候可以用組件的顯示 API 接口,會記錄請求地址,服務器相關狀態碼,Cookie, 返回數據。
  9. 直接獲取當前 App 的 AndroidManifest.xml 信息,可查看常用的四大組件,和注冊權限,并且可直接跳轉到對應的 Activity 頁面中。
  10. 免 Root 即可獲取到 App 中所有的 SharedPreferences 存儲信息,并且可修改。方便開發和測試快速定位問題。
  11. 屏幕錄制,解決某些場景下無法復現問題的流程。

緣起

曾經我和你們一樣,成天疲于業務開發,一天天除了加班,還是加班。可是呢,bug 還是不斷,看著人家的 app 那么流暢,為啥我做的這么挫?What’s fuck! 慢慢的,掌握到一些性能優化的技巧后,熟練的搞起優化,app 就不再那么卡了,看著得意之作,心里滿滿的喜悅。

緣起——GT

當時看到騰訊 GT 的懸浮窗,眼前一亮,這個東西好使,不錯不錯。但是時間就了以后,發現每個手機要看數據必須先安裝一個 GT,而且有些功能需要 root 以后才能查看。我想我們 app 中的某些常變的數據要是能展示到 GT 的懸浮窗就方便很多啦,于是嘗試把 GT 放到我們 App 里面去,此過程超級麻煩,好不容易加進去了,結果我們的 App 直接增大了 3MB, 雖說我們的 App 已經 70MB 了,增加 3MB 也沒事,但是我怎么能忍受得了,一個組件就要增加 3MB 呢? 于是我想結合我們 App 的特性,自己搞一個 QPM,功能很簡單,把一些 GT 里面的數據展示到 QPM 中,于是參考 GT,開始實施。

輪子已經有了,干嘛還要再造一個輪子呢? 其實不然,雖然有了輪子,但是這個輪子和我的車型號不匹配嘛,無法發揮到極致。于是參考輪子的大體框架,改造成屬于我們自己的輪子。貼個花邊,換個螺絲釘,弄個小號的。哈哈哈,最后終于弄出了一個簡易版本,但是太粗糙了,我們自己都不想用。

緣起——FPS

突然接手一個老項目,啥都不太了解,雖然 UI 界面卡卡的,但是不能輕易優化,萬一優化后,背鍋咋弄?就先這樣吧,直到某一天老大說卡的不行啦,必須優化。好吧,那就慢慢優化吧。可是心里總沒譜,怎么樣算優化好呢? 沒個啥指標的,還真不好弄。假如有一個工具可以告訴我哪些界面卡? 卡到什么程度,優化之后可以達到什么樣的效果,該多好呀。在某些手機上有系統自帶的 FPS 指標,可是其他手機沒有嘛,總不能用該手機作為評判標準吧。

緣起——棧頂 Activity 名字

想起之前看同事的手機,每打開一個 App, 就能顯示當前 App 的包名和當前的 Activity 的名字,感覺很不錯,但是沒啥用吧。他說:『我剛來,老大分配了一些任務,但是我不太熟悉代碼,具體頁面怎么查,不是很方便,有這個就可以輕松搞定啦!』 很有道理嘛,可以加一個。某天我在修復 bug 的時候,真找不到頁面,想問問業務同學,這是哪個頁面,他直接讓我用命令行獲取棧頂 Activity 名字,而之前同事說的那個插件應用,需要翻墻下載。從此,我堅定了必須要把這個功能加到我的 QPM 中,我想讓跟我遇到過同樣問題的人,省去這些麻煩。每次小小的進步,之后回頭看那就是一大步。

緣起——屏幕錄制

功能都差不多了,突然有天,一個測試同學,給群里扔了一個小視頻,是出現某個 bug的視頻, 用另外一個手機錄屏的。我在想要是能把這個加到 QPM 里面就好了。過來幾天,我手機上出現了一個問題,我用小米自帶的錄屏工具,輕松就錄制了,發給大佬們。但是大佬問我,怎么錄制呢? 我說用系統自帶的工具,他說他錄制不了,隨后讓他下載軟件進行錄制。這個過程感覺挺麻煩的,更加堅定了我的決心。經過查詢原來 Android 5.0 以上系統就提供了方法哈,那我就直接放到我們的 QPM 中,之后遇到這類需要截屏,但是手頭沒工具的情況,就可以直接開啟 QPM 錄屏了,又是一個棒棒噠的功能。

準備優化前的思考

重復的工作能否減少?

必須可以!

每天重復著同樣的工作,周而復始,枯燥乏味,因此衍生出了自動化操作,比如腳本,工具等,讓人們可以把時間節省下來,做更多的事情。

Android 如何進行性能優化?

  1. 抓包: Charles,Fiddler, Wireshark;
  2. Android Studio: DDMS, Logcat;
  3. Android Studio 中 Profiler 的 內存,流量,CPU;
  4. Android 手機中開發者選項里面有很多輔助性工具。

這些工具都有一個前提,很多都需要手機連接數據線,再打開工具才能使用,如果客戶手機有問題,也如此的話,比較費心費力。對于未 root 的手機要拿到一些信息,著實不易。

測試同學可以進行性能優化監控嗎?

可以,但是業務測試和需求每天都很多, 測試同學沒空,沒精力去測試這方面的性能。除非有專業的性能測試團隊,每天負責檢測。手機發熱,界面卡頓都需要監控起來。

運行 App 即可查看性能

大家加班,加點,忙需求,沒有那么多的時間去看性能問題,最多在幾個關鍵時間點集中處理下。如果我們的 App 運行后,就內置了一個這樣的功能,只要打開開關,就可以懸浮窗到主界面上,根據 FPS,內存,CPU,去看一個檢測頁面卡頓情況就再好不過了。

懸浮窗助力性能優化

讓我們來嘗試做一些可以可視化的懸浮窗功能吧,里面可以展示一些基礎的性能指標數據。

啟動 App 后便可以看到一些數據,解決未 root 手機無法獲取數據的疑難雜癥。

包名

一個 apk 會有一個固定的包名,但是在某些特殊場景下,卻會展示多個包名,例如:測試包,正式包,變種包,推送測試包等等,給 QPM 展示當前應用的包名,在某些時候可以方便我們定位問題。舉個例子:我們之前一直在測試推送包,有時候需要切換到正式包,在兩個包中切換各種RD,ST環境,最后我都不記得我用的什么包,只能卸載了,重新安裝。QPM 的懸浮窗可以直接展示當前應用的包名,看一眼就知道了,其實也可以把當前進程+線程號打印出來,方便開發同學分析問題。

當前 Activity 的名字

試想,做了5年的項目,交給新來你接手?或者同事離職,丟下一堆坑,需要你來填坑。根據代碼梳理流程后,也不一定能立刻接手,如果根據頁面找Activity,一個字————累!

如果能直接展示當前界面的 Activity 名字,是不是更容易一些呢?

CPU 和 內存

界面怎么這么卡啊,快優化下。懵逼的你可能會想這要從哪里入手?先從界面渲染,還是從業務角度? 關鍵是我們需要知道在頁面的什么場景下會出現問題,有一個直觀指標就容易判斷了。當 CPU 到達 200% 的時候,內存劇增,那肯定有問題,可以用性能工具對該頁面詳細的分析。 一般先看看在該界面的 CPU 和 內存是否異常,再結合業務邏輯把相關的數據提前或者延遲獲取,減少同一時刻并發獲取,從而減少主界面卡頓。

線程數

這是什么鬼?還記得曾經的老大說要復用線程,別單獨搞么。如果你發現 200 多個線程,那你就得考慮下是否需要線程池了。這里可以依據現有邏輯來處理,并非絕對性的。

Activity 堆棧

還記得剛學 Activity 那會兒么,Activity的 四種 LaunchMode,這里可以記錄一個棧里面的 Activity 的順序。方便你直觀了解棧中的情況。

流量

我們 App 的請求用了多少流量? 可能在 3G/4G 關注點比較多,雖然現在絕多數都是 WIFI,但是我們的用戶在一定環境下會使用 3G/4G, 所以還是又必須關注下。

網絡情況如何? 比方說我用的是 Wifi, 在某些角落網速很差,甚至沒流量數據,我們都希望可以了解。

在某個時刻,頁面是空白的?為什么沒有數據呢,可以看看嘗試看看下載速度。

尤其對現在約來越多的某些小視頻,大家可能會關心大約用了多少流量。

屏幕錄制

基于 Android 5.0 的 API,錄制整個屏幕,方便大家復現某些關于操作記錄的問題。

監控 H5 頁面

需要配合相應的設置,我們就可以在 WebView 中對任何一個網頁進行異步檢測,例如獲取當前頁面地址,首頁白屏加載時間,以及每個資源的請求時間,和請求資源地址。非常容易。

自定義的五種對外樣式

以下的一個唯一標識,表示一個 item, 如果要添加多個,可以把唯一標示設置為不同的。

  • 大文件框樣式

QPMManager.getInstance().showBigText(flag, bigText); 第一個參數 flag 是唯一標示, 第二個 bigText 是自定義懸浮窗中顯示的所有文本數據。

  • 鍵值對文本樣式

QPMManager.getInstance().showKeyValue(flag, key, value); 第一個參數 flag 是唯一標示, 第二個 key 是自定義懸浮窗中顯示的 key 值,第三個是 懸浮窗中的 value 值。

  • 鍵圖樣式

QPMManager.getInstance().showKeyPic(flag, key, picRes); 第一個參數 flag 是唯一標示, 第二個 key 是自定義懸浮窗中顯示的 key 值,第三個是 懸浮窗中的 pic Res 中的資源值。

  • 圖值樣式

QPMManager.getInstance().showPicValue(flag, picId, value); 第一個參數 flag 是唯一標示, 第二個 key 是自定義懸浮窗中顯示的 key 值,第三個是 懸浮窗中的 pic Res 中的資源值 (可以放到你們的主 App 中)。

  • 自定義樣式

QPMManager.getInstance().showCustom(flag,QPMTemplateCustomRenderer); 第一個參數 flag 是唯一標示, 第二個 QPMTemplateCustomRenderer 是自定義懸浮窗中你們要自己添加的布局,可以寫一個類,繼承自QPMTemplateCustomRenderer,實現里面的方法,懸浮窗上就可以顯示對應的內容。

懸浮窗 設置信息

更多實用信息:

  1. 手機的基本信息
  2. AndroidManifest.xml 信息
  3. App 中所有的 SharePreference 信息
  4. 可配置的開關
  5. 網絡接口

手機基礎信息

  1. 再也不用 去手機的復雜界面查看各種數據;
  2. 再也不用 下載 輔助性 apk 獲取信息;
  3. 再也不用 因為某些信息沒有,查詢半天。

是否 Root, SDK 版本,手機型號,網絡,名稱,IP,Mac 地址,屏幕分辨率,CPU 架構等等信息。遇到關鍵的數據,還能復制。

這里獲取的數據更全面

AndroidManifest.xml 信息

包名,版本號,App 的所有權限,構建 SDK 的版本信息,還有最最重要的注冊的四大組件(Activity,Service,Receiver,Provider)。里面的 Activity 可以直接點擊后跳轉,Service可以查看有多少本地服務,Receiver 可以很明確的知道當前注冊了多少廣播,Provider 可以查看本地的內容提供者。

應用的所有 SP 信息

Root 手機我們直接通過 文件管理器 可以直接查看 SP 文件。

如果沒有 Root 呢? 笨辦法,通過調試代碼或者 log 打印輸出。

包含整個 App 的所有 SP 信息,可以查看單個 SP 里面的信息,最最好的是還能直接修改 對應的 Value。

極大提升程序員們的開發效率。

其他開關

我們提供的了這些基礎功能,打開開關后,可以直接在懸浮窗展示相關數據信息。

自我控制聚焦點,只關注需要的信息。

所有的開關,可以打開,關閉,對于某些影響性能的操作,可以關閉其他所有的東西,保留關注的指標。

每一個開關都可以長按開關名稱的這一條,上下移動位置,調整開關的順序。

網絡接口

獲取最近50條網絡請求數據,可以查看更多信息:

  1. 請求方式;
  2. 返回狀態碼;
  3. 請求時長;
  4. 請求大小;
  5. 返回數據大小

需要 OkHttp,然后可以獲取網絡請求的所有數據,包括請求 Request Header,Request Response,Response等數據。

精簡模式

關注的數據太多會占滿屏幕,可以開啟精簡模式,默認顯示開關列表最頂部的兩個選項。開關列表可以通過拖動把選項位置移動到想要的前兩項。

QPM 注意事項

QPM 的懸浮窗如果開啟過多的功能,可能會影響性能,推薦:需要什么功能,就開啟什么開關,這樣把影響降低到最低。

QPM 與其他同類 PM 的區別

與其他同類 QPM 工具相比,有以下優勢:

  1. 任何一個內置的 QPM 的 App, 可以直接可視化相關性能和數據;
  2. 內置多個參數指標開關,想用哪個就開哪個;
  3. 精簡模式,只顯示關注的數據指標;
  4. 自定義了五種模板,可以通過簡單的API,直接將 app 的變化數據動態展示;
  5. 屏幕錄制;
  6. H5頁面性能監控;
  7. 四大組件的展示,并可以直接跳轉到對應的 Activity 中;
  8. SharedPreferences 文件直接瀏覽和修改相應的 key 值;
  9. 通過 OkHttp 展示相關的網絡請求信息;
  10. 當前 App 的流量使用情況。

開源地址

QPM:??github.com/ZhuoKeTeam/…

請給 QPM ?一個 Star 吧!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/276550.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/276550.shtml
英文地址,請注明出處:http://en.pswp.cn/news/276550.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

福音!微信個人公眾號可以改名了!

微信個人公眾號可以改名了!!!今年,我們學校從景德鎮陶瓷學院更名為景德鎮陶瓷大學,但苦于微信限制,很多微信公眾號無法更名。很多組織社團就放棄了原先的關注量,重新申請注冊賬號。當前我們的訂…

js list刪除指定元素_刪除js數組中的指定元素,有這兩步就夠了

js數組是js部分非常重要的知識,有時我們有這么個需求js數組刪除指定元素,先定義一個函數來獲取刪除指定元素索引值,然后用js數組刪除的方法,來刪除指定元素即可,就兩步不難,很簡單。1、JS的數組對象定義一個…

sudo 安裝 常見錯誤

運行環境Linux: 1、sudo:安裝 apt-get install sudo 2、sudo: must be setuid root錯誤解決方法. ls -l /usr/bin/sudo chown root:root /usr/bin/sudo chmod 4755 /usr/bin/sudo reboot 3、sudo:提示用戶無權限之類 在 /etc/…

慕課網高并發實戰(一)-并發與高并發基本概念

課程網址 并發: 同時擁有兩個或者多個線程,如果程序在單核處理器上運行,多個線程交替得換入或者換出內存,這些線程是同時“存在”的,每個線程都處于執行過程中的某個狀態,如果運行在多核處理器上&#xff…

2009最經典名句

一:我的優點是:我很帥;但是我的缺點是:我帥的不明顯. 二:談錢不傷感情,談感情最他媽傷錢。 三:我詛咒你一輩子買方便面沒有調料包。 四:會計說:“你晚點來領工資吧&#…

計算機協會丨讓技能得到提升,讓思維受到啟迪

“ 各位2016級新生,新的學期馬上就要開始了,學校的各個組織和社團你真的了解了嗎?在眼花繚亂的社團里如何找到自己真正喜歡的呢?或許看完計算機協會的納新微信你就都明白啦!關鍵詞:計算機協會景德鎮陶瓷大學…

ondestroy什么時候調用_尾調用和尾遞歸

尾調用1. 定義尾調用是函數式編程中一個很重要的概念,當一個函數執行時的最后一個步驟是返回另一個函數的調用,這就叫做尾調用。注意這里函數的調用方式是無所謂的,以下方式均可:函數調用: func()方法調用: obj.method()call調用:…

查看/修改Linux時區和時間

轉載鏈接:http://blog.csdn.net/colincjl/article/details/6133036 查看/修改Linux時區和時間 一、時區 1. 查看當前時區 date -R 2. 修改設置時區 方法(1) tzselect 方法(2) 僅限于RedHat Linux 和 CentOS timeconfig 方法(3) 適用于Debian dpkg-reconfigure tzdat…

dhl:使用return RedirectToAction()和 return view()

一個Action&#xff1a; Code/// <summary> /// Friend好友的地 /// </summary> /// <returns></returns> public ActionResult FriendFarm(string pid) {BLL.DTOFarm farm new AppleGrange.BLL.DTOFarm(pid); …

【更名通知】將以個人名義繼續更新維護

這是我&#xff08;2013年任職計算機協會會長&#xff09;在2013年申請的公眾號。由于2016年學校陶院更名為陶大&#xff0c;在當時公眾號無法修改名稱。后來計協的的學弟學妹申請了新的公眾號"陶大計算機Association"&#xff0c;大家可以前往關注&#xff0c;所以該…

CentOS7.6 MySQL8環境搭建 配置遠程登錄 字符集UTF8 簡單密碼

一、環境準備 1、清理環境中系統自帶的MySQL &#xff08;1&#xff09;刪除系統自帶的MySQL或Mariadb yum remove mysql-libs &#xff08;2&#xff09;查詢系統中是否還有殘余的依賴包 rpm -qa | grep mariadb &#xff08;3&#xff09;刪除rpm依賴包 rpm -e --nodeps mar…

radio切換控制div顯示_JavaScript連載31圖片動態切換以及關閉圖片案例

一、圖標切換31.1點擊那兩個按鈕可以做到輪番顯示圖片二、關閉圖片案例31.2點擊右上角的叉&#xff0c;圖片會消失。三、源碼&#xff1a;D31_iconSwitch.htmlD31_2_CloseImage.html地址:https://github.com/ruigege66/JavaScript/blob/master/D31_iconSwitch.htmlhttps://gith…

jQuery 1.9+ 移除$.browser方法

轉載鏈接&#xff1a;http://blog.csdn.net/czplplp_900725/article/details/8704438 jQuery 從 1.9 版開始&#xff0c;移除了 $.browser 和 $.browser.version &#xff0c;取而代之的是 $.support。 在更新的 2.0 版本中&#xff0c;將不再支持 IE 6/7/8。 以后&#xff0c;…

ASP.NET跨頁傳值方法匯總

方法一&#xff1a;問號傳值&#xff08;Response.Redirect方法&#xff09;1&#xff1a;源頁&#xff1a;在按鈕的點擊事件程序中寫入Response.Redirect方法&#xff0c;在其中使用問號傳值。如&#xff1a;Response.Redirect("Default2.aspx?id"txtId.Text.Trim(…

工作一年后,我有些感悟(寫于2017年)

時間拉回到2016年5月23日&#xff0c;當天拍畢業照&#xff0c;晚上是大學畢業酒會&#xff0c;那一晚整個酒店都彌漫著傷感的氣息。那一晚大家為了找KTV拖延到很晚&#xff0c;最后一群人選擇來到了操場&#xff0c;凌晨兩點多一群人還在操場上玩著游戲。5月25日離校&#xff…

PHP基礎學習之數組使用要點

一、什么是PHP數組&#xff1f;數組 array 是一組有序的變量&#xff0c;其中每個變量都被稱為一個元素。每個元素由一個特殊的標識符來區分&#xff0c;這個標識符稱之為鍵&#xff08;也可以稱之為下標&#xff09;。數組中的每個元素都包含兩項&#xff1a;鍵和值。可以通過…

python和php可以一起用嗎_Apache同時支持PHP和Python的配置方法

最近開始學著用PythonTornadoMongoDB寫網站&#xff0c;興起寫了一個博客&#xff0c;覺得很有意思所以想掛在服務器上發布出去找大家一起玩。這個時候就遇到了問題。服務器是windows系統&#xff0c;安裝的是Apache&#xff0c;所以需要配置Apache&#xff0c;使Apache同時支持…

CCNA課堂精簡筆記

網絡的三層架構:1.接入層: 提供網絡接入點,相應的設備端口相對密集. 主要設備:交換機,集線器.2.匯聚層: 接入層的匯聚點,能夠提供路由決策.實現安全過濾,流量控制.遠程接入. 主要設備:路由器.3.核心層: 提供更快的傳輸速度, 不會對數據包做任何的操作OSI七層網絡模型: Protocol…

PHP判斷客戶端的瀏覽器類型

轉載鏈接:http://www.php100.com/html/webkaifa/PHP/PHPyingyong/2013/0516/13461.html #判斷瀏覽器語言&#xff1a; if ($_SERVER[HTTP_ACCEPT_LANGUAGE]"zh-cn") {$c_lang"GB";echo 您的系統語言為<b>簡體中文</b>,系統將自動選擇程序語言為…

高考七年后、工作三年后的感悟

本打算端午假期發表這文章&#xff0c;后來因為文章還需要有些調整&#xff0c;工作日又比較忙&#xff0c;就到今天周三才發。隨便寫了近3000字&#xff0c;文章最后有免費送書活動&#xff0c;歡迎留言參與。又一年高考結束了。轉眼高考過去七年了&#xff0c;工作了三年。很…