Can't build and run an android test project created using “ant create test-project” when tested project has jars in libs directory?

If you use Eclipse, a simpler approach is to not include your external library in the test project, but rather export it in the Eclipse Project settings. This will solve the issue.

Up vote 16 down vote favorite 9 share g+ share fb share tw.

I have a module that builds an app called MyApp. I have another that builds some testcases for that app, called MyAppTests. They both build their own APKs, and they both work fine from within my IDE.

I'd like to build them using ant so that I can take advantage of continuous integration. Building the app module works fine. I'm having difficulty getting the Test module to compile and run.

Using Christopher's tip from a previous question, I used android create test-project -p MyAppTests -m ../MyApp -n MyAppTests to create the necessary build files to build and run my test project. This seems to work great (once I remove an unnecessary test case that it constructed for me and revert my AndroidManifest. Xml to the one I was using before it got replaced by android create), but I have two problems.

The first problem: The project doesn't compile because it's missing libraries. $ ant run-tests Buildfile: build. Xml setup Project Target: Google APIs setup Vendor: Google Inc.

Setup Platform Version: 1.6 setup API level: 4 setup WARNING: No minSdkVersion value set. Application will install on all Android versions. -install-tested-project: setup Project Target: Google APIs setup Vendor: Google Inc.

Setup Platform Version: 1.6 setup API level: 4 setup WARNING: No minSdkVersion value set. Application will install on all Android versions. -compile-tested-if-test: -dirs: echo Creating output directories if needed... -resource-src: echo Generating R.

Java / Manifest. Java from the resources... -aidl: echo Compiling aidl files into Java classes... compile: javac Compiling 1 source file to /Users/mike/Projects/myapp/android/MyApp/bin/classes -dex: echo Converting compiled files and external libraries into /Users/mike/Projects/myapp/android/MyApp/bin/classes.dex... echo -package-resources: echo Packaging resources aaptexec Creating full resource package... -package-debug-sign: apkbuilder Creating MyApp-debug-unaligned. Apk and signing it with a debug key... apkbuilder Using keystore: /Users/mike/.

Android/debug. Keystore debug: echo Running zip align on final apk... echo Debug Package: /Users/mike/Projects/myapp/android/MyApp/bin/MyApp-debug. Apk install: echo Installing /Users/mike/Projects/myapp/android/MyApp/bin/MyApp-debug.

Apk onto default emulator or device... exec 1567 KB/s (288354 bytes in 0.179s) exec pkg: /data/local/tmp/MyApp-debug. Apk exec Success -compile-tested-if-test: -dirs: echo Creating output directories if needed... mkdir Created dir: /Users/mike/Projects/myapp/android/MyAppTests/gen mkdir Created dir: /Users/mike/Projects/myapp/android/MyAppTests/bin mkdir Created dir: /Users/mike/Projects/myapp/android/MyAppTests/bin/classes -resource-src: echo Generating R. Java / Manifest.

Java from the resources... -aidl: echo Compiling aidl files into Java classes... compile: javac Compiling 5 source files to /Users/mike/Projects/myapp/android/MyAppTests/bin/classes javac /Users/mike/Projects/myapp/android/MyAppTests/src/com/myapp/test/GsonTest. Java:4: package roboguice. Test does not exist javac import roboguice.test.

RoboUnitTestCase; javac ^ javac /Users/mike/Projects/myapp/android/MyAppTests/src/com/myapp/test/GsonTest. Java:8: package com.google. Gson does not exist javac import com.google.gson.

JsonElement; javac ^ javac /Users/mike/Projects/myapp/android/MyAppTests/src/com/myapp/test/GsonTest. Java:9: package com.google. Gson does not exist javac import com.google.gson.

JsonParser; javac ^ javac /Users/mike/Projects/myapp/android/MyAppTests/src/com/myapp/test/GsonTest. Java:11: cannot find symbol javac symbol: class RoboUnitTestCase javac public class GsonTest extends RoboUnitTestCase { javac ^ javac /Users/mike/Projects/myapp/android/MyAppTests/src/com/myapp/test/HttpTest. Java:6: package roboguice.

Test does not exist javac import roboguice.test. RoboUnitTestCase; javac ^ javac /Users/mike/Projects/myapp/android/MyAppTests/src/com/myapp/test/HttpTest. Java:7: package roboguice.

Util does not exist javac import roboguice.util. RoboLooperThread; javac ^ javac /Users/mike/Projects/myapp/android/MyAppTests/src/com/myapp/test/HttpTest. Java:11: package com.google.

Gson does not exist javac import com.google.gson. JsonObject; javac ^ javac /Users/mike/Projects/myapp/android/MyAppTests/src/com/myapp/test/HttpTest. Java:15: cannot find symbol javac symbol: class RoboUnitTestCase javac public class HttpTest extends RoboUnitTestCase { javac ^ javac /Users/mike/Projects/myapp/android/MyAppTests/src/com/myapp/test/LinksTest.

Java:4: package roboguice. Test does not exist javac import roboguice.test. RoboUnitTestCase; javac ^ javac /Users/mike/Projects/myapp/android/MyAppTests/src/com/myapp/test/LinksTest.

Java:12: cannot find symbol javac symbol: class RoboUnitTestCase javac public class LinksTest extends RoboUnitTestCase { javac ^ javac /Users/mike/Projects/myapp/android/MyAppTests/src/com/myapp/test/SafeAsyncTest. Java:4: package roboguice. Test does not exist javac import roboguice.test.

RoboUnitTestCase; javac ^ javac /Users/mike/Projects/myapp/android/MyAppTests/src/com/myapp/test/SafeAsyncTest. Java:5: package roboguice. Util does not exist javac import roboguice.util.

RoboAsyncTask; javac ^ javac /Users/mike/Projects/myapp/android/MyAppTests/src/com/myapp/test/SafeAsyncTest. Java:6: package roboguice. Util does not exist javac import roboguice.util.

RoboLooperThread; javac ^ javac /Users/mike/Projects/myapp/android/MyAppTests/src/com/myapp/test/SafeAsyncTest. Java:12: cannot find symbol javac symbol: class RoboUnitTestCase javac public class SafeAsyncTest extends RoboUnitTestCase { javac ^ javac /Users/mike/Projects/myapp/android/MyApp/bin/classes/com/myapp/activity/Stories. Class: warning: Cannot find annotation method 'value()' in type 'roboguice.inject.

InjectResource': class file for roboguice.inject. InjectResource not found javac /Users/mike/Projects/myapp/android/MyApp/bin/classes/com/myapp/activity/Stories. Class: warning: Cannot find annotation method 'value()' in type 'roboguice.inject.

InjectResource' javac /Users/mike/Projects/myapp/android/MyApp/bin/classes/com/myapp/activity/Stories. Class: warning: Cannot find annotation method 'value()' in type 'roboguice.inject. InjectView': class file for roboguice.inject.

InjectView not found javac /Users/mike/Projects/myapp/android/MyApp/bin/classes/com/myapp/activity/Stories. Class: warning: Cannot find annotation method 'value()' in type 'roboguice.inject. InjectView' javac /Users/mike/Projects/myapp/android/MyApp/bin/classes/com/myapp/activity/Stories.

Class: warning: Cannot find annotation method 'value()' in type 'roboguice.inject. InjectView' javac /Users/mike/Projects/myapp/android/MyApp/bin/classes/com/myapp/activity/Stories. Class: warning: Cannot find annotation method 'value()' in type 'roboguice.inject.

InjectView' javac /Users/mike/Projects/myapp/android/MyAppTests/src/com/myapp/test/GsonTest. Java:15: cannot find symbol javac symbol : class JsonParser javac location: class com.myapp.test. GsonTest javac final JsonParser parser = new JsonParser(); javac ^ javac /Users/mike/Projects/myapp/android/MyAppTests/src/com/myapp/test/GsonTest.

Java:15: cannot find symbol javac symbol : class JsonParser javac location: class com.myapp.test. GsonTest javac final JsonParser parser = new JsonParser(); javac ^ javac /Users/mike/Projects/myapp/android/MyAppTests/src/com/myapp/test/GsonTest. Java:18: cannot find symbol javac symbol : class JsonElement javac location: class com.myapp.test.

GsonTest javac final JsonElement e = parser. Parse(s); javac ^ javac /Users/mike/Projects/myapp/android/MyAppTests/src/com/myapp/test/GsonTest. Java:20: cannot find symbol javac symbol : class JsonElement javac location: class com.myapp.test.

GsonTest javac final JsonElement e2 = parser. Parse(s2); javac ^ javac /Users/mike/Projects/myapp/android/MyAppTests/src/com/myapp/test/HttpTest. Java:19: cannot find symbol javac symbol : method getInstrumentation() javac location: class com.myapp.test.

HttpTest javac assertEquals("MyApp", getInstrumentation(). GetTargetContext().getResources(). GetString(com.myapp.R.string.

App_name)); javac ^ javac /Users/mike/Projects/myapp/android/MyAppTests/src/com/myapp/test/HttpTest. Java:62: cannot find symbol javac symbol : class RoboLooperThread javac location: class com.myapp.test. HttpTest javac new RoboLooperThread() { javac ^ javac /Users/mike/Projects/myapp/android/MyAppTests/src/com/myapp/test/HttpTest.

Java:82: cannot find symbol javac symbol : method assertTrue(java.lang. String,boolean) javac location: class com.myapp.test. HttpTest javac assertTrue(result0, result0.

Contains("Search")); javac ^ javac /Users/mike/Projects/myapp/android/MyAppTests/src/com/myapp/test/HttpTest. Java:87: cannot find symbol javac symbol : class JsonObject javac location: class com.myapp.test. HttpTest javac final JsonObject result = {null}; javac ^ javac /Users/mike/Projects/myapp/android/MyAppTests/src/com/myapp/test/HttpTest.

Java:90: cannot find symbol javac symbol : class RoboLooperThread javac location: class com.myapp.test. HttpTest javac new RoboLooperThread() { javac ^ javac /Users/mike/Projects/myapp/android/MyAppTests/src/com/myapp/test/HttpTest. Java:117: cannot find symbol javac symbol : class JsonObject javac location: class com.myapp.test.

HttpTest javac final JsonObject result = {null}; javac ^ javac /Users/mike/Projects/myapp/android/MyAppTests/src/com/myapp/test/HttpTest. Java:120: cannot find symbol javac symbol : class RoboLooperThread javac location: class com.myapp.test. HttpTest javac new RoboLooperThread() { javac ^ javac /Users/mike/Projects/myapp/android/MyAppTests/src/com/myapp/test/LinksTest.

Java:27: cannot find symbol javac symbol : method assertTrue(boolean) javac location: class com.myapp.test. LinksTest javac assertTrue(m.matches()); javac ^ javac /Users/mike/Projects/myapp/android/MyAppTests/src/com/myapp/test/LinksTest. Java:28: cannot find symbol javac symbol : method assertEquals(java.lang.

String,java.lang. String) javac location: class com.myapp.test. LinksTest javac assertEquals( map.

Get(url), m. Group(1) ); javac ^ javac /Users/mike/Projects/myapp/android/MyAppTests/src/com/myapp/test/SafeAsyncTest. Java:19: cannot find symbol javac symbol : method getInstrumentation() javac location: class com.myapp.test.

SafeAsyncTest javac assertEquals("MyApp", getInstrumentation(). GetTargetContext(). GetString(com.myapp.R.string.

App_name)); javac ^ javac /Users/mike/Projects/myapp/android/MyAppTests/src/com/myapp/test/SafeAsyncTest. Java:27: cannot find symbol javac symbol : class RoboLooperThread javac location: class com.myapp.test. SafeAsyncTest javac new RoboLooperThread() { javac ^ javac /Users/mike/Projects/myapp/android/MyAppTests/src/com/myapp/test/SafeAsyncTest.

Java:65: cannot find symbol javac symbol : method assertEquals(com.myapp.test.SafeAsyncTest. State,com.myapp.test.SafeAsyncTest. State) javac location: class com.myapp.test.

SafeAsyncTest javac assertEquals(State. TEST_SUCCESS,state0); javac ^ javac /Users/mike/Projects/myapp/android/MyAppTests/src/com/myapp/test/SafeAsyncTest. Java:74: cannot find symbol javac symbol : class RoboLooperThread javac location: class com.myapp.test.

SafeAsyncTest javac new RoboLooperThread() { javac ^ javac /Users/mike/Projects/myapp/android/MyAppTests/src/com/myapp/test/SafeAsyncTest. Java:105: cannot find symbol javac symbol : method assertEquals(com.myapp.test.SafeAsyncTest. State,com.myapp.test.SafeAsyncTest.

State) javac location: class com.myapp.test. SafeAsyncTest javac assertEquals(State. TEST_SUCCESS,state0); javac ^ javac /Users/mike/Projects/myapp/android/MyAppTests/src/com/myapp/test/SafeAsyncTest.

Java:113: cannot find symbol javac symbol : class RoboLooperThread javac location: class com.myapp.test. SafeAsyncTest javac new RoboLooperThread() { javac ^ javac /Users/mike/Projects/myapp/android/MyAppTests/src/com/myapp/test/SafeAsyncTest. Java:144: cannot find symbol javac symbol : method assertEquals(com.myapp.test.SafeAsyncTest.

State,com.myapp.test.SafeAsyncTest. State) javac location: class com.myapp.test. SafeAsyncTest javac assertEquals(State.

TEST_SUCCESS,state0); javac ^ javac /Users/mike/Projects/myapp/android/MyAppTests/src/com/myapp/test/SafeAsyncTest. Java:154: cannot find symbol javac symbol : class RoboLooperThread javac location: class com.myapp.test. SafeAsyncTest javac new RoboLooperThread() { javac ^ javac /Users/mike/Projects/myapp/android/MyAppTests/src/com/myapp/test/SafeAsyncTest.

Java:187: cannot find symbol javac symbol : method assertEquals(com.myapp.test.SafeAsyncTest. State,com.myapp.test.SafeAsyncTest. State) javac location: class com.myapp.test.

SafeAsyncTest javac assertEquals(State. TEST_SUCCESS,state0); javac ^ javac /Users/mike/Projects/myapp/android/MyAppTests/src/com/myapp/test/StoriesTest. Java:11: cannot access roboguice.activity.

GuiceListActivity javac class file for roboguice.activity. GuiceListActivity not found javac public class StoriesTest extends ActivityUnitTestCase { javac ^ javac /Users/mike/Projects/myapp/android/MyAppTests/src/com/myapp/test/StoriesTest. Java:21: cannot access roboguice.application.

GuiceApplication javac class file for roboguice.application. GuiceApplication not found javac setApplication( new MyApplication( getInstrumentation(). GetTargetContext() ) ); javac ^ javac /Users/mike/Projects/myapp/android/MyAppTests/src/com/myapp/test/StoriesTest.

Java:22: incompatible types javac found : com.myapp.activity. Stories javac required: android.app. Activity javac final Activity activity = startActivity(intent, null, null); javac ^ javac 39 errors javac 6 warnings BUILD FAILED /opt/local/android-sdk-mac/platforms/android-1.6/templates/android_rules.

Xml:248: Compile failed; see the compiler error output for details. Total time: 24 seconds That's not a hard problem to solve. I'm not sure it's the right thing to do, but I copied the missing libraries (roboguice and gson) from the MyApp/libs directory to the MyAppTests/libs directory and everything seems to compile fine.

But that leads to the second problem, which I'm currently stuck on. The tests compile fine but they won't run: $ cp ../MyApp/libs/gson-r538. Jar libs/ $ cp ../MyApp/libs/roboguice-1.1-SNAPSHOT.

Jar libs/ 0 10:23 /Users/mike/Projects/myapp/android/MyAppTests $ ant run-testsBuildfile: build. Xml setup Project Target: Google APIs setup Vendor: Google Inc. Setup Platform Version: 1.6 setup API level: 4 setup WARNING: No minSdkVersion value set.

Application will install on all Android versions. -install-tested-project: setup Project Target: Google APIs setup Vendor: Google Inc. Setup Platform Version: 1.6 setup API level: 4 setup WARNING: No minSdkVersion value set.

Application will install on all Android versions. -compile-tested-if-test: -dirs: echo Creating output directories if needed... -resource-src: echo Generating R. Java / Manifest.

Java from the resources... -aidl: echo Compiling aidl files into Java classes... compile: javac Compiling 1 source file to /Users/mike/Projects/myapp/android/MyApp/bin/classes -dex: echo Converting compiled files and external libraries into /Users/mike/Projects/myapp/android/MyApp/bin/classes.dex... echo -package-resources: echo Packaging resources aaptexec Creating full resource package... -package-debug-sign: apkbuilder Creating MyApp-debug-unaligned. Apk and signing it with a debug key... apkbuilder Using keystore: /Users/mike/. Android/debug.

Keystore debug: echo Running zip align on final apk... echo Debug Package: /Users/mike/Projects/myapp/android/MyApp/bin/MyApp-debug. Apk install: echo Installing /Users/mike/Projects/myapp/android/MyApp/bin/MyApp-debug. Apk onto default emulator or device... exec 1396 KB/s (288354 bytes in 0.201s) exec pkg: /data/local/tmp/MyApp-debug.

Apk exec Success -compile-tested-if-test: -dirs: echo Creating output directories if needed... -resource-src: echo Generating R. Java / Manifest. Java from the resources... -aidl: echo Compiling aidl files into Java classes... compile: javac Compiling 5 source files to /Users/mike/Projects/myapp/android/MyAppTests/bin/classes javac Note: /Users/mike/Projects/myapp/android/MyAppTests/src/com/myapp/test/SafeAsyncTest.

Java uses unchecked or unsafe operations. Javac Note: Recompile with -Xlint:unchecked for details. -dex: echo Converting compiled files and external libraries into /Users/mike/Projects/myapp/android/MyAppTests/bin/classes.dex... echo -package-resources: echo Packaging resources aaptexec Creating full resource package... -package-debug-sign: apkbuilder Creating MyAppTests-debug-unaligned.

Apk and signing it with a debug key... apkbuilder Using keystore: /Users/mike/. Android/debug. Keystore debug: echo Running zip align on final apk... echo Debug Package: /Users/mike/Projects/myapp/android/MyAppTests/bin/MyAppTests-debug.

Apk install: echo Installing /Users/mike/Projects/myapp/android/MyAppTests/bin/MyAppTests-debug. Apk onto default emulator or device... exec 1227 KB/s (94595 bytes in 0.075s) exec pkg: /data/local/tmp/MyAppTests-debug. Apk exec Success run-tests: echo Running tests ... exec exec android.test.suitebuilder.

TestSuiteBuilder$FailedToCreateTests:INSTRUMENTATION_RESULT: shortMsg=Class ref in pre-verified class resolved to unexpected implementation exec INSTRUMENTATION_RESULT: longMsg=java.lang. IllegalAccessError: Class ref in pre-verified class resolved to unexpected implementation exec INSTRUMENTATION_CODE: 0 BUILD SUCCESSFUL Total time: 38 seconds Any idea what's causing the "Class ref in pre-verified class resolved to unexpected implementation" error? Android unit-testing ant link|improve this question edited May 12 '10 at 20:43 asked Mar 18 '10 at 17:32emmby13.7k135680 69% accept rate.

If you use Eclipse, a simpler approach is to not include your external library in the test project, but rather export it in the Eclipse Project settings. This will solve the issue Time ago, I wrote a blog post explaining this: blog.js-development.com/2010/06/android-....

2 May I quote the OP: “I'd like to build them using ant so that I can take advantage of continuous integration. ” — The OP does not actually want to use Eclipse and whiches to build with Ant. – Martin Apr 7 '11 at 13:38 2 @Martin, I am still glad he shared this answer as I had the same problem but do not use Ant.

– Tom Dignan Jun 7 '11 at 21:18 @Tom Dignan: And you are not the only one — this off topic answer has more upvotes then the accepted answer ;-) – Martin Jun 8 '11 at 9:00 Thanks, I'm writing my project in a blend of Java and Scala and ran into this issue. I unchecked the Scala box in the exports and everything worked fine. – Sam Corder Sep 30 '11 at 15:33 Just a note... I used this solution and did have to 'clean' the project in Eclipse before everything worked.

– andypaxo Nov 10 '11 at 4:38.

The problem is that there's a bug in the android ant build scripts that don't include the tested project's libs directory when compiling the tester project. If you try to get around this by copying the libs to the tester project's libs dir, you'll run into class verification problems at run time like I did, as pointed out by fadden. The solution is to tweak the compile target originally in android's android_test_rules.

Xml to add to the directive. Here's the revised compile target. By adding it to the build.

Xml in your TESTER project, it will take precedence over the one in android_test_rules.xml.

Looks like this is the solution, but when adding those lines to my build. Xml, ant complains that -resource-src and -aidl are not defined (although they are imported) : Target "-resource-src" does not exist in the project "sdk_android_test". It is used from target "compile".

– Snicolas Jan 23 at 10:51 Ok, I had the wrong version of the tools. If you get the same error as I got, pick up the new version of compile in ou android tool ant_rules*. Xml file.

– Snicolas Jan 23 at 11:11 if I may ask, what sdk version are you using? I am using r16 and still getting the " Target "-resource-src" does not exist in the project " – browep Mar 20 at 22:37.

I don't see the actual error message in the text above, but I think I can answer. Generally, the warning happens because the same code appears in two different APKs. The implementation in one APK was used for pre-verification and optimization, but the other implementation is being used during execution.

The VM detects the situation and rejects the class, because the verification and optimization were performed with a set of assumptions that are no longer true. The way to fix this is to ensure that there is only one implementation of a class available to the VM. This may require fighting with the build scripts a bit more.

You can view the contents of an APK with "dexdump". (There's also "dexlist", which is a bit more concise, but I don't remember if that's part of the SDK. ).

1 Yeah, I was thinking the problem might be that based on some other things I've found on Google, but I haven't been able to figure out how to avoid it yet. BTW the error shows up at the bottom of the second code block during the "run-tests" target – emmby Mar 19 '10 at 20:30.

Have you tried to include the . Class files on the test apk, instead of generating new . Class files from your original project?

This solved the problem in my case.

I'm not sure I understand. – emmby Apr 16 '10 at 12:54.

Like fadden said, the same code is in two different APKs. This can e.g. Happen when your test and tested project both depend on the same android library project. That does not have to be direct as library projects can depend on other library projects.

The problem in the ant rules file seems to be fixed. At least in SDK tools r11. The compile target can be found in mail_rules.

Xml and not in test_rules. Xml, just for those who got confused.

I had a similar problem, using Intellij IDEA (11.1.1). Whily my app would build and deploy to the device just fine, my test-app would spew tons of dex errors when I tried to run it: "Class ref in pre-verified class resolved to unexpected implementation"... app test-app common-libs app depends on common-libs (and exports common-libs) test-app depends on app This post helped me figure out that the problem was duplicate class files in the app and test app . Dex files, which I then manually verified.

It turns out that to exclude the app classes from the test-app, in the module settings for test-app, I needed to change the scope of it's dependency, app, from 'compile', to 'provided'.

I cant really gove you an answer,but what I can give you is a way to a solution, that is you have to find the anglde that you relate to or peaks your interest. A good paper is one that people get drawn into because it reaches them ln some way.As for me WW11 to me, I think of the holocaust and the effect it had on the survivors, their families and those who stood by and did nothing until it was too late.

Related Questions