python+adb+monkey實現Rom穩定性測試
我為什麼做這項工作?
其實這項工作是另一位同事在做,過程中發下了一些問題,但是種種原因log和資料都沒有收集到,無法進行分析。然後我就接手了,負責復現她發現的問題並提供log和資料給開發分析。
需要測試的是一個什麼樣的功能?
需求是這樣的:開發在Framework層增加了app應用許可權管控(Android11中基本許可權、自動以許可權、AIDL),服務端可以通過下發指令到手機,控制app可以訪問及不能訪問的許可權。同時安裝app也需要對簽名做校驗。
該如何開始這項工作呢?
不用多言,自動化是必須的,但是如何實施呢? 首先,client端是需要接收指令的,是個指令不能人工操作下發,好在我們有web管理頁面,通過按鍵精靈錄屏可實現不停的向
client下發指令(本來想用selenuim,但是時間關係就使用按鍵精靈吧),這樣就解決了後臺人工不干預的需求。但是Client端呢?
因為我們做的是app的許可權攔截,那就必須有app啊,我們選了30個常用的app和一些測試demo,那麼問題來了,這些app的安裝解除安裝總不能手工進行吧。答案是肯定的,可以通過python+adb install/uninstall,進行安裝和解除安裝。安裝就不說了,無非就是通過python獲取apk路徑然後執行adb install 命令。解除安裝是需要傳入包名的,如何獲取系統已經安裝應用的包名呢? pm list package -3 + awk 命令就可以將apk的包名過濾出來了,然後在使用adb uninstall解除安裝就行了。到此 apk的安裝解除安裝自動化就完成了,那麼新的問題又來了
應用要使用某項許可權肯定要先啟動啊,如何一一的啟動這些app呢?
這裡可能會有人想到使用am命令,但問題是am啟動應用需要知道MainActivity的名稱,雖然通過工具可以一一獲取到,但是這項工作未免太耗時。所以這裡我們不使用am來啟動應用,換成monkey啟動應用,這樣只需要傳入包名即可。
OK,安裝解除安裝、應用啟動的思路都有了,下面就需要收集log和資料了,可以使用python函式subprocess.Popen()函式將logcat命令傳入(logcat過濾log方法不再詳述),這樣測試過程就可以一直輸入log。因為我復現的是黑屏問題,所以測試過程中還需要收集Cpu和Memory資訊,同樣的使用python定時執行命令dumpsys meminfo / cpuinfo來獲取。
指令碼執行結果:
1、第一次執行,在dump的記憶體資訊中發現了 我們的一個本地層程序出現記憶體洩露,我們懷疑是這個洩露引起的黑屏,我們的開發進行了修改。
2、第二輪測試中,同樣的發現了黑屏,但已經不是記憶體洩露引起的了,而是Binder掛了(我們修改過系統的Binder),而且只有360手機衛士和騰訊手機管家這樣的安全應用在裝置上長時間執行才會出現這個問題,所以選擇什麼樣的app也需要根據功能和業務而定,不能盲目。
PS:這項測試工作我覺得是個很好的積累,所以就寫下來;以後再遇到類似的可以拿出來參考。