Ant如何打包UIAutomator项目用到的第三方JAR包
2015-11-25 16:53
423 查看
本文章主要描述UIAutomator项目中引用到第三方Jar包的时候,按照正常的打包方式碰到的各种问题,以及最终解决的思路和办法。
build的时候出现以下的问题
源码如下:
build的时候ant并没有把需要的第三方jar包加入进去进行编译。
根据上一篇文章《 Android自动化测试(UiAutomator)简要介绍
》描述,我们在打包UIAutomator项目时会执行一个命令“ android create uitest-project -n <name> -t <android-sdk-ID> -p <path>” 来在项目顶层目录上生成一个build.xml文件,这个文件就ant用来build我们的UIAutomator项目需要用到的配置描述文件。那么很自然我们就会想到去该文件下看是否有把我们需要的jar包给包含进来。
打开该文件查看时,发觉相当精简,并没有太多的东西可看,但是注意到文件末尾引用了我们Android SDK下面的一个文件“${sdk.dir}/tools/ant/uibuild.xml”:
打开该文件,里面尽是build相关的配置,所以问题很有可能出现在这里。
找到编译相关的Section,确实没有看到有指定第三方jar包的classpath:
我这里的例子是把我项目顶层目录下的“libs”文件夹包含的jar包都引用进来,该目录就是我存放第三方jar包的位置。
运行“ant
build”,成功!
编译没有问题,运行时出现问题,那么很有可能就是刚才解决编译问题的时候只是确保项目在编译的时候能找到第三方jar包,但是并没有在编译后把相应的jar包一并打包到目标jar包里面去。
经过一番google,相信还是build配置的问题,返回” ${sdk.dir}/tools/ant/uibuild.xml“,
发现确实打包section没有看到第三方jar包相应的信息:
1. 问题起源
在本人的一个示例项目中引用到了单元测试框架hamcrest的jar包,在项目目录下执行antbuild的时候出现以下的问题
源码如下:
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,很明显我们在实行antbuild的时候ant并没有把需要的第三方jar包加入进去进行编译。
根据上一篇文章《 Android自动化测试(UiAutomator)简要介绍
》描述,我们在打包UIAutomator项目时会执行一个命令“ android create uitest-project -n <name> -t <android-sdk-ID> -p <path>” 来在项目顶层目录上生成一个build.xml文件,这个文件就ant用来build我们的UIAutomator项目需要用到的配置描述文件。那么很自然我们就会想到去该文件下看是否有把我们需要的jar包给包含进来。
打开该文件查看时,发觉相当精简,并没有太多的东西可看,但是注意到文件末尾引用了我们Android SDK下面的一个文件“${sdk.dir}/tools/ant/uibuild.xml”:
打开该文件,里面尽是build相关的配置,所以问题很有可能出现在这里。
找到编译相关的Section,确实没有看到有指定第三方jar包的classpath:
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提示,最终修改成如下,问题最终解决!相关文章推荐
- UIView中的坐标转换
- UIGraphicsBeginImageContext系列知识
- mybatis配置文件xxxx.xml中缺失返回类型的后果A query was run and no Result Maps were found
- 动态修改UINavigationBar的背景色
- UITextField点击textField外任意区域键盘回收(二)---- TouchesBegan
- 基于C#中的类SqlCommand对象调用SQLServer存储过程时,存储过程执行成功,但是对象方法ExecuteNonQuery()返回-1
- IOS UIView 之实例方法 Instance Methods
- UIStack View
- Android平台Camera实时滤镜实现方法探讨(二)--Android-GPUImage探讨
- Xcode7 UI自动化测试详解 带demo UITests
- JPA注解主键生成策略-UUID
- ios 说一说UINavigationController 的堆栈
- 解决 UITableview 分割线右移15像素问题
- Collection框架之Queue
- iOS 蓝牙开发 BabyBluetooth蓝牙库介绍
- 猫(Modem)和路由器有什么区别?
- Android开发-UI控件:为ListView,GirdView,etc...添加系统自带的下拉刷新功能
- 深入理解dispatch_queue
- UIDatePicker (时间、日期选择器使用)
- 动手搭建 iOS CI 环境之「了解 xcodebuild 命令」