Gradle connectedAndroidTest返回错误

时间:2014-03-19 04:19:02

标签: android testing gradle

我在使用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> packagedocs 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,你是我唯一的希望!

1 个答案:

答案 0 :(得分:2)

看起来您的测试包设置为com.domain.lib,这也是您的库的包名称。这是不正确的,因为它与库名冲突。

您应该避免使用testPackageName,因为您可能不关心测试应用程序包名称是什么。如果您将其留空,则会根据库的包名+ .test自动创建一个

我看到你正在使用enforceUniquePackageName,但这是在库依赖项之间强制执行它。我们将为此添加一个检查(https://code.google.com/p/android/issues/detail?id=67338)。

你也可以禁用BuildConfig的打包,但是它们可能遇到其他问题,所以最好不要在测试应用程序上设置包名。