QPM (Quality Performance Monitor) 是一個質量效能監控元件,可以很方便的檢視當前 App 的效能和常用資料。目前主要執行在 Android 平臺上,通過整合 QPM 元件,可以在 App 中通過懸浮窗視覺化相關實時資料。意在幫助廣大開發者和測試同學快速瞭解 App 中存在的效能問題,並展示了很多常用的資料,減少重重複雜的操作。
經過了好幾個月的方案調研,不斷的優化,以及內部版本迭代與測試,目前已經趨於穩定。在北京2018年 GDG 活動中分享了該效能優化元件,並且內部做過深一層次的分享與探討,將大家需要的功能,外加整理,只為更方便的服務於廣大 Android 開發者。現在 QPM 官宣開源啦: github.com/ZhuoKeTeam/…
歡迎各位 Star, 不管你是有什麼樣光怪陸離想法或者創意,都非常期待。盡情的 Issue 和 PR,雖然不能完全的滿足,但是我們會盡力。
QPM 目前擁有的功能:
- 獲取手機常用的基本資訊 (是否 root, 版本號,wifi, 硬體資訊等等)。
- 實時獲取當前 App 的 CPU 和記憶體資訊,可判斷手機是否佔用更多資源。
- UI介面卡不卡,就看 FPS(綠色表示正常,紅色表示卡頓)。
- 輕鬆獲取當前執行的 Activity 名字,快速在程式碼中定位當前介面。
- App 當前開啟多少執行緒,可用於判斷是否佔用過多資源。
- 檢視 App 執行後在3G,4G 的流量消耗情況。
- 監控 H5 頁面,可以判斷出白屏時間和資源請求時間。
- 不方便抓包的時候可以用元件的顯示 API 介面,會記錄請求地址,伺服器相關狀態碼,Cookie, 返回資料。
- 直接獲取當前 App 的 AndroidManifest.xml 資訊,可檢視常用的四大元件,和註冊許可權,並且可直接跳轉到對應的 Activity 頁面中。
- 免 Root 即可獲取到 App 中所有的 SharedPreferences 儲存資訊,並且可修改。方便開發和測試快速定位問題。
- 螢幕錄製,解決某些場景下無法復現問題的流程。
緣起
曾經我和你們一樣,成天疲於業務開發,一天天除了加班,還是加班。可是呢,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 如何進行效能優化?
- 抓包: Charles,Fiddler, Wireshark;
- Android Studio: DDMS, Logcat;
- Android Studio 中 Profiler 的 記憶體,流量,CPU;
- 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,實現裡面的方法,懸浮窗上就可以顯示對應的內容。
懸浮窗 設定資訊
更多實用資訊:
- 手機的基本資訊
- AndroidManifest.xml 資訊
- App 中所有的 SharePreference 資訊
- 可配置的開關
- 網路介面
手機基礎資訊
- 再也不用 去手機的複雜介面檢視各種資料;
- 再也不用 下載 輔助性 apk 獲取資訊;
- 再也不用 因為某些資訊沒有,查詢半天。
是否 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條網路請求資料,可以檢視更多資訊:
- 請求方式;
- 返回狀態碼;
- 請求時長;
- 請求大小;
- 返回資料大小
需要 OkHttp,然後可以獲取網路請求的所有資料,包括請求 Request Header,Request Response,Response等資料。
精簡模式
關注的資料太多會佔滿螢幕,可以開啟精簡模式,預設顯示開關列表最頂部的兩個選項。開關列表可以通過拖動把選項位置移動到想要的前兩項。
QPM 注意事項
QPM 的懸浮窗如果開啟過多的功能,可能會影響效能,推薦:需要什麼功能,就開啟什麼開關,這樣把影響降低到最低。
QPM 與其他同類 PM 的區別
與其他同類 QPM 工具相比,有以下優勢:
- 任何一個內建的 QPM 的 App, 可以直接視覺化相關效能和資料;
- 內建多個引數指標開關,想用哪個就開哪個;
- 精簡模式,只顯示關注的資料指標;
- 自定義了五種模板,可以通過簡單的API,直接將 app 的變化資料動態展示;
- 螢幕錄製;
- H5頁面效能監控;
- 四大元件的展示,並可以直接跳轉到對應的 Activity 中;
- SharedPreferences 檔案直接瀏覽和修改相應的 key 值;
- 通過 OkHttp 展示相關的網路請求資訊;
- 當前 App 的流量使用情況。
開源地址
請給 QPM 一個 Star 吧!