web-dev-qa-db-ja.com

testAndroidとメインアプリでは異なるminSdkVersionを設定します

テスト自体とアプリ自体で異なるminSdkVersionを設定することはできますか?新しいテストサポートライブラリとUI Automatorをテストに使用したいので、お願いします。ただし、これはAPI 18以降でのみ利用可能です。同時に、私はまだ完全にテストされていませんが、Androidの古いバージョンをサポートしたいと思っています。これを行うには、build.gradleファイルに何を追加する必要がありますか?

明確にするために、Android Studioと「新しい」Gradleベースのプロジェクト構造を使用しています。

42
Code-Apprentice

これは 新しいテストテンプレート から取得しました。

新しいを作成します 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>
67
theblang

私は mauricegavin/Android-testing に解決策の例をアップロードしました。 。

対象のモジュールはui/uiautomator/BasicSample/appです。 androidTestsディレクトリにAndroidManifest.xmlがあることがわかります。 app/build.gradleで指定したminSdkVersionは、debugおよびreleaseビルドに引き続き使用されます。

サンプルプロジェクトのbuild.gradleminSdkVersionapi 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 に感謝します。これは、この例で使用した回答です。

6
Maurice Gavin

これを試してください。

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
}
6
Soo Chun Jung

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でテストを実行している場合、ランタイムエラーが発生する可能性があります

3
Stéphane

テストのために、より高い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に変更すると、問題ないはずです

3
dogood

@ Code-Apprenticeはもうすぐです。ただし、製品のフレーバーに「test」、「androidTest」、または「release」という名前を付けることはできません。これらはキーワードのようなものであり、これらの名前は使用できません。

答えは

    productFlavors {
        product{
            minSdkVersion 15
        }
        uiautoTest {
            minSdkVersion 18
        }
    }
1
songzhw

はい、できます。テスト固有のマニフェストエントリをsrc/androidTest/AndroidManifest.xmlに配置する必要があります。テストをビルドするときに manifest merger は両方のマニフェストを結合しますが、アプリをビルドするときにはメインのAndroidManifest.xmlのみが使用されます。

詳細については this answer をご覧ください。

1
Allen Hair

この質問を投稿した後、minSdkVersiondebugビルドのreleaseを異なる値に設定するというアイデアもありました。ただし、これが機能するかどうかをテストする機会はありませんでした。

このブログ投稿 から回避策の1つを見つけました。個別のtestフレーバーとproductionフレーバーを作成します。

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

フレーバー構成に基づく私のソリューション:

  1. 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'
   }
}
  1. テスト関連の依存関係を「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. テストを実行

Build Variant Screenshot

0
Lin Yu Cheng

これは最もハッキングなバージョンです。このスクリプトを作成するのにほぼ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
    }
}
0
Pier Betos