我在使用android gradle插件(19.0.3)的最新更新时遇到问题!我无法在CI服务器上让我们的测试在库项目上运行。要么我做错了,要么新版本破坏了测试库项目。
我正在尝试从命令行运行测试:
./gradlew :libproject:connectedAndroidTest
当我在本地机器上运行时,测试运行完美。
但是,当我在CI服务器上运行时,我收到此警告:
WARNING: support for libraries with same package name is deprecated and will be removed in 1.0
然后我收到了这个错误:
UNEXPECTED TOP-LEVEL EXCEPTION:
com.android.dex.DexException: Multiple dex files define Lcom/domain/lib/BuildConfig;
at com.android.dx.merge.DexMerger.readSortableTypes(DexMerger.java:594)
at com.android.dx.merge.DexMerger.getSortedTypes(DexMerger.java:552)
at com.android.dx.merge.DexMerger.mergeClassDefs(DexMerger.java:533)
at com.android.dx.merge.DexMerger.mergeDexes(DexMerger.java:170)
at com.android.dx.merge.DexMerger.merge(DexMerger.java:188)
at com.android.dx.command.dexer.Main.mergeLibraryDexBuffers(Main.java:439)
at com.android.dx.command.dexer.Main.runMonoDex(Main.java:287)
at com.android.dx.command.dexer.Main.run(Main.java:230)
at com.android.dx.command.dexer.Main.main(Main.java:199)
at com.android.dx.command.Main.main(Main.java:103)
我相信这可能是因为testPackageName与库包相同。
但是,如果我更改了testPackageName,则找不到任何测试,因为生成的清单中的<instrumentation>
标记不正确。 androidTargetPackage指向不再与库匹配的testPackageName。有没有办法在生成的AndroidManifest.xml中设置我遗漏的<manifest> package
? docs don't seem to think it is required.
两个版本在子项目/构建/源中生成两个BuildConfig.java文件,这两个文件在两台机器上都是相同的:
$ find source -name "BuildConfig.java"
source/buildConfig/debug/com/domain/lib/BuildConfig.java
source/buildConfig/test/debug/com/domain/lib/BuildConfig.java
对于我的生活,我无法弄清楚它为什么在我的本地机器上工作而不在我们的CI服务器上。除了java版本之外,Gradle的版本是相同的:
./gradlew --version
------------------------------------------------------------
Gradle 1.10
------------------------------------------------------------
Build time: 2013-12-17 09:28:15 UTC
Build number: none
Revision: 36ced393628875ff15575fa03d16c1349ffe8bb6
Groovy: 1.8.6
Ant: Apache Ant(TM) version 1.9.2 compiled on July 8 2013
Ivy: 2.2.0
JVM: 1.7.0_25 (Oracle Corporation 23.25-b01)
OS: Mac OS X 10.8.5 x86_64
$ ./gradlew --version
------------------------------------------------------------
Gradle 1.10
------------------------------------------------------------
Build time: 2013-12-17 09:28:15 UTC
Build number: none
Revision: 36ced393628875ff15575fa03d16c1349ffe8bb6
Groovy: 1.8.6
Ant: Apache Ant(TM) version 1.9.2 compiled on July 8 2013
Ivy: 2.2.0
JVM: 1.7.0_45 (Oracle Corporation 24.45-b08)
OS: Mac OS X 10.8.5 x86_64
repo根目录下的build.gradle文件:
buildscript {
repositories {
mavenCentral()
}
dependencies {
classpath 'com.android.tools.build:gradle:0.9.+'
}
}
allprojects {
repositories {
mavenCentral()
}
}
子项目中的build.gradle:
apply plugin: 'android-library'
dependencies {
compile fileTree(dir: 'libs', include: '*.jar')
compile project(':testrunner')
// Test Dependencies
androidTestCompile 'com.google.dexmaker:dexmaker:1.0',
'com.google.dexmaker:dexmaker-mockito:1.0',
'org.mockito:mockito-core:1.9.5',
'com.google.mockwebserver:mockwebserver:20130706'
}
android {
compileSdkVersion 19
buildToolsVersion "19.0.3"
enforceUniquePackageName=false
defaultConfig {
testPackageName "com.domain.lib"
testInstrumentationRunner "com.domain.testrunner.InstrumentationTestRunner"
testHandleProfiling true
testFunctionalTest true
}
sourceSets {
main {
manifest.srcFile 'AndroidManifest.xml'
res.srcDirs = ['res']
assets.srcDirs = ['assets']
}
}
}
我还在两台机器上完成了android update -u -a
,以确保工具完全相同,并且安装了所有可能的工具。
我在这个问题上的斗智斗勇!我无法弄清楚有什么不同。帮帮我Stack Overflow,你是我唯一的希望!
答案 0 :(得分:2)
看起来您的测试包设置为com.domain.lib
,这也是您的库的包名称。这是不正确的,因为它与库名冲突。
您应该避免使用testPackageName
,因为您可能不关心测试应用程序包名称是什么。如果您将其留空,则会根据库的包名+ .test
自动创建一个
我看到你正在使用enforceUniquePackageName
,但这是在库依赖项之间强制执行它。我们将为此添加一个检查(https://code.google.com/p/android/issues/detail?id=67338)。
你也可以禁用BuildConfig的打包,但是它们可能遇到其他问题,所以最好不要在测试应用程序上设置包名。