テスト自体とアプリ自体で異なるminSdkVersion
を設定することはできますか?新しいテストサポートライブラリとUI Automatorをテストに使用したいので、お願いします。ただし、これはAPI 18以降でのみ利用可能です。同時に、私はまだ完全にテストされていませんが、Androidの古いバージョンをサポートしたいと思っています。これを行うには、build.gradle
ファイルに何を追加する必要がありますか?
明確にするために、Android Studioと「新しい」Gradleベースのプロジェクト構造を使用しています。
これは 新しいテストテンプレート から取得しました。
新しいを作成します AndroidManifest.xml
ファイルをtest
またはandroidTest
フォルダーに入れます。
<?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
ビルドに引き続き使用されます。
サンプルプロジェクトの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 に感謝します。これは、この例で使用した回答です。
これを試してください。
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
}
androidxを使用すると、バージョン<18のUIオートマトンを強制的に使用できますtools: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>
ただし、バージョン<18でテストを実行している場合、ランタイムエラーが発生する可能性があります
テストのために、より高い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
}
}
BuildTypeをstageに変更すると、問題ないはずです
@ Code-Apprenticeはもうすぐです。ただし、製品のフレーバーに「test」、「androidTest」、または「release」という名前を付けることはできません。これらはキーワードのようなものであり、これらの名前は使用できません。
答えは
productFlavors {
product{
minSdkVersion 15
}
uiautoTest {
minSdkVersion 18
}
}
はい、できます。テスト固有のマニフェストエントリをsrc/androidTest/AndroidManifest.xml
に配置する必要があります。テストをビルドするときに manifest merger は両方のマニフェストを結合しますが、アプリをビルドするときにはメインのAndroidManifest.xmlのみが使用されます。
詳細については this answer をご覧ください。
この質問を投稿した後、minSdkVersion
とdebug
ビルドのrelease
を異なる値に設定するというアイデアもありました。ただし、これが機能するかどうかをテストする機会はありませんでした。
このブログ投稿 から回避策の1つを見つけました。個別のtest
フレーバーとproduction
フレーバーを作成します。
productFlavors {
// The actual application flavor
production {
minSdkVersion 14
}
// Test application flavor for uiautomatior tests
test {
minSdkVersion 18
}
}
フレーバー構成に基づく私のソリューション:
- 2つのフレーバーに分割:
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'
}
}
- テスト関連の依存関係を「autoTestCompile」に移動します
// 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'
}
- テストを実行
これは最もハッキングなバージョンです。このスクリプトを作成するのにほぼ1日かかりました。記念品については、このことに注意してくださいただし、これは最後の手段としてのみ使用してください。
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
}
}