无法使用ant构建android测试项目 [英] Unable to build android test project with ant

查看:72
本文介绍了无法使用ant构建android测试项目的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I have a sample Android app, created with Eclipse, having one Activity. I ran this command to build the ant build files for this project:

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

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

Running "ant debug" successfully builds the project and creates the apk files:

-post-build:

debug:

BUILD SUCCESSFUL
Total time: 1 second

现在,我想创建一个Android测试项目.我运行以下命令:

Now, I want to create an Android Test Project. I run this command:

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

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

This successfully created the SampleAppTest directory containing the build files. I have a single class, 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 它说我应该能够进行蚂蚁运行测试".不幸的是,这个目标不存在:

I want to build this project. In the tutorial found here http://developer.android.com/tools/testing/testing_otheride.html#RunTestsAnt it says I should be able to do "ant run-tests". Unfortunately this target does not exist:

$ 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

如果我尝试蚂蚁调试",则在编译时收到错误消息,指出找不到MainActivity类(来自SampleApp).

If I try "ant debug" I receive an error when compiling, stating that the MainActivity class (from SampleApp) can not be found.

-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

尝试蚂蚁测试"时,它也会失败:

When trying "ant test", it also fails:

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)

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

What am I missing/doing wrong here? Any help is gladly appreciated.

推荐答案

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

Okay, I spotted the problem. I failed to mention that in ant.properties, I've changed the out.dir location to "../build". Because of this, the compiler did not know where to get the class files of the SampleApp when building the SampleAppTest. So one solution is to delete the out.dir entry in ant.properties, but I did not want that. I had to find a way to tell the compiler where to get these classes. The solutions I found was to override the "-compile" target in build.xml like so:

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

这篇关于无法使用ant构建android测试项目的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆