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è)置,開(kāi)始->運(yùn)行->cmd,在cmd下面輸入echo
% ANDROID_HOME%,如果與我們預(yù)期的一致就說(shuō)明生效了。如果原樣輸出% ANDROID_HOME%就說(shuō)明環(huán)境變量未生效,需要重啟操作系統(tǒng)。
詳細(xì)說(shuō)明如下
1.1 ANDROID_HOME
ANDROID_HOME= D:\Android\android-sdks,指定sdk包含的位置,什么是sdk?網(wǎng)上去搜,簡(jiǎn)單點(diǎn)說(shuō)就是里面要包含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)定,有問(wèn)題,建議用1.6的。
jdk下載位置:
http://www.oracle.com/technetwork/java/javase/downloads/index.html
1.4 CLASSPATH
classpath環(huán)境變量,是當(dāng)我們?cè)陂_(kāi)發(fā)java程序時(shí)需要引用別人寫(xiě)好的類(lèi)時(shí),要讓java解釋器知道到哪里去找這個(gè)類(lèi)。通常,sun為我們提供了一些額外的豐富的類(lèi)包,一個(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)過(guò)數(shù)字簽名才能夠安裝到系統(tǒng)中,也就是說(shuō)如果一個(gè)Android應(yīng)用程序沒(méi)有經(jīng)過(guò)數(shù)字簽名,是沒(méi)有辦法安裝到系統(tǒng)中的!
為了方便我們開(kāi)發(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做黑盒測(cè)試的時(shí)候,需要對(duì)待測(cè)試的apk去除簽名,然后自己再簽名。google網(wǎng)站上有個(gè)簽名工具叫做re-sign.jar,比較傻瓜化,直接將apk拖入到re-sign.jar中后自動(dòng)去除簽名,重新再簽名;很多人都建議用這個(gè)工具。我剛開(kāi)始也用這個(gè),可是發(fā)現(xiàn)用這個(gè)工具處理后,無(wú)論是android模擬器還是真機(jī),都裝不上,提示沒(méi)有簽名。
我將apk解開(kāi)看,確實(shí)是有簽名的。
查看簽名:
jarsigner -verify -verbose -certs D:\Android\apk\02-AndroidCalculator-sign.apk
所以后來(lái),我就手工用命令行來(lái)簽名。手工簽名之前,首先需要去除原來(lái)簽名的信息,去除方法很簡(jiǎn)單。就是將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)行黑盒測(cè)試之前,需要知道待測(cè)試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)用程序 ---> 開(kāi)發(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è)類(lèi)似R.id.xxxx字符串id。在做白盒測(cè)試的時(shí)候,將被測(cè)試的代碼包import一下,直接調(diào)用R.id.xxxx就可以了。
但是在黑盒測(cè)試的時(shí)候,我們只有apk,沒(méi)有源代碼,怎么獲取控件的id呢?
java已經(jīng)給我們提供了這個(gè)工具。只需要在cmd下面輸入hierarchyviewer即可調(diào)出控件查看工具(如果cmd不認(rèn)識(shí)你的hierarchyviewer,說(shuō)明你的環(huán)境變量沒(méi)有配置正確):
選中需要查看的應(yīng)用,點(diǎn)擊:"Load View Hierarchy":
如下id/后面的"Button01"即為button的id。
好了,已知控件的id,在Robotium中如何模擬按鍵呢?這里常用的有2種方法:
1. 根據(jù)button上面的文字。這個(gè)很簡(jiǎn)單,直接solo.clickOnButton("Multiply");即可。
2. 根據(jù)控件的坐標(biāo)。hierarchyviewer是可以查看每個(gè)點(diǎn)的坐標(biāo)的。但是使用起來(lái)不是很直觀,尤其是對(duì)不同分辨率屏幕的手機(jī)時(shí),使用起來(lái)可能還存在兼容性問(wèn)題。
如果控件上沒(méi)有文字,clickOnButton就用不了,例如很多應(yīng)用用圖片作為button的說(shuō)明,clickOnButton就不奏效。用坐標(biāo)又很麻煩不直觀??煞裼每丶?/span>id呢?
怎么用id,我也糾纏這個(gè)問(wèn)題好幾天,網(wǎng)上中文資料搜不到,搜英文,英文搜不到換關(guān)鍵字搜,始終找不到一個(gè)比較完整的使用說(shuō)明。我只好自己一個(gè)個(gè)命令的試,搞了2天總算找到一個(gè)方法,這個(gè)方法對(duì)于java高手可能不值一提,但對(duì)我從未用過(guò)java的人來(lái)說(shuō),確實(shí)費(fèi)了不少周折。
我的方法如下,先獲取到控件的view:
solo.getCurrentActivity().getResources().getIdentifier,
然后再用solo.clickOnView即可。
我在使用的時(shí)候,簡(jiǎn)單的封裝了下,封裝函數(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);
|