2018年8月24日 星期五

Android Property - setProp配合代碼, 大大加快測試

https://www.jianshu.com/p/1a2123d940c8

1. 前言


最近, 在Android 開發中遇到一個問題, 有個app 需要每次燒寫(比如略修改一些代碼, 就要重新編譯, 再燒錄到Android 手機裡)。
這樣, 對於測試一些代碼的改動就不是很方便了, 比如我要修改Android 底層C++ 代碼中的兩個變量, 這兩個都可以取整數值。
其中一個是echo_delay, 另一個是filter_length。
我要測試出這兩個數值的最佳組合,需要測試很多次,也就是要修改、編譯、燒寫、啟動很多次,這工作量那是相當大呀。

2. 解決


有沒有什麼辦法可以大大減輕工作量呢?必須有!
自己找了一下:
在Android 開發中,你可以用USB 線連接Android 設備和電腦,進入adb 模式(用adb shell),然後用各種命令來操作你的手機。
Android 系統有不少屬性,例如:
ro.product.model
是對應設備的型號。如果我在Samsung 的S5 手機上,它的值是
SM-G900F
這些系統屬性是在/system/build.prop 這個文件中,需要你有Root 權限才能修改。
我們可以用cat 命令來打印出/system/build.prop 這個文件的內容:
cat /system/build.prop
屬性很多,我們只截屏了開頭的一部分。
可以看到屬性中有很多是以ro 開頭的,例如:
ro.product.model
ro.build.id
ro.product.board
等等。
ro 表示Read Only,是英語「只讀」的意思,表示只能讀取,不能修改。
當然了,這些ro開頭的屬性也不是不能修改,你可以通過一些方式來修改。修改的後果自負。
你可以自行Google搜索,或者參考這篇StackOverFlow的文章,或者這篇文章,不過不在本課討論之列。
adb 的眾多命令中有一個命令叫做setprop,是set property(設置屬性)的簡寫,用於為系統設置屬性的值,就是類似鍵值對的概念。
setprop 命令還可以用於設置自定義的屬性。你可以隨便取什麼名字的屬性,例如hostname,可以用如下方法來設置它的值:
setprop 属性名称 属性的值
既然有setprop 命令,Android 也提供了getprop 命令,用於顯示屬性的值。
使用方法如下:
getprop 属性名称
用setprop 設置了設備的屬性之後,在Android 的代碼中就可以獲取到屬性的值。
例如我們來修改系統的一個屬性值,名叫media.enable-commonsource(這個屬性值不是以ro 開頭,不是只讀,可以修改),它的默認值是true。我們可以用
setprop media.enable-commonsource false
把它的值改為false。然後用getprop 來查看它新的值:
getprop media.enable-commonsource
可以看到,media.enable-commonsource 已經被我們從true 改成了false。
用這個原理,我們只要用setprop 命令修改我們的兩個變量的取值,就立即生效了。很方便吧!
首先你可以在Java 代碼中寫一個你自己的readProp 函數,用於根據屬性的名稱來獲取屬性的值,可以類似如下:
private int readProp(String prop) {
        try {
            Process process = Runtime.getRuntime().exec("getprop " + prop);
            InputStreamReader ir = new InputStreamReader(process.getInputStream());
            BufferedReader input = new BufferedReader(ir);
            return Integer.parseInt(input.readLine());
        } catch (IOException e) {
            e.printStackTrace();
        }
        return 0;
    }
}
在你的代碼中調用
int delay = readProp("delay");
int filter = readProp("filter");

Log.i(TAG, "Echo_delay = " + delay + ", filter_length = " + filter);
然後把代碼編譯,燒寫到Android 設備中,再用setprop 命令開始測試。
例如設置echo delay:
setprop delay 250
可以用getprop 命令看看設置的值是否正確:
getprop delay
設置另一個值filter length:
setprop filter 100
getprop filter
我們在Logcat 裡打印出來的值也可以驗證我們的設置:
這樣, 你就只要一次燒寫, 之後這兩個值完全可以通過命令行來實時修改, 豈不快哉~


作者:程序员联盟
链接:https://www.jianshu.com/p/1a2123d940c8
來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

沒有留言: