是否可以爲測試設置不同的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',並且還沒有驗證給出的答案。但是我沒有忘記,並且在我有機會自己測試答案時會接受答案。 –