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