【问题标题】:Set different minSdkVersion for testAndroid than for main app为 testAndroid 设置与主应用不同的 minSdkVersion
【发布时间】:2015-06-02 00:02:09
【问题描述】:

是否可以为测试设置与应用程序本身不同的minSdkVersion?我问是因为我想使用新的测试支持库和 UI Automator 进行测试。但是,这仅适用于 API 18+。同时,我仍然想支持旧版本的 Android,尽管没有经过彻底的测试。为了做到这一点,我需要向我的build.gradle 文件添加什么?

为了澄清,我使用的是 Android Studio 和“新的”基于 Gradle 的项目结构。

【问题讨论】:

  • 我认为这里有一个可以接受的答案。
  • @mattblang 很抱歉尚未接受答案。我最终只是为整个应用程序更改了minSdkVersion,但尚未验证给出的答案。不过,我并没有忘记,当我有机会自己测试答案时,我会接受答案。

标签: android testing android-uiautomator


【解决方案1】:

我从 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>

【讨论】:

  • 这可能会导致错误(“不应在 android manifest 文件中声明 minSdk 版本。您可以将版本从 manifest 移动到 build.gradle 文件中的 defaultConfig。”)工具(我无法确定哪个工具、版本和其他设置)。见"minsdk and targetsdk in Androidmanifest and build.gradle both?""Android Studio:Min SDK in my project"
  • 它确实有效,但我不确定这是不是最好的方法。不推荐。 Android Studio 建议:“使用 minSdk 最高为 17 的兼容库,或将此项目的 minSdk 版本提高到至少 18,或使用 tools:overrideLibrary="android.support.test.uiautomator.v18" 强制使用(可能导致运行时失败)”
  • 对于androidTestImplementation "androidx.test.uiautomator:uiautomator:2.2.0",使用:&lt;uses-sdk tools:overrideLibrary="android_libs.ub_uiautomator"/&gt;"your.package.name" 也应该是 testApplicationId 字符串。
【解决方案2】:

试试这个。

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
}



2020 年 4 月 16 日更新


您还可以使用 productFlavors

进行设置
android {
    compileSdkVersion 29

    defaultConfig {
        applicationId "com.test"
        targetSdkVersion 29
        versionCode 1
        versionName "1.0.0"
    }

    buildTypes {
        debug {
        }
        release {
            minifyEnabled true
        }
    }

    flavorDimensions "default"

    productFlavors {
        development {
            minSdkVersion 21
        }
        production {
            minSdkVersion 16
        }
    }
}

【讨论】:

  • 我不能在没有if 语句的debugrelease 块内做同样的事情吗?
  • 我不知道 gradle 究竟是如何工作的,但如果你这样做 dubugrelease 将同时被调用,所以最后一个将是放。您可以通过日志查看结果。 'debug { logger.error("debug!!") minifyEnabled false signingConfig signingConfigs.debug } release { logger.error("release!!") minifyEnabled true signingConfig signingConfigs.release proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' }'
  • 我遇到了第一个“解决方案”的问题。查看更多详情here
【解决方案3】:

我已将解决方案示例上传到 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 他的回答,我在这个例子中使用了。

【讨论】:

    【解决方案4】:

    我遇到了以下冲突,为了测试我需要更高的 minSdkVersion。

    我找到的解决方案是使用 buildType change the test build type 从以下文档中获取的,它为我完成了这项工作

    解决方法如下:

    android {
    defaultConfig {
        applicationId "com.doronkettner.ilikemovies"
        ...
        minSdkVersion 18
        ...
        testBuildType "staging"
        ...
        }
        ...
    buildTypes {
        release {...}
    
        debug {...}
    
        staging {
            initWith(buildTypes.debug) // keep versionName and PIN from 'debug'
            defaultConfig.minSdkVersion 19
        }
    }
    

    把buildType改成stage就可以了

    【讨论】:

    • 这不起作用。它将为所有 buildTypes 设置 minSdkVersion
    【解决方案5】:

    使用 androidx,您可以通过 tools:overrideLibrary="android_libs.ub_uiautomator"

    强制使用版本 <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:tools="http://schemas.android.com/tools" package="..." > <uses-sdk tools:overrideLibrary="android_libs.ub_uiautomator"/> </manifest>

    但如果您在

    【讨论】:

    • 这就是我一直在寻找的东西!
    【解决方案6】:

    当你运行 androidTest 时,最后会有一个包含"AndroidTest" 的任务。这就是为什么我根据这种模式过滤我的任务。

    我的任务名称是 - :app:assembleMyFlavourDebugAndroidTest

    defaultConfig {
    
        gradle.startParameter.taskNames.each {
            if (it.contains("AndroidTest")) {
                minSdkVersion 18
            } else {
                minSdkVersion 16
            }
        }
    }
    

    【讨论】:

    • 这是一个很好的解决方案。我认为它需要一个小的调整来解释基本的androidTest 任务,该任务运行所有风格和构建的所有测试。
    【解决方案7】:

    是的,你可以。您应该将特定于测试的清单条目放在src/androidTest/AndroidManifest.xml 中。在构建您的测试时,manifest merger 将结合这两个清单,但在构建您的应用程序时,只会使用主 AndroidManifest.xml。

    更多详情请见this answer

    【讨论】:

    • 我试图这样做,但清单合并似乎忽略了 src/androidTest/AndroidManifest.xml 文件。
    • 您使用的是哪个版本的 Android Gradle 插件?
    • com.android.tools.build:gradle:1.2.3
    • 你能发布你的 build.gradle 和 AndroidManifest.xml 文件吗?
    • 我认为它不起作用,因为在 Gradle DSL 中声明的 minSdk 将覆盖清单中声明的​​那个。它记录在这里:tools.android.com/tech-docs/new-build-system/…
    【解决方案8】:

    这是最老套的版本。我花了将近一天的时间来创建这个脚本。请注意此作为纪念品,但仅将其用作最后的手段

    android.applicationVariants.all { variant ->
    
    //Making specific variant disablements for faster build
    if (variant.buildType.name.contains("debug")) {
        println "Making min version to 21 and disabling multidex"
        variant.mergedFlavor.setMultiDexEnabled false
    
        def versionMin = new com.android.builder.core.DefaultApiVersion(21)
        variant.mergedFlavor.setMinSdkVersion versionMin
        }
    }
    

    【讨论】:

      【解决方案9】:

      发布此问题后,我还想到将 minSdkVersion 设置为 debugrelease 构建的不同值。但是,我还没有机会测试这是否有效。

      我还从this blog post 找到了一种可能的解决方法。创建单独的 testproduction 风味:

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

      【讨论】:

      • @EliaszKubala 谢谢。这已经在另一个答案中提到了。
      【解决方案10】:

      @Code-Apprentice 快到了。但是您不能将产品风格命名为“test”、“androidTest”或“release”。它们就像关键字,您不能使用这些名称。

      所以答案是

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

      【讨论】:

      • Gradle 2.14-1 确实暗示ProductFlavor names cannot start with 'test'
      【解决方案11】:

      我基于风味配置的解决方案:

      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'
         }
      }
      
      1. 将与测试相关的依赖项移动到“autoTestCompile”中
      // 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'
      }
      
      1. 运行测试

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-03-01
        • 1970-01-01
        • 1970-01-01
        • 2014-10-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多