【问题标题】:Unable to build android test project with ant无法用ant构建android测试项目
【发布时间】:2012-11-27 10:42:56
【问题描述】:

我有一个使用 Eclipse 创建的示例 Android 应用程序,它有一个 Activity。 我运行了这个命令来为这个项目构建 ant 构建文件:

android create project --target 8 --name SampleApp --path ./SampleApp --activity MainActivity --package com.example.sampleapp

运行“ant debug”成功构建项目并创建apk文件:

-post-build:

debug:

BUILD SUCCESSFUL
Total time: 1 second

现在,我想创建一个 Android 测试项目。我运行这个命令:

android create test-project -m ../SampleApp -n SampleAppTest -p SampleAppTest

这成功创建了包含构建文件的 SampleAppTest 目录。我有一个类,src/com/example/sampleapp/MainActivityTest.java:

package com.example.sampleapp;

import android.test.ActivityInstrumentationTestCase2;

public class MainActivityTest extends ActivityInstrumentationTestCase2<MainActivity> {

    public MainActivityTest() {
        super("com.example.sampleapp", MainActivity.class);
    }

}

我想建立这个项目。在这里找到的教程http://developer.android.com/tools/testing/testing_otheride.html#RunTestsAnt 它说我应该能够进行“蚂蚁运行测试”。不幸的是,这个目标不存在:

$ ant run-tests
Buildfile: /Users/cmuraru/Work/androidtest/SampleAppTest/build.xml

BUILD FAILED
Target "run-tests" does not exist in the project "SampleAppTest". 

Total time: 0 seconds

如果我尝试“ant debug”,我会在编译时收到错误消息,指出无法找到 MainActivity 类(来自 SampleApp)。

-compile:
    [javac] Compiling 2 source files to /Users/cmuraru/Work/androidtest/build/test/classes
    [javac] /Users/cmuraru/Work/androidtest/SampleAppTest/src/com/example/sampleapp/MainActivityTest.java:15: cannot find symbol
    [javac] symbol: class MainActivity
    [javac] public class MainActivityTest extends ActivityInstrumentationTestCase2<MainActivity> {
    [javac]                                                                        ^
    [javac] /Users/cmuraru/Work/androidtest/SampleAppTest/src/com/example/sampleapp/MainActivityTest.java:18: cannot find symbol
    [javac] symbol  : class MainActivity
    [javac] location: class com.example.sampleapp.MainActivityTest
    [javac]         super("com.example.sampleapp", MainActivity.class);
    [javac]                                        ^
    [javac] 2 errors

BUILD FAILED
/Users/cmuraru/Work/android-sdk-macosx/tools/ant/build.xml:705: The following error occurred while executing this line:
/Users/cmuraru/Work/android-sdk-macosx/tools/ant/build.xml:718: Compile failed; see the compiler error output for details.

Total time: 1 second

尝试“ant test”时,同样失败:

test:
     [echo] Running tests ...
     [exec] INSTRUMENTATION_STATUS: id=ActivityManagerService
     [exec] INSTRUMENTATION_STATUS: Error=Unable to find instrumentation info for: ComponentInfo{com.example.sampleapp.tests/android.test.InstrumentationTestRunner}
     [exec] INSTRUMENTATION_STATUS_CODE: -1
     [exec] android.util.AndroidException: INSTRUMENTATION_FAILED: com.example.sampleapp.tests/android.test.InstrumentationTestRunner
     [exec]     at com.android.commands.am.Am.runInstrument(Am.java:616)
     [exec]     at com.android.commands.am.Am.run(Am.java:118)
     [exec]     at com.android.commands.am.Am.main(Am.java:81)
     [exec]     at com.android.internal.os.RuntimeInit.nativeFinishInit(Native Method)
     [exec]     at com.android.internal.os.RuntimeInit.main(RuntimeInit.java:237)
     [exec]     at dalvik.system.NativeStart.main(Native Method)

我在这里错过了什么/做错了什么?任何帮助都将不胜感激。

【问题讨论】:

    标签: java android ant


    【解决方案1】:

    好的,我发现了问题。 我没有提到在 ant.properties 中,我已将 out.dir 位置更改为“../build”。因此,编译器在构建 SampleAppTest 时不知道从何处获取 SampleApp 的类文件。所以一种解决方案是删除 ant.properties 中的 out.dir 条目,但我不想这样做。我必须找到一种方法来告诉编译器从哪里获取这些类。我找到的解决方案是像这样覆盖 build.xml 中的“-compile”目标:

    <property name="SampleApp.build.location" value="../build"/>
        <target name="-compile" depends="-build-setup, -pre-build, -code-gen, -pre-compile">
            <do-only-if-manifest-hasCode elseText="hasCode = false. Skipping...">
                <!-- merge the project's own classpath and the tested project's classpath -->
                <path id="project.javac.classpath">
                    <path refid="project.all.jars.path" />
                    <path refid="tested.project.classpath" />
                </path>
                <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}"
                        classpathref="project.javac.classpath"
                        fork="${need.javac.fork}">
                    <src path="${source.absolute.dir}" />
                    <src path="${gen.absolute.dir}" />
                    <compilerarg line="${java.compilerargs}" />
                    <classpath>
                        <!-- steff: we changed one line here !-->
                        <fileset dir="${SampleApp.build.location}/classes" includes="*"/>
                    </classpath>
                </javac>
    
                <!-- if the project is instrumented, intrument the classes -->
                <if condition="${build.is.instrumented}">
                    <then>
                        <echo level="info">Instrumenting classes from ${out.absolute.dir}/classes...</echo>
    
                        <!-- build the filter to remove R, Manifest, BuildConfig -->
                        <getemmafilter
                                appPackage="${project.app.package}"
                                libraryPackagesRefId="project.library.packages"
                                filterOut="emma.default.filter"/>
    
                        <!-- define where the .em file is going. This may have been
                             setup already if this is a library -->
                        <property name="emma.coverage.absolute.file" location="${out.absolute.dir}/coverage.em" />
    
                        <!-- It only instruments class files, not any external libs -->
                        <emma enabled="true">
                            <instr verbosity="${verbosity}"
                                   mode="overwrite"
                                   instrpath="${out.absolute.dir}/classes"
                                   outdir="${out.absolute.dir}/classes"
                                   metadatafile="${emma.coverage.absolute.file}">
                                <filter excludes="${emma.default.filter}" />
                                <filter value="${emma.filter}" />
                            </instr>
                        </emma>
                    </then>
                </if>
    
                <!-- if the project is a library then we generate a jar file -->
                <if condition="${project.is.library}">
                    <then>
                        <echo level="info">Creating library output jar file...</echo>
                        <property name="out.library.jar.file" location="${out.absolute.dir}/classes.jar" />
                        <if>
                            <condition>
                                <length string="${android.package.excludes}" trim="true" when="greater" length="0" />
                            </condition>
                            <then>
                                <echo level="info">Custom jar packaging exclusion: ${android.package.excludes}</echo>
                            </then>
                        </if>
    
                        <propertybyreplace name="project.app.package.path" input="${project.app.package}" replace="." with="/" />
    
                        <jar destfile="${out.library.jar.file}">
                            <fileset dir="${out.classes.absolute.dir}"
                                    includes="**/*.class"
                                    excludes="${project.app.package.path}/R.class ${project.app.package.path}/R$*.class ${project.app.package.path}/BuildConfig.class"/>
                            <fileset dir="${source.absolute.dir}" excludes="**/*.java ${android.package.excludes}" />
                        </jar>
                    </then>
                </if>
    
            </do-only-if-manifest-hasCode>
        </target>
    

    【讨论】:

    • 需要等待 2 天才能这样做。
    【解决方案2】:

    有一种方法可以代替手动更新 ant.properties。 从命令行,运行以下命令:

    android update test-project -m <project path> -p <test project path>
    

    运行此命令后,您可以直接从测试项目中运行 ant debug。 注意:如果出现 JUnit 相关错误,请在测试项目 libs 文件夹中添加 Junit jar 文件。

    【讨论】:

      猜你喜欢
      • 2011-11-16
      • 2013-07-12
      • 1970-01-01
      • 2014-05-24
      • 2011-01-29
      • 1970-01-01
      • 1970-01-01
      • 2013-05-06
      • 2012-05-31
      相关资源
      最近更新 更多