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

Meh*_*ert 5 ant build-automation android unit-testing android-library

简而言之,我的项目结构如下:
- AB是android lib-projects,其中B依赖A
- C(正常的android项目)依赖于B
- TC的测试项目

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

"工作"应该意味着,根据脚本的不同,它要么在运行时没有编译,要么在运行时失败,因为缺少类,实际上不能或者因为添加重复而没有通过dexing阶段.

所以很明显,依赖项存在问题,但有趣的是它在本地机器上使用eclipse和模拟器工作得非常好.

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

cd project-test
android update test-project -m ../projectC -p .
ant clean debug
Run Code Online (Sandbox Code Playgroud)

这不幸导致来自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]                                                    ^
...
Run Code Online (Sandbox Code Playgroud)

我确实尝试了几乎所有可能来解决这个问题,甚至手动编辑project.properties文件,同时包含BB和C,就像这样的lib-projects:

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
Run Code Online (Sandbox Code Playgroud)

由于从lib-projects重复添加类,这次导致dexing错误.

有人对修复此问题有任何想法吗?提前感谢您的帮助!

yor*_*rkw 1

在您的测试项目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
Run Code Online (Sandbox Code Playgroud)

如果您在主项目和测试项目中添加库项目作为依赖项,并使用 Ant 构建您的测试项目,则会在 dexing 步骤中导致重复条目。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)
Run Code Online (Sandbox Code Playgroud)

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

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