是否可以为测试设置不同的minSdkVersion
而不是应用本身?我问,因为我想使用新的测试支持库和UI Automator进行测试。但是,这仅适用于API 18+。与此同时,我仍然想要支持旧版本的Android,尽管没有经过彻底的测试。为了做到这一点,我需要添加到我的build.gradle
文件中?为testAndroid设置不同于主应用的minSdkVersion
为了澄清,我使用Android Studio和“新”基于Gradle的项目结构。
是否可以为测试设置不同的minSdkVersion
而不是应用本身?我问,因为我想使用新的测试支持库和UI Automator进行测试。但是,这仅适用于API 18+。与此同时,我仍然想要支持旧版本的Android,尽管没有经过彻底的测试。为了做到这一点,我需要添加到我的build.gradle
文件中?为testAndroid设置不同于主应用的minSdkVersion
为了澄清,我使用Android Studio和“新”基于Gradle的项目结构。
是的,你可以。您应该在src/androidTest/AndroidManifest.xml
中放置特定于测试的清单条目。构建测试时,manifest merger将组合这两种清单,但在构建应用程序时,只会使用主AndroidManifest.xml。
有关更多详细信息,请参阅this answer。
我试图做到这一点,清单合并似乎忽略了'src/androidTest/AndroidManifest.xml'文件。 –
您使用的是哪个版本的Android Gradle插件? –
com.android.tools.build:gradle:1.2.3 –
我从Google的the new testing template得到了这个。
在您的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>
我已上载该解决方案的一个例子mauricegavin/android-testing,因为我无法找到一个工作的一个自己。
感兴趣的模块是ui/uiautomator/BasicSample/app。你会注意到androidTests目录中有一个AndroidManifest.xml文件。您在app/build.gradle
中指定的minSdkVersion
仍将用于debug
和release
构建。
您会看到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为他的回答,我用这个例子。
在发布这个问题后,我也有想将minSdkVersion
设置为debug
和release
构建的不同值。但是,我还没有机会测试这是否有效。
我还发现一个可能的工作从this blog post。创建独立的test
和production
口味:
productFlavors {
// The actual application flavor
production {
minSdkVersion 14
}
// Test application flavor for uiautomatior tests
test {
minSdkVersion 18
}
}
“测试”的味道名称是不可接受的 – EliaszKubala
@EliaszKubala谢谢。这在另一个答案中已经提到。 –
@代码学徒是几乎没有。但是你不能命名产品的味道来“测试”,“android测试”或“释放”。他们就像关键字一样,你不能使用这些名字。
所以答案是
productFlavors {
product{
minSdkVersion 15
}
uiautoTest {
minSdkVersion 18
}
}
Gradle 2.14-1确实表明'ProductFlavor名称不能以'test'开头 – kit
试试这个。
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
}
我不能在'debug'和'release'块内没有'if'语句做同样的事情吗? –
我不确切知道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'}' –
我的解决方案基于风味配置:
- 分裂两个味:
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'
}
- 运行测试
我认为有这里可接受的答案。 – theblang
@mattblang我还没有接受答案。我最终只是改变了整个应用程序的'minSdkVersion',并且还没有验证给出的答案。但是我没有忘记,并且在我有机会自己测试答案时会接受答案。 –