由于主项目的复杂lib项目依赖关系,Jenkins Server上的自动Android UI测试失败



简单总结一下,我的项目结构如下:
-AB是android lib项目,其中B依赖于A
-C(正常的android项目)取决于B
-TC的测试项目

相应地,我在jenkins服务器上有两个项目,一个用于C,另一个用于T。它们有自己的构建脚本,实际上只使用android和ant命令。因此,构建C没有问题,但我无法获得t的工作构建。

"工作"应该意味着,根据脚本的不同,它要么不编译,要么在运行时因为一些丢失的类而失败,而这些类实际上不可能编译,或者因为添加重复项而没有通过索引阶段。

所以很明显,依赖关系有问题,但有趣的是,它在带有eclipse&在模拟器上。

因此,这里有一个示例shell脚本代码,它实际上应该可以工作并创建一个apk文件:

cd project-test
android update test-project -m ../projectC -p .
ant clean debug

不幸的是,这导致了我也要测试的B中的一些类在java编译器中找不到,我总是收到这样的错误:

...
[javac] Compiling 14 source files to /home/mehmed/git/project/test-project/bin/classes
[javac] SomeActivityTest.java:8: package com.mydomain.portal.android.project.activity does not exist
[javac] import com.mydomain.portal.android.project.activity.SomeClass1;
[javac]                                                        ^
[javac] SomeActivityTest.java:9: package com.mydomain.portal.android.project.data does not exist
[javac] import com.mydomain.portal.android.project.data.SomeClass2;
[javac]                                                    ^
[javac] SomeActivityTest.java:10: package com.project.portal.android.project.util does not exist
[javac] import com.mydomain.portal.android.project.util.SomeClass3;
[javac]                                                    ^
...

我确实尝试了几乎所有可能的方法来解决这个问题,甚至手动编辑project.properties文件,同时只包括BB和C作为lib项目,如下所示:

cd project-test
android update test-project -m ../projectC -p .
echo "android.library.reference.1=../projectB" >> project.properties
# or even also projectA:
echo "android.library.reference.2=../projectA" >> project.properties
ant clean debug

这一次导致了索引错误,因为重复添加了来自lib项目的类。

有人对解决这个问题有什么想法吗?感谢您的提前帮助!

在您的测试项目T中,如果您有SomeActivityTest显式导入/使用库项目B和/或C的某些包/类,则必须将库项目添加为测试项目的依赖项,因为在项目构建时需要引用的包/类。如果你不这样做,你将在编译你的测试项目时得到以下错误:

[javac] SomeActivityTest.java:8: package com.mydomain.portal.android.project.activity does not exist
[javac] import com.mydomain.portal.android.project.activity.SomeClass1;
[javac]                                                        ^
[javac] SomeActivityTest.java:9: package com.mydomain.portal.android.project.data does not exist

如果在主项目和测试项目中都添加Library项目作为依赖项,并使用Ant构建测试项目,则会在索引步骤中导致重复条目。Eclipse ADT插件知道如何正确处理这种情况,这样在使用Eclipse构建时就不会遇到这种麻烦:

[dx] UNEXPECTED TOP-LEVEL EXCEPTION:
[dx] java.lang.IllegalArgumentException: already added: Lcom/mydomain/...;
[dx]     at com.android.dx.dex.file.ClassDefsSection.add(ClassDefsSection.java:123)
[dx]     at com.android.dx.dex.file.DexFile.add(DexFile.java:163)

目前,有一个解决方法(ant脚本中的脏修复),请查看我的答案以了解详细信息。

请注意,最新的SDK版本r17得到了许多错误修复和改进。根据变更日志,它声称现在SDK可以更智能地处理重复依赖关系,尽管我还没有厌倦测试项目。也许你可以试一下,看看它是否有效。希望这能有所帮助。

从总体描述来看,这听起来像是Android错误#21720—Android构建系统最近的变化意味着在命令行上构建这样的项目无法正常工作。

在评论16和17中有一个变通方法,您可以尝试。

最新更新