首先,感谢CrystalChenxiaoqing同学的整理,转载于:http://blog.csdn.net/cxq234843654/article/details/50350435
最近做安卓的遍历测试,是基于uiautomator做的,二次开发,避免不了使用第三方jar,比如这边我使用到的就是xStream,但是在打包的过程中会出现
classNotFound或者是Build Failed的问题。
这里有两个原因:
1、编译的时候,没有把jar包添加进来,这时候的体现一般是报BUILD FAILED的错误。
2、jar包添加进来了,没有把jar下的class文件的路径对应放到classes.dex文件中,造成类无法找到,这时候一般会报classNotFound的错误。
针对以上两个问题,我们需要对应修改uiBuild.xml文件,这个文件是ant自带的,目录为${sdk.dir}/tools/ant/uibuild.xml
1、将jar包的路径,放到compile下,红色部分为新增内容,意思是将项目的libs文件夹下的所有jar包都加入编译。
<target name="compile" depends="-build-setup, -pre-compile">
<javac encoding="${java.encoding}"
source="${java.source}" target="${java.target}"
debug="true" extdirs="" includeantruntime="false"
destdir="${out.classes.absolute.dir}"
bootclasspathref="project.target.class.path"
verbose="${verbose}"
fork="${need.javac.fork}">
<src path="${source.absolute.dir}" />
<compilerarg line="${java.compilerargs}" />
<classpath>
<fileset dir="${jar.libs.dir}" includes="*.jar"/>
</classpath>
</javac>
</target>
2、把class的路径加入到classes.dex文件中,红色部分为新增内容。
<target name="-dex" depends="compile, -post-compile">
<dex executable="${dx}"
output="${intermediate.dex.file}"
nolocals="@{nolocals}"
verbose="${verbose}">
<fileset dir="${jar.libs.dir}" includes="*.jar"/>
<path path="${out.classes.absolute.dir}"/>
</dex>
</target>
最后修改后的uibuild.xml文件内容如下:
- <?xml version="1.0" encoding="UTF-8"?>
- <project name="android_rules" default="debug">
- <!-- This build file is imported by the project build file. It contains
- all the targets and tasks necessary to build Android projects, be they regular
- projects, library projects, or test projects. At the beginning of the file
- is a list of properties that can be overridden by adding them to your ant.properties
- (properties are immutable, so their first definition sticks and is never
- changed). Follows: - custom task definitions, - more properties (do not override
- those unless the whole build system is modified). - macros used throughout
- the build, - base build targets, - debug-specific build targets, - release-specific
- build targets, - instrument-specific build targets, - test project-specific
- build targets, - install targets, - help target -->
- <!-- ******************************************************* -->
- <!-- **************** Overridable Properties *************** -->
- <!-- ******************************************************* -->
- <!-- You can override these values in your build.xml or ant.properties.
- Overriding any other properties may result in broken build. -->
- <!-- Tells adb which device to target. You can change this from the command
- line by invoking "ant -Dadb.device.arg=-d" for device "ant -Dadb.device.arg=-e"
- for the emulator. -->
- <property name="adb.device.arg" value="" />
- <!-- filename only of the output file. Cannot be a path -->
- <property name="out.filename" value="${ant.project.name}.jar" />
- <!-- compilation options -->
- <property name="java.encoding" value="UTF-8" />
- <property name="java.target" value="1.5" />
- <property name="java.source" value="1.5" />
- <property name="java.compilerargs" value="" />
- <!-- Verbosity -->
- <property name="verbose" value="false" />
- <!-- ******************************************************* -->
- <!-- ********************* Custom Tasks ******************** -->
- <!-- ******************************************************* -->
- <!-- jar file from where the tasks are loaded -->
- <path id="android.antlibs">
- <pathelement path="${sdk.dir}/tools/lib/ant-tasks.jar" />
- </path>
- <!-- Custom tasks -->
- <taskdef resource="anttasks.properties" classpathref="android.antlibs" />
- <!-- Emma configuration -->
- <property name="emma.dir" value="${sdk.dir}/tools/lib" />
- <path id="emma.lib">
- <pathelement location="${emma.dir}/emma.jar" />
- <pathelement location="${emma.dir}/emma_ant.jar" />
- </path>
- <taskdef resource="emma_ant.properties" classpathref="emma.lib" />
- <!-- End of emma configuration -->
- <!-- ******************************************************* -->
- <!-- ******************* Other Properties ****************** -->
- <!-- ******************************************************* -->
- <!-- overriding these properties may break the build unless the whole file
- is updated -->
- <!-- Input directories -->
- <property name="source.dir" value="src" />
- <property name="source.absolute.dir" location="${source.dir}" />
- <property name="jar.libs.dir" value="libs" />
- <property name="jar.libs.absolute.dir" location="${jar.libs.dir}" />
- <!-- Output directories -->
- <property name="out.dir" value="bin" />
- <property name="out.absolute.dir" location="${out.dir}" />
- <property name="out.classes.absolute.dir" location="${out.dir}/classes" />
- <property name="out.file" value="${out.absolute.dir}/${out.filename}" />
- <!-- tools location -->
- <property name="android.tools.dir" location="${sdk.dir}/tools" />
- <property name="android.platform.tools.dir" location="${sdk.dir}/platform-tools" />
- <condition property="exe" value=".exe" else="">
- <os family="windows" />
- </condition>
- <condition property="bat" value=".bat" else="">
- <os family="windows" />
- </condition>
- <property name="adb" location="${android.platform.tools.dir}/adb${exe}" />
- <!-- Intermediate files -->
- <property name="dex.file.name" value="classes.dex" />
- <property name="intermediate.dex.file" location="${out.absolute.dir}/${dex.file.name}" />
- <property name="resource.package.file.name" value="${ant.project.name}.ap_" />
- <!-- whether we need to fork javac. This is only needed on Windows when
- running Java < 7 -->
- <condition else="false" property="need.javac.fork">
- <and>
- <matches pattern="1\.[56]" string="${java.specification.version}" />
- <not>
- <os family="unix" />
- </not>
- </and>
- </condition>
- <macrodef name="run-tests-helper">
- <attribute name="emma.enabled" default="false" />
- <element name="extra-instrument-args" optional="yes" />
- <sequential>
- <echo level="info">Running tests ...</echo>
- <exec executable="${adb}" failonerror="true">
- <arg line="${adb.device.arg}" />
- <arg value="shell" />
- <arg value="am" />
- <arg value="instrument" />
- <arg value="-w" />
- <arg value="-e" />
- <arg value="coverage" />
- <arg value="@{emma.enabled}" />
- <extra-instrument-args />
- <arg value="${project.app.package}/${test.runner}" />
- </exec>
- </sequential>
- </macrodef>
- <!-- ******************************************************* -->
- <!-- ******************** Build Targets ******************** -->
- <!-- ******************************************************* -->
- <!-- Basic Ant + SDK check -->
- <target name="-check-env">
- <checkenv />
- </target>
- <!-- empty default pre-clean target. Create a similar target in your build.xml
- and it'll be called instead of this one. -->
- <target name="-pre-clean" />
- <!-- clean target -->
- <target name="clean" depends="-check-env, -pre-clean"
- description="Removes output files created by other targets.">
- <delete dir="${out.absolute.dir}" verbose="${verbose}" />
- </target>
- <!-- Pre build setup -->
- <target name="-build-setup" depends="-check-env">
- <getbuildtools name="android.build.tools.dir" />
- <property name="dx" location="${android.build.tools.dir}/dx${bat}" />
- <echo level="info">Resolving Build Target for ${ant.project.name}...
- </echo>
- <!-- load project properties, resolve Android target, library dependencies
- and set some properties with the results. All property names are passed as
- parameters ending in -Out -->
- <getuitarget compileClassPathOut="project.target.class.path" />
- <echo level="info">----------</echo>
- <echo level="info">Creating output directories if needed...</echo>
- <mkdir dir="${out.absolute.dir}" />
- <mkdir dir="${out.classes.absolute.dir}" />
- </target>
- <!-- empty default pre-compile target. Create a similar target in your build.xml
- and it'll be called instead of this one. -->
- <target name="-pre-compile" />
- <!-- Compiles this project's .java files into .class files. -->
- <target name="compile" depends="-build-setup, -pre-compile">
- <javac encoding="${java.encoding}" source="${java.source}"
- target="${java.target}" debug="true" extdirs="" includeantruntime="false"
- destdir="${out.classes.absolute.dir}" bootclasspathref="project.target.class.path"
- verbose="${verbose}" fork="${need.javac.fork}">
- <src path="${source.absolute.dir}" />
- <compilerarg line="${java.compilerargs}" />
- <!-- 修改位置1 -->
- <classpath>
- <fileset dir="${jar.libs.dir}" includes="*.jar" />
- </classpath>
- <!-- 修改位置1 -->
- </javac>
- </target>
- <!-- empty default post-compile target. Create a similar target in your
- build.xml and it'll be called instead of this one. -->
- <target name="-post-compile" />
- <!-- Converts this project's .class files into .dex files -->
- <target name="-dex" depends="compile, -post-compile">
- <dex executable="${dx}" output="${intermediate.dex.file}"
- nolocals="@{nolocals}" verbose="${verbose}">
- <!-- 修改位置2 -->
- <fileset dir="${jar.libs.dir}" includes="*.jar" />
- <!-- 修改位置2 -->
- <path path="${out.classes.absolute.dir}" />
- </dex>
- </target>
- <!-- empty default post-dex target. Create a similar target in your build.xml
- and it'll be called instead of this one. -->
- <target name="-post-dex" />
- <target name="-jar" depends="-dex, -post-dex">
- <jar destfile="${out.file}">
- <fileset file="${intermediate.dex.file}" />
- </jar>
- </target>
- <!-- empty default post-jar target. Create a similar target in your build.xml
- and it'll be called instead of this one. -->
- <target name="-post-jar" />
- <target name="build" depends="-jar, -post-jar" />
- <target name="install" description="Install the test package">
- <exec executable="${adb}" failonerror="true">
- <arg line="${adb.device.arg}" />
- <arg value="push" />
- <arg value="${out.file}" />
- <arg value="/data/local/tmp" />
- </exec>
- </target>
- <target name="test" description="Runs tests">
- <!-- todo: fix this -->
- <fail message="Launching tests from Ant not supported yet" />
- <exec executable="${adb}" failonerror="true">
- <arg line="${adb.device.arg}" />
- <arg value="shell" />
- <arg value="uiautomator" />
- <arg value="runtest" />
- <arg value="${out.filename}" />
- <arg value="-e" />
- <arg value="class" />
- <arg value="com.android.uiautomator.samples.skeleton.DemoTestCase" />
- </exec>
- </target>
- <target name="help">
- <!-- displays starts at col 13 |13 80| -->
- <echo>Android Ant Build. Available targets:</echo>
- <echo> help: Displays this help.</echo>
- <echo> clean: Removes output files created by other targets.</echo>
- <echo> build: Builds the test library.</echo>
- <echo> install: Installs the library on a connected device or</echo>
- <echo> emulator.</echo>
- <echo> test: Runs the tests.</echo>
- <echo></echo>
- <echo>It is possible to mix targets. For instance:</echo>
- <echo> ant build install test</echo>
- <echo>This will build, install and run the test in a single command.
- </echo>
- </target>
- </project>