UiAutomator中引入第三方库编译和打包问题

这是我使用中遇到的情况,加入了json.jar的引用,结果发现这个包里面的类和android.jar里面的JSONObject类出现了冲突,在Eclipse中,设置jar的顺序可以把报错问题解决掉,但是编译是使用ant编译的,结果发现无法编译通过,因为会出现找不到符号的错,那么怎么改呢?


首先解决类名冲突问题:

复制一下找到的方法,打字很累,就不重复了,拷贝一下:

jar 包我们会非常高频率的使用,尤其是用一些其他三方库的时候,往往把 java 代码打包成 jar 文件,方便项目依赖使用。

带来的问题是, 多个jar包容易出现包名冲突. 

这时候我们修改 jar 文件的包名是一个比较快速有效的解决办法。

举两个例子,是笔者亲身经历的两个情况。

  1. Gson库:这个相信很多人都在使用,但是直接导入 gson 的 jar 包,在 HTC Desire HD 这款手机上会抛出异常(TypeNotFoundException)
  2. Jackson库:这也是个 json 解析的,我们在做苹果推送后台的时候,后台用 java 写的,使用 java-apns 库,依赖于 Jackson,然后运行就会抛出异常,具体原因没有查,初步怀疑包名冲突,修改之后就解决的。

下面介绍如何修改jar文件的包名,需要用到一个小工具,叫做 jarjar.jar

jarjar.jar下载

下载地址:http://code.google.com/p/jarjar/downloads/list

这里我们以 gson.jar 为例,在 gson.jar 包目录下新建一个文本文件,名字随意,例如 rule.txt,写入下面的内容。

rule com.google.gson.** com.google.mygson.@1 

上面写的就是修改规则,我们将包名中的 gson 修改为 mygson。打开命令行,输入如下命令。

java -jar jarjar.jar process rule.txt gson.jar mygson.jar 

命令执行完毕,同目录下会多出一下 mygson.jar,这个就是修改包名之后的 jar 文件,我们项目导入这个 jar 包使用即可。


在使用的过程中,rule.txt文件中最好不要有多余的空格之类的(比如换行后出来一个空行,然后还有空格),不然可能会报错的哦!



接着解决第三方包编译和打包的问题:修改build.xml文件

<!--import file="${sdk.dir}/tools/ant/uibuild.xml" /-->
<import file="uibuild.xml" />

上一行是原来自动生成的,改成下面那行,把那个文件拷贝一份出来,放在和build.xml相同目录下,文件名为uibuild.xml,然后我们接下来修改这个复制过来的uibuid.xml文件


具体的修改可以参见下面的这篇文章:(为了方便,我还是把它贴过来)

================================================================

引入第三方库编译和打包问题参见:

http://www.bkjia.com/Androidjc/884052.html


Ant如何打包UIAutomator项目用到的第三方JAR包,antuiautomator


本文章主要描述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 <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提示,最终修改成如下,问题最终解决!



Ant 怎打包第三方的jar

android工程A关联了另一工程B(可以在buildpath-->LinkSource去关联)用ant的时候,方法与单独build一个工程师没多大的区别先把B工程编译打成jar包(可用Eclipse直接Export出jar包),然后放到A工程下的libs中去再用ant去buildA工程即可~
 

android工程中添加了 preject library第三方包(是一个工程,并非jar),问用ant怎打包?

android工程A关联了另一工程B(可以在build path -->Link Source去关联)

用ant的时候,方法与单独build一个工程师没多大的区别

先把B工程编译打成jar包(可用Eclipse直接Export出jar包),然后放到A工程下的libs中去

再用ant去buildA工程即可~


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值