1. 需要設(shè)置的環(huán)境變量
ANDROID_HOME=D:\Android\android-sdks
ANDROID_SDK_HOME=D:\Android\avd
JAVA_HOME= C:\Program Files\Java\jdk1.7.0_05
CLASSPATH=.;%JAVA_HOME%\lib\tools.jar;%JAVA_HOME%\lib\dt.jar;
PATH=...;(追加)%ANDROID_HOME%\tools;%ANDROID_HOME%\platform-tools;%JAVA_HOME%\bin;%CLASSPATH%
注意,環(huán)境設(shè)置后重啟電腦才生效。
如果知道環(huán)境變量是否生效,?例如查看ANDROID_HOME環(huán)境變量的設(shè)置,,開始->運(yùn)行->cmd,在cmd下面輸入echo
% ANDROID_HOME%,,如果與我們預(yù)期的一致就說明生效了,。如果原樣輸出% ANDROID_HOME%就說明環(huán)境變量未生效,需要重啟操作系統(tǒng),。
詳細(xì)說明如下
1.1 ANDROID_HOME
ANDROID_HOME= D:\Android\android-sdks,,指定sdk包含的位置,什么是sdk,?網(wǎng)上去搜,,簡單點(diǎn)說就是里面要包含AVD
Manager和SDK Manager:
同時(shí),eclipse也要設(shè)置SDK的位置,,最好和ANDROID_HOME設(shè)置一樣,如下
1.2 ANDROID_SDK_HOME
ANDROID_SDK_HOME設(shè)置的是avd的路徑,一般默認(rèn)在用戶路徑下,,例如C:\Users\tanggod\.android,, SD卡的空間都是從這里分配的??梢耘驳狡渌夸浵?,需要在環(huán)境變量里面設(shè)置如下:
ANDROID_SDK_HOME=D:\Android\avd
如此設(shè)置后(重啟電腦讓環(huán)境變量生效 ),以后創(chuàng)建的AVD就會(huì)在我們指定的目錄下了:
1.3 JAVA_HOME
JDK,JAVA_HOME必須設(shè)置jdk安裝的目錄,例如:
JAVA_HOME= C:\Program Files\Java\jdk1.7.0_05
C:\Program Files\Java\jdk1.7.0_05
查看JDK版本號(hào),?在cmd下面輸入:Java
-version
PS:1.7的jdk似乎還很不穩(wěn)定,,有問題,,建議用1.6的。
jdk下載位置:
http://www.oracle.com/technetwork/java/javase/downloads/index.html
1.4 CLASSPATH
classpath環(huán)境變量,,是當(dāng)我們?cè)陂_發(fā)java程序時(shí)需要引用別人寫好的類時(shí),,要讓java解釋器知道到哪里去找這個(gè)類。通常,,sun為我們提供了一些額外的豐富的類包,,一個(gè)是dt.jar,,一個(gè)是tools.jar,這兩個(gè)jar包都位于C:\jdk1.6.0\lib目錄下,,所以通常我們都會(huì)把這兩個(gè)jar包加到我們的classpath環(huán)境變量中set
classpath=.;C:\jdk1.6.0\lib\tools.jar;C:\jdk1.6.0\lib\dt.jar,。在系統(tǒng)環(huán)境變量那一欄中點(diǎn)->新建classpath
變量名:classpath
變量值:.;%JAVA_HOME%\lib\tools.jar;%JAVA_HOME%\lib\dt.jar;(注意,CLASSPATH最前面是有個(gè)“.”的,,表示當(dāng)前目錄,,這樣當(dāng)我們運(yùn)行java
AClass的時(shí)候,系統(tǒng)就會(huì)先在當(dāng)前目錄尋找AClass文件了,。),;
1.5 PATH
環(huán)境變量PATH設(shè)置的時(shí)候,注意是追加,,不能將已有的內(nèi)容清空了,。
PATH = %ANDROID_HOME%\tools;%ANDROID_HOME%\platform-tools;%JAVA_HOME%\bin;%CLASSPATH%
主要設(shè)置的是adb.exe和emulator的位置(在tools或者platform-tools目錄中),已經(jīng)jdk工具的路徑等等,。
2. 如何簽名Sign
Android系統(tǒng)要求每一個(gè)Android應(yīng)用程序必須要經(jīng)過數(shù)字簽名才能夠安裝到系統(tǒng)中,,也就是說如果一個(gè)Android應(yīng)用程序沒有經(jīng)過數(shù)字簽名,是沒有辦法安裝到系統(tǒng)中的,!
為了方便我們開發(fā)調(diào)試程序,,ADT會(huì)自動(dòng)的使用debug密鑰為應(yīng)用程序簽名。debug密鑰,?它在哪,?debug密鑰是一個(gè)名為debug.keystore的文件,它的位置: Ubuntu:
~/.android/debug.keystore (win7:c:/user/.Android/debug.keystore;
xp: C:/Documents and Settings/user/.Android/debug.keystore),,“user”對(duì)應(yīng)于你自己的windows操作系統(tǒng)用戶名,,這也就意味著,,如果我們想擁有自己的簽名,,而不是讓ADT幫我們簽名的話,我們也要有一個(gè)屬于自己的密鑰文件(*.keystore)
用Robotium做黑盒測試的時(shí)候,,需要對(duì)待測試的apk去除簽名,,然后自己再簽名。google網(wǎng)站上有個(gè)簽名工具叫做re-sign.jar,,比較傻瓜化,,直接將apk拖入到re-sign.jar中后自動(dòng)去除簽名,重新再簽名,;很多人都建議用這個(gè)工具,。我剛開始也用這個(gè),可是發(fā)現(xiàn)用這個(gè)工具處理后,,無論是android模擬器還是真機(jī),,都裝不上,提示沒有簽名。
我將apk解開看,,確實(shí)是有簽名的,。
查看簽名:
jarsigner -verify -verbose -certs D:\Android\apk\02-AndroidCalculator-sign.apk
所以后來,我就手工用命令行來簽名,。手工簽名之前,,首先需要去除原來簽名的信息,去除方法很簡單,。就是將apk文件后綴改為.zip,,然后從winrar中刪除META-INF文件夾,刪除后重新將文件名改成apk的后綴,,這樣就去除簽名了,。然后用下面的命令進(jìn)行簽名。
注意下面黃色高亮和灰色高亮的字,,需要根據(jù)自己的debug.keystore的位置,,和待簽名apk的位置進(jìn)行設(shè)置。
簽名AndroidCalculator
> jarsigner -keystore D:\Android\avd\.android\debug.keystore -storepass
android -keypass android D:\Android\apk\02-AndroidCalculator-unsign.apk androiddebugkey
> zipalign 4 D:\Android\apk\02-AndroidCalculator-unsign.apk D:\Android\apk\02-AndroidCalculator-sign.apk
zipalign能夠使apk文件中未壓縮的數(shù)據(jù)在4個(gè)字節(jié)邊界上對(duì)齊(4個(gè)字節(jié)是一個(gè)性能很好的值)
例如簽名Plingm
>jarsigner -keystore D:\Android\avd\.android\debug.keystore -storepass
android -keypass android D:\Android\apk\plingm\com.freephoo.android_1180-unsign.apkandroiddebugkey
> zipalign 4 D:\Android\apk\plingm\com.freephoo.android_1180-unsign.apkD:\Android\apk\plingm\com.freephoo.android_1180-sign.apk
對(duì)于jdk 1.7版本,,簽名稍有區(qū)別,,需要加上參數(shù):-digestalg
SHA1 -sigalg MD5withRSA,例如
>jarsigner -digestalg
SHA1 -sigalg MD5withRSA -keystore D:\Android\avd\.android\debug.keystore -storepass
android -keypass android D:\Android\apk\plingm\com.freephoo.android_1180-unsign.apkandroiddebugkey
> zipalign 4 D:\Android\apk\plingm\com.freephoo.android_1180-unsign.apkD:\Android\apk\plingm\com.freephoo.android_1180-sign.apk
簽名后如何安裝到模擬器中,?命令如下
>emulator -avd android4.1
>adb install D:\Android\apk\plingm\com.freephoo.android_1180-sign.apk
如果是安裝到真機(jī)中,,就不需要上面第一條命令啟動(dòng)模擬器了,直接usb連接上手機(jī),,執(zhí)行adb install即可,。
在進(jìn)行黑盒測試之前,需要知道待測試apk的包及activity信息,。查看某個(gè)apk的package
name,,可以用aapt看:
在platform-tools目錄下使用如下命令:aapt
dump badging XXX.apk
aapt dump badgingD:\Android\apk\plingm\com.freephoo.android_1180-sign.apk
也可以用re-sign.jar看,結(jié)果如下:package:
name='com.freephoo.android'
3. 真機(jī)調(diào)試
-
設(shè)置android手機(jī)為USB調(diào)試模式。步驟: menu---> 設(shè)置 ---> 應(yīng)用程序 ---> 開發(fā) , 選擇【USB調(diào)試】
-
用USB連接手機(jī)和電腦,,并確保成功,。步驟: 在windows下執(zhí)行c:/adb
devices, 查看手機(jī)是否已經(jīng)連接成功,。
連接不成功:
連接成功
<application android:icon="@drawable/icon" android:label="@string/app_name" android:debuggable="true">
執(zhí)行:./adb logcat 可以查看到更多的系統(tǒng)異常消息。在這些消息中要注意查看Caused
by:打 頭的行,,這些行指明了在哪行代碼出的錯(cuò)誤
4. 已知控件id,,如何模擬按鍵
我們知道,android每個(gè)控件都有一個(gè)類似R.id.xxxx字符串id,。在做白盒測試的時(shí)候,,將被測試的代碼包import一下,直接調(diào)用R.id.xxxx就可以了,。
但是在黑盒測試的時(shí)候,,我們只有apk,沒有源代碼,,怎么獲取控件的id呢,?
java已經(jīng)給我們提供了這個(gè)工具。只需要在cmd下面輸入hierarchyviewer即可調(diào)出控件查看工具(如果cmd不認(rèn)識(shí)你的hierarchyviewer,,說明你的環(huán)境變量沒有配置正確):
選中需要查看的應(yīng)用,,點(diǎn)擊:"Load View Hierarchy":
如下id/后面的"Button01"即為button的id,。
好了,,已知控件的id,在Robotium中如何模擬按鍵呢,?這里常用的有2種方法:
1. 根據(jù)button上面的文字,。這個(gè)很簡單,直接solo.clickOnButton("Multiply");即可,。
2. 根據(jù)控件的坐標(biāo),。hierarchyviewer是可以查看每個(gè)點(diǎn)的坐標(biāo)的。但是使用起來不是很直觀,,尤其是對(duì)不同分辨率屏幕的手機(jī)時(shí),,使用起來可能還存在兼容性問題,。
如果控件上沒有文字,,clickOnButton就用不了,例如很多應(yīng)用用圖片作為button的說明,,clickOnButton就不奏效,。用坐標(biāo)又很麻煩不直觀??煞裼每丶?/span>id呢,?
怎么用id,,我也糾纏這個(gè)問題好幾天,網(wǎng)上中文資料搜不到,,搜英文,,英文搜不到換關(guān)鍵字搜,始終找不到一個(gè)比較完整的使用說明,。我只好自己一個(gè)個(gè)命令的試,,搞了2天總算找到一個(gè)方法,這個(gè)方法對(duì)于java高手可能不值一提,,但對(duì)我從未用過java的人來說,,確實(shí)費(fèi)了不少周折。
我的方法如下,,先獲取到控件的view:
solo.getCurrentActivity().getResources().getIdentifier,,
然后再用solo.clickOnView即可。
我在使用的時(shí)候,,簡單的封裝了下,,封裝函數(shù)如下:
private int clickCtrlById(String
s, int t
){
intctrl;
View v;
if(
s == ""){
return -1;
}
ctrl = solo.getCurrentActivity().getResources().getIdentifier(s,"id",TARGET_PACKAGE_ID);
v = solo.getView(ctrl);
solo.clickOnView(v);
solo.sleep(t);
return 0;
}
例如已知某個(gè)控件的id(字符串格式)為"btn_dialpad_5",,調(diào)用方法如下:
clickCtrlById("btn_dialpad_5",400);
|