Задайте различные minSdkVersion для testAndroid, чем для основного приложения.
Можно ли установить другие тесты minSdkVersion
для тестов, чем для самого приложения? Я прошу, потому что я хочу использовать новую тестовую библиотеку поддержки и UI Automator для тестирования. Однако это доступно только для API 18+. В то же время я все еще хочу поддерживать более старые версии Android, хотя и не так тщательно проверены. Что мне нужно добавить в мой файл build.gradle
для этого?
Чтобы уточнить, я использую Android Studio и "новую" структуру проекта Gradle.
Ответы
Ответ 1
Я получил это от нового шаблона тестирования от Google.
Создайте новый 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>
Ответ 2
Я загрузил пример решения mauricegavin/android-testing, поскольку я не мог найти себе рабочий.
Интересующий модуль ui/uiautomator/BasicSample/app. Вы заметите, что есть AndroidManifest.xml в каталоге androidTests. minSdkVersion
, который вы укажете в app/build.gradle
, будет использоваться для создания debug
и release
.
Вы увидите, что minSdkVersion
в пример проекта build.gradle указывает 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 за его ответ, который я использовал для этого примера.
Ответ 3
попробуйте этот.
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
}
Ответ 4
Да, вы можете. Вы должны поместить тестовые записи манифеста в src/androidTest/AndroidManifest.xml
. При построении тестов слияние манифеста будет сочетать оба манифеста, но при создании вашего приложения будет использоваться только основной AndroidManifest.xml.
Подробнее см. этот ответ.
Ответ 5
После публикации этого вопроса у меня также возникла идея установить minSdkVersion
для разных значений для построений debug
и release
. Однако у меня не было возможности проверить, работает ли это или нет.
Я также нашел одну возможную работу из этого сообщения в блоге. Создайте отдельные ароматы test
и production
:
productFlavors {
// The actual application flavor
production {
minSdkVersion 14
}
// Test application flavor for uiautomatior tests
test {
minSdkVersion 18
}
}
Ответ 6
@Code-Apprentice почти существует. Но вы не можете назвать вкус продукта "test", "androidTest" или "release". Они похожи на ключевые слова, и вы не можете использовать эти имена.
Итак, ответ
productFlavors {
product{
minSdkVersion 15
}
uiautoTest {
minSdkVersion 18
}
}
Ответ 7
Мое решение основано на конфигурации вкуса:
- Разделить на два аромата:
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'
}
- Run Test
![Скриншот скрипта сборки]()
Ответ 8
Это самая хакерская версия. На создание этого сценария у меня ушёл почти день. Пожалуйста, примите это к сведению на память, но используйте это только в качестве крайней меры.
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
}
}
Ответ 9
Я получил следующий конфликт, для тестирования мне понадобился более высокий 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, и все должно быть в порядке
Ответ 10
С androidx вы можете принудительно использовать UI automator в версии <18 с помощью инструментов: 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