2014-03-19 20 views
1

我遇到了Android gradle插件(19.0.3)的最新更新問題!我無法讓我們的測試在我們的CI服務器上運行在一個庫項目上。要麼我做錯了什麼,要麼是新版本打破了測試庫項目。Gradle connectedAndroidTest返回錯誤

我試圖運行命令行測試:

./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版本:

./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 

在回購的根目錄下的文件的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,以確保工具完全相同,並且安裝了所有可能的東西。

我在我的智慧結束這一個!我無法弄清楚什麼是不同的。幫助我堆棧溢出,你是我唯一的希望!

回答

2

看起來您的測試包設置爲com.domain.lib,這也是您的庫的包名稱。這是不正確的,因爲它與庫名稱相沖突。

您應該避免使用testPackageName,因爲您可能不在乎測試應用程序包名稱是什麼。如果將它留空,它會根據庫的包名自動創建一個+ .test

我看到您使用的是enforceUniquePackageName,但這是爲了在庫依賴關係之間執行它。我們將爲此添加支票(https://code.google.com/p/android/issues/detail?id=67338)。

您也可以禁用BuildConfig的打包,但它們可能會遇到其他問題,所以最好不要在測試應用程序中設置軟件包名稱。

+0

使用Eclipse下的當前兩個項目設置允許在同一個包中包含測試和庫。 當我取出testPackageName時,''標記上的targetPackage被設置爲「com.domain.lib.test」,並且沒有找到任何測試。測試不在該包中。測試必須使用新的gradle構建包含在com.domain.lib.test包中嗎? –

+0

沒有測試不必在該包中找到。 –

+0

我誤解了測試未找到,因爲gradle正在生成libproject/build/reports,並顯示零測試。使用showVersion http://stackoverflow.com/questions/18098231/how-can-i-check-which-gradle-android-plugin-version-is-used-in-my-project我看到我的開發機器在0.9。 0和CI在0.9.1上,因此行爲上的差異。 –