2015-06-02 16 views
36

是否可以爲測試設置不同的minSdkVersion而不是應用本身?我問,因爲我想使用新的測試支持庫和UI Automator進行測試。但是,這僅適用於API 18+。與此同時,我仍然想要支持舊版本的Android,儘管沒有經過徹底的測試。爲了做到這一點,我需要添加到我的build.gradle文件中?爲testAndroid設置不同於主應用的minSdkVersion

爲了澄清,我使用Android Studio和「新」基於Gradle的項目結構。

+0

我認爲有這裏可接受的答案。 – theblang

+0

@mattblang我還沒有接受答案。我最終只是改變了整個應用程序的'minSdkVersion',並且還沒有驗證給出的答案。但是我沒有忘記,並且在我有機會自己測試答案時會接受答案。 –

回答

1

是的,你可以。您應該在src/androidTest/AndroidManifest.xml中放置特定於測試的清單條目。構建測試時,manifest merger將組合這兩種清單,但在構建應用程序時,只會使用主AndroidManifest.xml。

有關更多詳細信息,請參閱this answer

+0

我試圖做到這一點,清單合併似乎忽略了'src/androidTest/AndroidManifest.xml'文件。 –

+0

您使用的是哪個版本的Android Gradle插件? –

+0

com.android.tools.build:gradle:1.2.3 –

60

我從Google的the new testing template得到了這個。

在您的testandroidTest文件夾中創建一個新的AndroidManifest.xml文件。

<?xml version="1.0" encoding="utf-8"?> 
<manifest 
    xmlns:tools="http://schemas.android.com/tools" 
    package="your.package.name"> 

    <uses-sdk tools:overrideLibrary="android.support.test.uiautomator.v18"/> 
</manifest> 
4

我已上載該解決方案的一個例子mauricegavin/android-testing,因爲我無法找到一個工作的一個自己。

感興趣的模塊是ui/uiautomator/BasicSample/app。你會注意到androidTests目錄中有一個AndroidManifest.xml文件。您在app/build.gradle中指定的minSdkVersion仍將用於debugrelease構建。

您會看到sample project's build.gradle中的minSdkVersion指定了api 17,它不受uiautomator支持,並且通常會導致構建失敗。

<?xml version="1.0" encoding="utf-8"?> 
<manifest 
    xmlns:tools="http://schemas.android.com/tools" 
    package="com.example.android.testing.uiautomator.BasicSample" > 

    <uses-sdk tools:overrideLibrary="android.support.test.uiautomator.v18"/> 
</manifest> 

感謝mattblang爲他的回答,我用這個例子。

1

在發佈這個問題後,我也有想將minSdkVersion設置爲debugrelease構建的不同值。但是,我還沒有機會測試這是否有效。

我還發現一個可能的工作從this blog post。創建獨立的testproduction口味:

productFlavors { 
    // The actual application flavor 
    production { 
     minSdkVersion 14 
    } 
    // Test application flavor for uiautomatior tests 
    test { 
     minSdkVersion 18 
    } 
} 
+0

「測試」的味道名稱是不可接受的 – EliaszKubala

+0

@EliaszKubala謝謝。這在另一個答案中已經提到。 –

1

@代碼學徒是幾乎沒有。但是你不能命名產品的味道來「測試」,「android測試」或「釋放」。他們就像關鍵字一樣,你不能使用這些名字。

所以答案是

productFlavors { 
     product{ 
      minSdkVersion 15 
     } 
     uiautoTest { 
      minSdkVersion 18 
     } 
    } 
+0

Gradle 2.14-1確實表明'ProductFlavor名稱不能以'test'開頭 – kit

5

試試這個。

defaultConfig { 
    applicationId "com.test" 
    if (gradle.startParameter.taskNames.contains(":app:assembleDebug")) { 
     minSdkVersion 21 
    }else{ 
     minSdkVersion 14 
    } 
    targetSdkVersion 22 
    versionCode Integer.parseInt(VERSION_CODE) 
    versionName VERSION_NAME 
} 
+0

我不能在'debug'和'release'塊內沒有'if'語句做同樣的事情嗎? –

+0

我不確切知道gradle是如何工作的,但是如果你這樣做,** dubug **和** release **將被調用,所以最後一個將被設置。你可以看到日誌的結果。 'debug {logger.error(「debug !!」)minifyEnabled false signedConfig signingConfigs.debug} release {logger.error(「release !!」)minifyEnabled true signingConfig signingConfigs.release proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'}' –

0

我的解決方案基於風味配置:

  1. 分裂兩個味:
buildTypes { 
    release {...} 
    debug {...} 
} 

productFlavors { 
    dev { ... } 
    autoTest { 
     minSdkVersion 18 // set to 18 only in this flavor 
     multiDexEnabled true // if you got dex index overflow error 
     testInstrumentationRunner 'android.support.test.runner.AndroidJUnitRunner' 
    } 
} 
  • 移動你的測試相關依賴到「autoTestC ompile」
  • // for test 
    autoTestCompile 'com.android.support.test:runner:0.5', { 
        exclude group: 'com.android.support', module: 'support-annotations' 
    } 
    autoTestCompile 'com.android.support.test:rules:0.5', { 
        exclude group: 'com.android.support', module: 'support-annotations' 
    } 
    autoTestCompile 'com.android.support.test.espresso:espresso-web:2.2.2', { 
        exclude group: 'com.android.support', module: 'support-annotations' 
    } 
    autoTestCompile 'com.android.support.test.espresso:espresso-contrib:2.2.2', { 
        exclude group: 'com.android.support', module: 'support-annotations' 
        exclude group: 'com.android.support', module: 'support-v4' 
        exclude group: 'com.android.support', module: 'design' 
        exclude group: 'com.android.support', module: 'recyclerview-v7' 
    } 
    autoTestCompile 'com.android.support.test.uiautomator:uiautomator-v18:2.1.2', { 
        exclude group: 'com.android.support', module: 'support-annotations' 
    } 
    
  • 運行測試
  • Build Variant Screenshot

    相關問題