在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
下通過getprop
和setprop
命令來查詢和設定。這樣我們就可以在APP中通過讀取我們自定義的屬性值來判斷是否進入除錯模式,在我們需要除錯應用時可以通過adb命令來設定對應的屬性值即可。
3.3 dumpsys命令傳遞引數
我們在效能優化時通常會用到dumpsys
這麼一個工具。這個工具可以獲取到系統服務相關資訊。如adb shell dumpsys activity activities
可以獲取到activity的資訊。這個命令執行的時候,系統會遍歷系統中所有Activity
例項,然後呼叫他們的dump
方法。
這樣我們就可以在我們的Activity
中複寫這個方法,來接收從命令列傳遞過來的資料,然後配置相應的除錯環境。