1. 編譯 CTS
編譯 CTS 很簡(jiǎn)單,只需要如下 3 步。(黑色字體表示命令,灰色背景表示輸入命令后的輸出信息)
(進(jìn)入 android 源代碼路徑)
localhost ~ # cd /work/android_src
localhost android_src # source build/envsetup.sh (進(jìn)行一些初始化工作)
including device/htc/dream/vendorsetup.sh
including device/htc/passion/vendorsetup.sh
including device/htc/sapphire/vendorsetup.sh
(編譯 CTS)
localhost android_src # make cts
============================================
PLATFORM_VERSION_CODENAME=REL
PLATFORM_VERSION=2.2
TARGET_PRODUCT=generic
TARGET_BUILD_VARIANT=eng
TARGET_SIMULATOR=
TARGET_BUILD_TYPE=release
TARGET_BUILD_APPS=
TARGET_ARCH=arm
HOST_ARCH=x86
HOST_OS=linux
HOST_BUILD_TYPE=release
BUILD_ID=FRF85B
============================================
.......................................(略)
編譯過(guò)程可能并不是一帆風(fēng)順,一般需要遇到 2 個(gè)問(wèn)題。
1)沒(méi)有設(shè)置 android 的 java 環(huán)境變量
沒(méi)有設(shè)置 Java 的環(huán)境變量,編譯時(shí)會(huì)出現(xiàn)以下錯(cuò)誤:
make: *** No rule to make target `run-java-tool', needed by `out/target/common/docs/api-stubs-timestamp'. Stop.
解決方法:
使用如下命令,設(shè)置環(huán)境變量。
localhost android_src # export ANDROID_JAVA_HOME=$JAVA_HOME
2)修改編譯發(fā)現(xiàn)的文件沖突
在編譯中會(huì)多次出現(xiàn)文件編譯沖突現(xiàn)象,這里列舉一例:
java.util.zip.ZipException: duplicate entry: hyts_Foo.c
at java.util.zip.ZipOutputStream.putNextEntry(ZipOutputStream.java:175)
at java.util.jar.JarOutputStream.putNextEntry(JarOutputStream.java:92)
at sun.tools.jar.Main.addFile(Main.java:713)
at sun.tools.jar.Main.update(Main.java:567)
at sun.tools.jar.Main.run(Main.java:202)
at sun.tools.jar.Main.main(Main.java:1149)
make: *** [out/target/common/obj/JAVA_LIBRARIES/core-tests_intermediates/javalib.jar]
Error 1
make: *** Deleting file `out/target/common/obj/JAVA_LIBRARIES/core-
tests_intermediates/javalib.jar'
解決辦法:
出現(xiàn)這個(gè)問(wèn)題是由于源代碼中存在多個(gè)叫做 hyts_Foo.c 的源文件,只需要把重名的文件刪除掉或改名即可。重復(fù)文件一般位于 dalvik 目錄內(nèi)。(千萬(wàn)不要把所有叫做 hyts_Foo.c 的文件都刪除,那樣你就糗大了。一定要留下來(lái)一個(gè),建議改名,不要?jiǎng)h除文件。)
(在 dalvik 目錄內(nèi)查找 localhost android_src # find dalvik -name hyts_Foo.chyts_Foo.c 文件)
./dalvik/libcore/support/src/test/resources/hyts_Foo.c
./dalvik/libcore/luni/src/test/resources/hyts_Foo.c
localhost android_src #mv dalvik/libcore/luni/src/test/resources/hyts_Foo.c
dalvik/libcore/luni/src/test/resources/hyts_Foo.c.bak
(使用 mv 命令,把 hyts_Foo.c 文件重命名為 hyts_Foo.c .bak)
localhost android_src # make cts (再次 make 即可)
2. 配置開發(fā)板上網(wǎng)
要測(cè)試 android 網(wǎng)絡(luò)功能,必須要正確設(shè)置開發(fā)板的網(wǎng)絡(luò)功能。看這部分內(nèi)容之前,大家可能已經(jīng)看過(guò)別人總結(jié)的內(nèi)容了,這里就再羅嗦的提一下,介紹之前,首先
要感謝任云 TX 的幫忙。
主要有以下幾步:
1)給開發(fā)板開通網(wǎng)絡(luò)權(quán)限,個(gè)人電腦開通 USB 和串口權(quán)限(這一步是必須的。)
2)連接好網(wǎng)線和串口,通過(guò) mimicom 命令,配置開發(fā)板的 IP 地址。
localhost ~ # minicom (啟動(dòng) mimicom)
啟動(dòng)開發(fā)板,可以看到串口打印的信息。
Booted Device: eMMC
Board: EM/EV ES2 (Rev.48044220)
Core: 1.15v
DRAM: 256 MB
Flash: 32 MB
In: serial
Out: serial
Err: serial
Hit any key to stop autoboot: 0
## Booting kernel from Legacy Image at 40007fc0 ...
Image Name: Linux-2.6.29
Image Type: ARM Linux Kernel Image (uncompressed)
Data Size: 3914080 Bytes = 3.7 MB
Load Address: 40008000
Entry Point: 40008000
Verifying Checksum ... OK
Loading Kernel Image ... OK
OK
Starting kernel ...
........................(略)
(啟用 busybox 的 shell 模式 )
localhost ~ # busybox sh
(配置網(wǎng)卡 IP 地址為 192.168.22.111)
localhost ~ # ifconfig eth0 192.168.22.111
localhost ~ # busybox route add default gw 192.168.22.1 (配置缺省網(wǎng)關(guān)為192.168.22.1)
localhost ~ # setprop net.eth0.dns1 192.168.100.200 (配置網(wǎng)口的 dns 服務(wù)器地址為 192.168.100.200 )
localhost ~ # setprop net.dns1 192.168.100.200 (配置 DNS 地址為 192.168.100.200 )
(注:以上網(wǎng)絡(luò)地址僅是個(gè)例子,用的時(shí)候需要根據(jù)具體網(wǎng)絡(luò)情況進(jìn)行修改。在配置route 命令的時(shí)候,需要開發(fā)板預(yù)先安裝 busybox 軟件,不然會(huì)配置不成功。板子重
啟后,需要重新配置一遍,不然板子會(huì)又上不了網(wǎng)。)
3. CTS 測(cè)試
用 USB 連接開發(fā)板和辦公電腦,就可以開始進(jìn)行 cts 測(cè)試了。
測(cè)試步驟如下:
1)進(jìn)入 cts 目錄,啟動(dòng) cts。
localhost bin # pwd
/work/android_src/out/host/linux-x86/bin (cts 可執(zhí)行程序放在 android 源代碼/work/android_src 中的/out/host/linux-x86/bin 路徑下。)
localhost bin # ./cts (啟動(dòng) cts)
啟動(dòng)開發(fā)板會(huì)在屏幕上顯示下面信息。
Android CTS version 2.2_r1
Device(0123456789ABCDEF) connected (開發(fā)板已經(jīng)連接,說(shuō)明 USB 已經(jīng)連接好,可以進(jìn)行 CTS 測(cè)試了)
cts_host > start --plan VM (啟動(dòng) cts 的 VM 測(cè)試計(jì)劃)
start test plan VM
==============================================================
Test package: android.core.vm-tests
dot.junit.opcodes.add_double_2addr.JUnit_Test_add_double_2addr#testB1....(pass)
dot.junit.opcodes.add_double_2addr.JUnit_Test_add_double_2addr#testB2...(pass)
dot.junit.opcodes.add_double_2addr.JUnit_Test_add_double_2addr#testB3....(pass)
........................(略)
如果以前跑過(guò) VM 測(cè)試,或由于某種原因?qū)е?VM 測(cè)試暫停,在下次 cts 測(cè)試,會(huì)顯示如下信息:
localhost bin # ./cts
Android CTS version 2.2_r1
Device(0123456789ABCDEF) connected
cts_host > start --plan VM
cts_host > There are 1 existing session(s) for plan VM.
Create a new session or choose an existing one?
(表示對(duì) VM 重新進(jìn)行測(cè)試)
Create a new session [0]
(表示從上次中斷的地方開始繼續(xù)進(jìn)行測(cè)試)
Choose a session [1]
(輸入 1,從上次中斷處繼續(xù)進(jìn)行測(cè)試)
(VM 如果重新測(cè)試過(guò)兩次及以上,會(huì)出現(xiàn)下面的信息,session 值越小,表示上次測(cè)試時(shí)間離目前時(shí)間越遠(yuǎn))
Please choose a session from the existed session(s):
1 [0]
7 [1]
(從最早一次開始進(jìn)行測(cè)試)
0
resume test plan VM (session id = 1)
==============================================================
Test package: android.core.vm-tests
dot.junit.opcodes.add_float_2addr.JUnit_Test_add_float_2addr#testN5...(pass)
........................(略)
測(cè)試中存在著很多意想不到的情況,會(huì)導(dǎo)致 cts 測(cè)試中斷,可見 cts 功能做得很貼心。上面這點(diǎn)一定要知道,因?yàn)樗浅V匾?br>2)測(cè)試時(shí)注意事項(xiàng):
如果測(cè)試中出現(xiàn)板子跑死了,需要重新開始測(cè)試,只需要把板子重新啟動(dòng),千萬(wàn)不要通過(guò) Ctrl+C 的方式把正在運(yùn)行的 cts 中斷掉,因?yàn)樵谙硎?Ctrl+C)帶來(lái)快感的
同時(shí),很有可能會(huì)導(dǎo)致測(cè)試結(jié)果毀于一旦。這一點(diǎn)非常重要,我在測(cè)試 VM 的時(shí)候,就多次遇到這種問(wèn)題,導(dǎo)致測(cè)試進(jìn)度緩慢,一天也沒(méi)有把 VM 測(cè)試完。
(注:這一點(diǎn)也并不是每次必現(xiàn)的,在測(cè)試 Java 部分的時(shí)候,一次失敗都沒(méi)有遇到 ,但在測(cè)試 VM 的時(shí)候卻多次出現(xiàn),搞的我真的很郁悶,看來(lái),以后只能多攢點(diǎn) RP 了 。
通過(guò)(Ctrl+C)中斷測(cè)試真的很爽,如果測(cè)試進(jìn)度要求很緊的話,還是不用為妙,按板子的 reset 鍵,對(duì)于 cts 測(cè)試來(lái)說(shuō),更迅速點(diǎn),可以一鍵搞定問(wèn)題。)
4. 修改 CTS 測(cè)試結(jié)果(僅限特殊情況下使用)
CTS 測(cè)試完成,會(huì)生成測(cè)試報(bào)告,存放在下面路徑下:
/work/android_src/out/host/linux-x86/cts/android-cts/repository/results
(/work/android_src 是本人電腦上 android 源代碼的存放路徑)
以一個(gè) CTS 測(cè)試結(jié)果為例,生成的目錄結(jié)構(gòu)如下:
├── 2010.10.19_10.39.00
│ ├── cts_result.css
│ ├── cts_result.xsl
│ ├── logo.gif
│ ├── newrule-green.png
│ └── testResult.xml
├── 2010.10.19_10.39.00.zip
CTS 測(cè)試結(jié)果會(huì)生成一個(gè)按照測(cè)試時(shí)間命名的 2010.10.19_10.39.00.zip .zip 壓縮包,和一個(gè)同名的文件夾。可以進(jìn)入測(cè)試結(jié)果文件夾中用瀏覽器打開 testResult.xml 文件,就可以看到 CTS 的測(cè)試結(jié)果。(注意,測(cè)試結(jié)果中的 5 個(gè)文件一個(gè)都不能少,不然用瀏覽器打不開。)
CTS 默認(rèn)情況測(cè)試時(shí)會(huì)把所有的測(cè)試選項(xiàng)全部測(cè)試一遍,但有時(shí),有些功能由于板子不支持,不需要進(jìn)行測(cè)試,就可以通過(guò)下面介紹的方法修改 cts 的測(cè)試結(jié)果。千
萬(wàn)不要為了有個(gè)好看的測(cè)試結(jié)果而使用 ! 以下面這個(gè)測(cè)試結(jié)果為例,介紹下如何把測(cè)試結(jié)果修改為“notExecuted”。修改之前,一定要記得把需要修改的測(cè)試結(jié)果備份一下,以防意外。
4.1 把測(cè)試結(jié)果中的“pass”修改為“notExecuted”
用 gedit 打開 testResult.xml 文件,通過(guò)“Ctrl+F”鍵查找到需要修改的測(cè)試選項(xiàng)testGetDefault,查找結(jié)果如下圖所示。
修改方法:
把 result="pass"修改為 result="notExecuted"即可。
4.2 把測(cè)試結(jié)果中的“fail”修改為“notExecuted”
通過(guò)查找,fail 的結(jié)果如下圖所示。從測(cè)試結(jié)果可以看到<StackTrace>之間的內(nèi)容為測(cè)試失敗的堆棧調(diào)用順序,這對(duì)于定位故障有很好的參考作用。
修改方法:
1)把測(cè)試結(jié)果中的 result="pass"修改為 result="notExecuted"。
2)刪除<FailedScene messag 開始到</FailedScene>的所有內(nèi)容。
修改后的結(jié)果如下:
4.3 修改測(cè)試結(jié)果的 Summary
用瀏覽器打開的測(cè)試報(bào)告,最上面會(huì)有個(gè) TestSummary 一欄,修改了測(cè)試報(bào)告結(jié)果之后,還需要把 Tests Passed、Tests Failed、Tests Timed out、Tests Not Executed 值修改正確,也就是簡(jiǎn)單的算術(shù)加減法,同樣在 testResult.xml 文件中修改。
下面是修改之前的 Test Summary。
要把它修改為下面的結(jié)果。
修改方法:
查找“Summary”,找到測(cè)試結(jié)果。把修改上面的內(nèi)容即可,修改結(jié)果如下:
4.4 檢驗(yàn)修改是否正確
用瀏覽器打開 testResult.xml 文件,如果瀏覽器打開時(shí)有報(bào)錯(cuò),說(shuō)明有的地方修改不正確了,可以根據(jù)錯(cuò)誤提示修改過(guò)來(lái)。
5. 測(cè)試單個(gè)測(cè)試包或用例
CTS 允許測(cè)試單個(gè) package 或 test,這對(duì)于重新測(cè)試那些沒(méi)有通過(guò)的項(xiàng)目省下了很多時(shí)間。以下面的測(cè)試結(jié)果為例,介紹下測(cè)試命令。
5.1 測(cè)試單個(gè) packet
上圖中 testSendMessages 測(cè)試項(xiàng)沒(méi)有通過(guò),可以把它所在的 package android.telephony.gsm.cts.SmsManagerTest 重新測(cè)試一下。測(cè)試命令如下。
cts_host > start --plan Java -p android.telephony.gsm.cts.SmsManagerTest
(注:--plan 表示這個(gè) Packet 所在的測(cè)試計(jì)劃,-p 表示所要測(cè)試的 packet)
5.2 測(cè)試單個(gè) test
如果覺(jué)得測(cè)試 packet 測(cè)試項(xiàng)目太多,也可以對(duì)單個(gè)測(cè)試失敗的 testSendMessages 進(jìn)行測(cè)試。測(cè)試命令如下。
cts_host > start --plan Java -t android.telephony.gsm.cts.SmsManagerTest#testSendMessages
(注:--plan 表示 test 所在的測(cè)試計(jì)劃,-t 表示具體的 test,android.telephony.gsm.cts.SmsManagerTest#testSendMessages 是由兩部分組成,測(cè)試的packet 和測(cè)試的 test,他們通過(guò)#分割開。)
不管是 packet 測(cè)試還是 test 測(cè)試,一定要建立一個(gè)新的 session,因?yàn)樾?session中的測(cè)試項(xiàng)目都是“NotExecuted”,不然由于之前存在的 session 中的測(cè)試包或測(cè)試項(xiàng)目可能已經(jīng)測(cè)試過(guò),CTS 就不會(huì)再重新進(jìn)行測(cè)試。
6. 總結(jié)
Android 希望建立一個(gè)開放性的平臺(tái),可以讓開發(fā)者在這個(gè)平臺(tái)上面開發(fā)出具有創(chuàng)新性的移動(dòng)應(yīng)用軟件,為了保證這些軟件可以運(yùn)行在各種終端設(shè)備上,Android 兼
容性項(xiàng)目定義了 Android 平臺(tái)的各種技術(shù)細(xì)節(jié),并提供了測(cè)試工具 CTS。CTS 具有多達(dá) 2 萬(wàn)多個(gè)的測(cè)試用例,可以測(cè)試 Android 的各個(gè)方面。因此,如果一款應(yīng)用軟件可以通過(guò) CTS 測(cè)試,說(shuō)明它具有相當(dāng)好的兼容性,按照 Android 官方的說(shuō)法,這款軟件就可以在 Android market 上發(fā)布了。希望大家都能夠用好這款測(cè)試工具。
cts_host > start --plan Performance
start test plan Performance
==============================================================
Test package: android.performance2
android.performance2.cts.AppStartup#testStartup..............................................(timeout)
==============================================================
CTS_INFO >>> Max ADB operations reached. Restarting ADB...
CTS_INFO >>> Restarting device ...
CTS_INFO >>> Restart complete.
==============================================================
Test package: android.performance3
android.performance3.cts.AppStartup#testStartup.......(pass)
CTS_INFO >>> Max ADB operations reached. Restarting ADB...
CTS_INFO >>> Restarting device ...
CTS_INFO >>> Restart complete.
==============================================================
Test package: android.performance4
android.performance4.cts.AppStartup#testStartup......(pass)
CTS_INFO >>> Max ADB operations reached. Restarting ADB...
CTS_INFO >>> Restarting device ...
CTS_INFO >>> Restart complete.
==============================================================
Test package: android.performance5
android.performance5.cts.AppStartup#testStartup...(fail)
Unable to find instrumentation target package: com.android.alarmclock
CTS_INFO >>> Max ADB operations reached. Restarting ADB...
CTS_INFO >>> Restarting device ...
CTS_INFO >>> Restart complete.
==============================================================
Test package: android.performance
android.performance.cts.MultiAppStartupTest#testMultipleApps....(fail)
android.content.ActivityNotFoundException: Unable to find explicit activity class {com.android.alarmclock/com.android.alarmclock.AlarmClock}; have you declared this activity in your AndroidManifest.xml? at android.app.Instrumentation.checkStartActivityResult(Instrumentation.java:1404)
at android.app.Instrumentation.checkStartActivityResult(Instrumentation.java:1404)
at android.app.Instrumentation.execStartActivity(Instrumentation.java:1378)
at android.app.ContextImpl.startActivity(ContextImpl.java:622)
at android.performance.cts.MultiAppStartupTest.launchActivity(MultiAppStartupTest.java:52)
(部分略去)
Test summary: pass=2 fail=2 timeOut=1 notExecuted=0 Total=5
Time: 599.253s
本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)
點(diǎn)擊舉報(bào)。