-- 作者 謝恩銘 轉(zhuǎn)載請(qǐng)注明出處
內(nèi)容簡(jiǎn)介
- 前言
- 解決
1. 前言
最近, 在 Android 開發(fā)中遇到一個(gè)問題, 有個(gè) app 需要每次燒寫(比如略修改一些代碼, 就要重新編譯, 再燒錄到 Android 手機(jī)里)皱蹦。
這樣, 對(duì)于測(cè)試一些代碼的改動(dòng)就不是很方便了, 比如我要修改 Android 底層 C++ 代碼中的兩個(gè)變量, 這兩個(gè)都可以取整數(shù)值劫樟。
其中一個(gè)是 echo_delay, 另一個(gè)是 filter_length盯漂。
我要測(cè)試出這兩個(gè)數(shù)值的最佳組合,需要測(cè)試很多次待逞,也就是要修改梳玫、編譯涧至、燒寫斤讥、啟動(dòng)很多次,這工作量那是相當(dāng)大呀同眯。
2. 解決
有沒有什么辦法可以大大減輕工作量呢绽昼?必須有!
自己找了一下:
在 Android 開發(fā)中须蜗,你可以用 USB 線連接 Android 設(shè)備和電腦硅确,進(jìn)入 adb 模式(用 adb shell),然后用各種命令來(lái)操作你的手機(jī)唠粥。
Android 系統(tǒng)有不少屬性疏魏,例如:
ro.product.model
是對(duì)應(yīng)設(shè)備的型號(hào)。如果我在 Samsung 的 S5 手機(jī)上晤愧,它的值是
SM-G900F
這些系統(tǒng)屬性是在 /system/build.prop 這個(gè)文件中大莫,需要你有 Root 權(quán)限才能修改。
我們可以用 cat 命令來(lái)打印出 /system/build.prop 這個(gè)文件的內(nèi)容:
cat /system/build.prop
屬性很多官份,我們只截屏了開頭的一部分只厘。
可以看到屬性中有很多是以 ro 開頭的,例如:
ro.product.model
ro.build.id
ro.product.board
等等舅巷。
ro 表示 Read Only羔味,是英語(yǔ)「只讀」的意思,表示只能讀取钠右,不能修改赋元。
當(dāng)然了,這些 ro 開頭的屬性也不是不能修改飒房,你可以通過一些方式來(lái)修改搁凸。修改的后果自負(fù)。
你可以自行 Google 搜索狠毯,或者參考這篇 StackOverFlow 的文章护糖,或者這篇文章,不過不在本課討論之列嚼松。
adb 的眾多命令中有一個(gè)命令叫做 setprop嫡良,是 set property(設(shè)置屬性)的簡(jiǎn)寫锰扶,用于為系統(tǒng)設(shè)置屬性的值,就是類似鍵值對(duì)的概念寝受。
setprop 命令還可以用于設(shè)置自定義的屬性坷牛。你可以隨便取什么名字的屬性,例如 hostname很澄,可以用如下方法來(lái)設(shè)置它的值:
setprop 屬性名稱 屬性的值
既然有 setprop 命令漓帅,Android 也提供了 getprop 命令,用于顯示屬性的值痴怨。
使用方法如下:
getprop 屬性名稱
用 setprop 設(shè)置了設(shè)備的屬性之后,在 Android 的代碼中就可以獲取到屬性的值器予。
例如我們來(lái)修改系統(tǒng)的一個(gè)屬性值浪藻,名叫 media.enable-commonsource(這個(gè)屬性值不是以 ro 開頭,不是只讀乾翔,可以修改)爱葵,它的默認(rèn)值是 true。我們可以用
setprop media.enable-commonsource false
把它的值改為 false反浓。然后用 getprop 來(lái)查看它新的值:
getprop media.enable-commonsource
可以看到萌丈,media.enable-commonsource 已經(jīng)被我們從 true 改成了 false。
用這個(gè)原理雷则,我們只要用 setprop 命令修改我們的兩個(gè)變量的取值辆雾,就立即生效了月劈。很方便吧!
首先你可以在 Java 代碼中寫一個(gè)你自己的 readProp 函數(shù)惭墓,用于根據(jù)屬性的名稱來(lái)獲取屬性的值而姐,可以類似如下:
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;
}
}
在你的代碼中調(diào)用
int delay = readProp("delay");
int filter = readProp("filter");
Log.i(TAG, "Echo_delay = " + delay + ", filter_length = " + filter);
然后把代碼編譯拴念,燒寫到 Android 設(shè)備中,再用 setprop 命令開始測(cè)試丈莺。
例如設(shè)置 echo delay:
setprop delay 250
可以用 getprop 命令看看設(shè)置的值是否正確:
getprop delay
設(shè)置另一個(gè)值 filter length:
setprop filter 100
getprop filter
我們?cè)?Logcat 里打印出來(lái)的值也可以驗(yàn)證我們的設(shè)置:
這樣, 你就只要一次燒寫, 之后這兩個(gè)值完全可以通過命令行來(lái)實(shí)時(shí)修改, 豈不快哉~
對(duì)于 Android 嵌入式開發(fā)來(lái)說弛秋,這種方法還是非常實(shí)用的, 可以大大加快測(cè)試和開發(fā)速度。
我是謝恩銘登失,在巴黎奮斗的軟件工程師挖炬。
熱愛生活,喜歡游泳意敛,略懂烹飪。
人生格言:「向著標(biāo)桿直跑」