做一個可除錯的Android應用

都有米發表於2019-04-13

在Android APP開發測試的過程中通常會有如下的需求:動態開關某一功能,方便對比驗證,如在測試環境和生產環境之間切換網路請求的介面;或者是線上版本出問題時,開啟某些測試功能或者日誌的開關,方便定位問題。如果採用修改程式碼重新打包的方式則太繁瑣,類似情況下常見的有如下一些方式從外部傳遞給APP一些引數來修改APP的配置。

1、留彩蛋

留彩蛋的意思就是事先將Debug相關的功能開關寫在一個隱藏的設定介面裡,開啟這個設計介面的路徑比較深或者操作比較複雜,普通使用者常規操作一般不會觸發這個隱藏的設定介面。比如Android手機的“開發者選項”介面。進入這種彩蛋頁面的操作一般是某個按鈕的連續點選+物理按鍵的長按,或者是搜尋框/輸入框輸入特定的字串,或者是掃描特定二維碼等等。

開發者選項

2、配置檔案

還有一種做法是在想要除錯我們的應用時,可以在裝置SD卡的特定路徑上放置一個固定名稱的檔案。當應用啟動時可以去約定的路徑下查詢,看是否存在相應的檔案,如果有就可以進入debug模式,還可以從該檔案中讀取到相應的配置引數。

3、Android系統相關屬性

3.1 Intent中帶引數 我們想要除錯的應用是A,另外做一個應用B,B這個應用的唯一作用就是來啟動A,啟動時從Intent中帶所需的除錯引數過去。也就是我們把A應用的除錯引數配置介面寫在B應用裡,當我們想要除錯A時,不要直接從桌面圖示中進入A,而是先進入B應用,在B應用裡配置好我們所需要的引數後,再從B應用裡的跳轉按鈕進入A應用,這樣在B中配置的引數就可以通過Intent傳遞到A應用中了。

Intent intent = new Intent();
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.setClassName("com.android.settings","com.android.settings.wifi.WifiNoInternetDialog");
intent.putExtra("debugInfo", "api=debug&log=open");
mContext.startActivity(intent);
複製程式碼

3.2 設定系統屬性 Android系統中有一個系統屬性服務,這個服務管理系統全域性的配置和狀態,這些配置和狀態都是一些key-value。系統中每個程式都可以通過SystemProperties.get("key")來獲取這些全域性的屬性值。這些屬性值還可以adb shell下通過getpropsetprop命令來查詢和設定。這樣我們就可以在APP中通過讀取我們自定義的屬性值來判斷是否進入除錯模式,在我們需要除錯應用時可以通過adb命令來設定對應的屬性值即可。

系統屬性

3.3 dumpsys命令傳遞引數 我們在效能優化時通常會用到dumpsys這麼一個工具。這個工具可以獲取到系統服務相關資訊。如adb shell dumpsys activity activities可以獲取到activity的資訊。這個命令執行的時候,系統會遍歷系統中所有Activity例項,然後呼叫他們的dump方法。

Activity的dump方法

這樣我們就可以在我們的Activity中複寫這個方法,來接收從命令列傳遞過來的資料,然後配置相應的除錯環境。

示例

相關文章