程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> Ant如何打包UIAutomator項目用到的第三方JAR包

Ant如何打包UIAutomator項目用到的第三方JAR包

編輯:C++入門知識

Ant如何打包UIAutomator項目用到的第三方JAR包


本文章主要描述UIAutomator項目中引用到第三方Jar包的時候,按照正常的打包方式碰到的各種問題,以及最終解決的思路和辦法。

1. 問題起源

在本人的一個示例項目中引用到了單元測試框架hamcrest的jar包,在項目目錄下執行ant build的時候出現以下的問題

\

源碼如下:

package majcit.com.UIAutomatorDemo;

import com.android.uiautomator.core.UiDevice;
import com.android.uiautomator.core.UiObject;
import com.android.uiautomator.core.UiObjectNotFoundException;
import com.android.uiautomator.core.UiScrollable;
import com.android.uiautomator.core.UiSelector;
import com.android.uiautomator.testrunner.UiAutomatorTestCase;
import static org.hamcrest.Matchers.*;
import static org.hamcrest.MatcherAssert.assertThat;

public class NotePadTest extends UiAutomatorTestCase {
	
	 public void testDemo() throws UiObjectNotFoundException {  
	        UiDevice device = getUiDevice();
	        device.pressHome();  
	        // Start Notepad
	        UiObject appNotes = new UiObject(new UiSelector().text("Notes")); 
	        appNotes.click();  
	        //Sleep 3 seconds till the app get ready
	        try {  
	            Thread.sleep(3000);  
	        } catch (InterruptedException e1) {  
	            // TODO Auto-generated catch block  
	            e1.printStackTrace();  
	        }  
	        
	        //Evoke the system menu option
	        device.pressMenu();
	        UiObject addNote = new UiObject(new UiSelector().text("Add note"));
	        addNote.click();
	        
	        //Add a new note
	        UiObject noteContent = new UiObject(new UiSelector().className("android.widget.EditText"));
	        noteContent.clearTextField();
	        noteContent.setText("Note 1");
	        device.pressMenu();
	        UiObject save = new UiObject(new UiSelector().text("Save"));
	        save.click();
	        
	        //Find out the new added note entry
	        UiScrollable noteList = new UiScrollable( new UiSelector().className("android.widget.ListView"));  
	        //UiScrollable noteList = new UiScrollable( new UiSelector().scrollable(true)); 
	        UiObject note = null;
	        if(noteList.exists()) {
	        	note = noteList.getChildByText(new UiSelector().className("android.widget.TextView"), "Note1", true);  
	        	//note = noteList.getChildByText(new UiSelector().text("Note1"), "Note1", true); 
	        }
	        else {
	        	note = new UiObject(new UiSelector().text("Note1"));
	        }
	        assertThat(note,notNullValue());
	        
	        note.longClick();
	        
	        UiObject delete = new UiObject(new UiSelector().text("Delete"));
	        delete.click();
	          
	    }  

}

2. 問題分析解決

2.1 編譯問題分析

根據上圖的錯誤log,很明顯我們在實行ant build的時候ant並沒有把需要的第三方jar包加入進去進行編譯。

根據上一篇文章《Android自動化測試(UiAutomator)簡要介紹》描述,我們在打包UIAutomator項目時會執行一個命令“android create uitest-project -n -t -p ” 來在項目頂層目錄上生成一個build.xml文件,這個文件就ant用來build我們的UIAutomator項目需要用到的配置描述文件。那麼很自然我們就會想到去該文件下看是否有把我們需要的jar包給包含進來。

打開該文件查看時,發覺相當精簡,並沒有太多的東西可看,但是注意到文件末尾引用了我們Android SDK下面的一個文件“${sdk.dir}/tools/ant/uibuild.xml”:\

打開該文件,裡面盡是build相關的配置,所以問題很有可能出現在這裡。<喎?http://www.Bkjia.com/kf/ware/vc/" target="_blank" class="keylink">vcD4KPHA+1dK1vbHg0uvP4LnYtcRTZWN0aW9uo6zIt8q1w7vT0L+0tb3T0Na4tqi12sj9t71qYXKw/LXEY2xhc3NwYXRoo7o8aW1nIHNyYz0="http://www.2cto.com/uploadfile/Collfiles/20140925/20140925091701137.jpg" alt="\">

2.2 編譯問題解決辦法

那麼很自然,我們應該在這裡指定我們第三方jar包的classpath,以便ant在build的時候知道從哪裡拿到我們的第三方包。

\

我這裡的例子是把我項目頂層目錄下的“libs”文件夾包含的jar包都引用進來,該目錄就是我存放第三方jar包的位置。

運行“ant build”,成功!

2.3 運行問題分析

build完成後,滿心歡喜的把編譯好的jar包push到安卓機器上運行,前期運行的沒有問題,但一到調用到第三方Jar包相關API的時候Exception就出來了\

編譯沒有問題,運行時出現問題,那麼很有可能就是剛才解決編譯問題的時候只是確保項目在編譯的時候能找到第三方jar包,但是並沒有在編譯後把相應的jar包一並打包到目標jar包裡面去。

經過一番google,相信還是build配置的問題,返回”${sdk.dir}/tools/ant/uibuild.xml“, 發現確實打包section沒有看到第三方jar包相應的信息:\

2.4 運行問題解決辦法

根據google提示,最終修改成如下,問題最終解決!


  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved