我有一个示例 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/