java - 无法用ant构建android测试项目

标签 java android ant

我有一个示例 Android 应用程序,它是用 Eclipse 创建的,有一个 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 运行测试”。不幸的是这个目标不存在:

$ 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:
     [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)

我在这里遗漏/做错了什么?非常感谢任何帮助。

最佳答案

好的,我发现了问题。 我没有提到在 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>

关于java - 无法用ant构建android测试项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13582445/

相关文章:

java - 增加 Eclipse Java 中的堆内存

android - 屏幕 ImageView 中的替代图像

java - Ant:将类放在类路径中,但看不到它们

java - Android Volley RxJava - 多个请求

java - 我收到异常 BindingResult 和 bean 名称 'studentRegistration' 的普通目标对象都可用作 spring 中的请求属性

java - 如何使用夏令时结束日期计算日期之间的剩余时间

android - 由于 IncompatibleClassChangeError,Espresso 测试失败

java - JacksonAdapter 无法在 azure-core-1.20 和 Java Web 应用程序中正确解析

ant - scp ant 从远程复制到本地并使用排除

java - 吗非亚/MongoDB : can't do getmore