Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/198.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为testAndroid设置与主应用不同的版本_Android_Testing_Android Uiautomator - Fatal编程技术网

为testAndroid设置与主应用不同的版本

为testAndroid设置与主应用不同的版本,android,testing,android-uiautomator,Android,Testing,Android Uiautomator,是否可以为测试设置与应用程序本身不同的minSdkVersion?我这样做是因为我想使用新的测试支持库和UI自动机进行测试。但是,这仅适用于API 18+。同时,我仍然希望支持旧版本的Android,尽管没有经过彻底测试。要做到这一点,我需要向我的build.gradle文件中添加什么 为了澄清,我正在使用Android Studio和基于Gradle的“新”项目结构。是的,你可以。您应该将特定于测试的清单条目放入src/androidTest/AndroidManifest.xml中。在构建测

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


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

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

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

我从谷歌那里得到了这个

test
androidTest
文件夹中创建一个新的
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>

我已将该解决方案的一个示例上载到,因为我自己找不到可用的示例

感兴趣的模块是ui/uiautomator/BasicSample/app。您会注意到在androidTests目录中有一个AndroidManifest.xml。您在
app/build中指定的
minSdkVersion
。gradle
仍将用于
debug
release
版本

您将看到中的
minSdkVersion
指定了uiautomator不支持的
API17
,通常会导致构建失败

<?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>


感谢他的回答,我在本例中使用了他的回答。

在发布了这个问题之后,我还想到了为
调试
发布
版本设置不同的值。然而,我还没有机会测试这是否有效

我还从中找到了一个可能的解决方法。创建单独的
测试
生产
风格:

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

@代码学徒就快到了。但你不能将一种产品的味道命名为“test”、“androidTest”或“release”。它们类似于关键字,您不能使用这些名称

所以答案是

    productFlavors {
        product{
            minSdkVersion 15
        }
        uiautoTest {
            minSdkVersion 18
        }
    }
试试这个

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-04-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
        }
    }
}

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

  • 分成两种口味:
  • 将与测试相关的依赖项移到“自动测试编译”中
  • 运行测试

  • 这是最黑的版本。我花了将近一天的时间来创建这个脚本。请记下这封信作为纪念,但只能作为最后手段使用

    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
        }
    }
    

    我得到了以下冲突,为了测试我需要一个更高的版本

    我找到的解决方案是使用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
        }
    }
    

    将buildType更改为stage,使用androidx应该可以

    您可以使用工具overrideLibrary=“android_libs.ub_automator”强制使用版本为<18的UI automator

    
    

    但是,如果您在版本<18

    上运行测试,则可能会导致运行时失败。当您运行androidTest时,最后将有一个任务包含
    “androidTest”
    。这就是为什么我根据这种模式筛选任务

    我的任务名是-
    :app:AssembleMyFlavourDebuganRoidTest

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

    我尝试这样做,清单合并似乎忽略了
    src/androidTest/AndroidManifest.xml
    文件。您使用的是哪个版本的Android Gradle插件?com.Android.tools.build:Gradle:1.2.3您可以发布build.Gradle和AndroidManifest.xml文件吗?我认为它不起作用,因为在Gradle DSL中声明了minSdk将重写清单中声明的。这里有文档记录:Gradle 2.14-1确实表明,
    ProductFlavor名称不能以“test”开头。
    @EliaszKubala谢谢。这已经在另一个答案中提到了。我认为这里有一个可以接受的答案。@mattblang我为还没有接受答案而道歉。最后,我只是为整个应用程序更改了
    minSdkVersion
    ,还没有验证给出的答案。不过,我没有忘记,当我有机会自己测试答案时,我会接受答案。难道我不能在
    调试
    发布
    块中做同样的事情,而不使用
    if
    语句吗?我不知道gradle是如何工作的,但如果你这样做,dubug和release将同时被称为,所以最后一个将被设置。您可以通过日志查看结果。”debug{logger.error(“debug!!”)minifyEnabled false signingConfig configs.debug}release{logger.error(“release!!”)minifyEnabled true signingConfig signingConfigs.release proguardFiles getDefaultProguardFile('proguard-android.txt'),'proguard rules.pro'}我对第一个“解决方案”有问题。查看更多详细信息这可能会在较新的工具中导致错误(“不应在android清单文件中声明minSdk版本。您可以将该版本从清单移动到build.gradle文件中的defaultConfig。”)(我无法确定哪个工具、版本和其他设置)。看,这确实有效,但我不确定这是最好的方法。不建议这样做。Android Studio建议:“使用minSdk最多为17的兼容库,或者将此项目的minSdk版本增加到至少18,或者使用工具:overrideLibrary=“Android.support.test.uiautomator.v18”强制使用(可能导致运行时失败)“androidTestImplementation”androidx.test.uiautomator:uiautomator:2.2.0”
    ,使用:
    。另外,
    “your.package.name”
    应该是
    testApplicationId
    字符串。这就是我一直在寻找的!这是一个很好的解决方案。我认为需要对基础
    
    
    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
        }
    }
    
    <?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> 
    
    defaultConfig {
    
        gradle.startParameter.taskNames.each {
            if (it.contains("AndroidTest")) {
                minSdkVersion 18
            } else {
                minSdkVersion 16
            }
        }
    }