UIAutomator 專案引用第三方 JAR(如 Hamcrest),執行 ant build 時報錯:找不到類。原因:生成的 build.xml 未將第三方 JAR 加入編譯與打包路徑。
build.xml 加入 classpathAndroid SDK 生成的 build.xml 導入 ${sdk.dir}/tools/ant/uibuild.xml。編輯 uibuild.xml(或在專案 build.xml 中覆蓋目標),在 compile 目標的 javac 任務中添加 classpathref 或內聯 classpath:
<path id="project.extra.classpath">
<fileset dir="libs" includes="*.jar"/>
</path>
<target name="compile" depends="...">
<javac ... classpathref="project.extra.classpath" />
</target>
或直接在專案 build.xml 中覆蓋 compile 目標,引用 libs 目錄下所有 JAR。
編譯通過後,dex 階段仍會報 NoClassDefFoundError,因第三方類未打入最終 JAR。修改 uibuild.xml 中的 dex 任務(或覆蓋 build 目標),將 libs 目錄 JAR 加入 jar 打包:
<target name="jar" depends="compile">
<jar destfile="${out.dir}/${ant.project.name}.jar" basedir="${out.classes.dir}">
<zipgroupfileset dir="libs" includes="*.jar"/>
</jar>
</target>
zipgroupfileset 會將整個 JAR 內容合併進輸出 JAR,解決運行時找不到類。
專案結構:
MyProject/ ├── build.xml (android create uitest-project 生成) ├── libs/ │ ├── hamcrest-core-1.3.jar │ └── junit-4.12.jar └── src/...
build.xml 關鍵片段:
<project name="MyProject" default="build">
<property name="libs.dir" value="libs"/>
<path id="extra.libs">
<fileset dir="${libs.dir}" includes="*.jar"/>
</path>
<!-- 覆蓋 compile 目標 -->
<target name="compile" depends="-resource-src, -aidl">
<javac encoding="UTF-8" srcdir="${source.dir}" destdir="${out.classes.dir}"
classpathref="android.target.classpath"
includeantruntime="false">
<classpath refid="extra.libs"/>
</javac>
</target>
<!-- 覆蓋 jar 目標 -->
<target name="jar" depends="compile">
<jar destfile="${out.dir}/${ant.project.name}.jar" basedir="${out.classes.dir}">
<zipgroupfileset dir="${libs.dir}" includes="*.jar"/>
</jar>
</target>
<import file="${sdk.dir}/tools/ant/uibuild.xml"/>
</project>
ant clean build → 編譯無錯誤。adb push bin/MyProject.jar /data/local/tmp/adb shell uiautomator runtest MyProject.jar -c com.example.Test → 運行無 NoClassDefFoundError。UIAutomator 專案引用第三方 JAR 需雙重配置:
1. **編譯期** 將 libs/*.jar 加入 javac classpath。
2. **打包期** 用 zipgroupfileset 合併進輸出 JAR。
修改 build.xml 覆蓋 compile 和 jar 目標是最乾淨的方式,不汙染 SDK 共用文件。掌握 Ant path/fileset/zipgroupfileset 核心任務,即可解決所有依賴打包問題。