首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> C++ 入門

Ant 打包 UIAutomator 專案:解決第三方 JAR 編譯與運行時依賴問題

     編輯:C++ 入門

問題背景

UIAutomator 專案引用第三方 JAR(如 Hamcrest),執行 ant build 時報錯:找不到類。原因:生成的 build.xml 未將第三方 JAR 加入編譯與打包路徑。

解決步驟

1. 編譯期:修改 build.xml 加入 classpath

Android 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。

2. 運行期:打包第三方 JAR 到輸出 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>

驗證

  1. ant clean build → 編譯無錯誤。
  2. adb push bin/MyProject.jar /data/local/tmp/
  3. 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 核心任務,即可解決所有依賴打包問題。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved