2015-06-02 21 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

    相关问题