为testAndroid设置不同的minSdkVersion而不是主应用程序

Cod*_*ice 42 testing android android-uiautomator

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

为了澄清,我使用Android Studio和"新的"基于Gradle的项目结构.

the*_*ang 68

我从谷歌的新测试模板中得到了这个.

AndroidManifest.xml在您的testandroidTest文件夹中创建一个新文件.

<?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>
Run Code Online (Sandbox Code Playgroud)


Mau*_*vin 6

我已经上传了一个mauricegavin/android-testing解决方案的例子,因为我自己找不到工作的.

感兴趣的模块是ui/uiautomator/BasicSample/app.您会注意到androidTests目录中有一个AndroidManifest.xml.将minSdkVersion你在指定app/build.gradle仍将被用于debugrelease构建.

你会看到,minSdkVersion样本项目的build.gradle指定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>
Run Code Online (Sandbox Code Playgroud)

感谢mattblang的回答,我用这个例子.


Soo*_*ung 6

试试这个.

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
}
Run Code Online (Sandbox Code Playgroud)


dog*_*ood 6

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

我找到的解决方案来自以下文档,使用 buildType更改测试构建类型,它为我完成了这项工作

以下是解决方案:

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
    }
}
Run Code Online (Sandbox Code Playgroud)

将 buildType 改为 stage 应该就可以了


Sté*_*ane 5

使用androidx,您可以通过以下工具强制使用版本低于18的UI自动器: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> 
Run Code Online (Sandbox Code Playgroud)

但是,如果您在版本<18上运行测试,可能会导致运行时失败


Sat*_*tli 5

当您运行 androidTest 时,最后会包含一个任务"AndroidTest"。这就是我根据这种模式过滤我的任务的原因。

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

defaultConfig {

    gradle.startParameter.taskNames.each {
        if (it.contains("AndroidTest")) {
            minSdkVersion 18
        } else {
            minSdkVersion 16
        }
    }
}
Run Code Online (Sandbox Code Playgroud)


All*_*air 2

是的你可以。您应该将特定于测试的清单条目放入src/androidTest/AndroidManifest.xml. 构建测试时,清单合并将合并两个清单,但构建应用程序时,仅使用主 AndroidManifest.xml。

有关更多详细信息,请参阅此答案。