Как использовать инструменты: overrideLibrary с несколькими библиотеками
Я хотел бы создать проект Android, который совместим, например. API 4, но все равно хотел бы протестировать его с помощью UiAutomator, для которого требуется уровень API 18 на более новых устройствах. Таким образом, приложение также будет работать на старых устройствах, но автоматические тесты будут выполняться на новых устройствах.
Поэтому я создал новый проект с Android Studio и добавил тестовые библиотеки UiAutomator:
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
testCompile 'junit:junit:4.12'
compile 'com.android.support:appcompat-v7:23.0.1'
androidTestCompile 'com.android.support:support-annotations:23.0.1'
androidTestCompile 'com.android.support.test:runner:0.3'
androidTestCompile 'com.android.support.test:rules:0.3'
androidTestCompile 'com.android.support.test.uiautomator:uiautomator-v18:2.1.1'
}
При компиляции я получаю сообщение об ошибке
Error:Execution failed for task ':app:processDebugAndroidTestManifest'.
> java.lang.RuntimeException: Manifest merger failed : uses-sdk:minSdkVersion 4 cannot be smaller than version 8 declared in library [com.android.support.test:runner:0.3] /Users/dom/Entwicklung/MacBookPro/git/GradleTest/app/build/intermediates/exploded-aar/com.android.support.test/runner/0.3/AndroidManifest.xml
Suggestion: use tools:overrideLibrary="android.support.test" to force usage
Добавление
<uses-sdk tools:overrideLibrary="android.support.test"/>
для AndroidManifest.xml возникает другая ошибка:
Error:Execution failed for task ':app:processDebugManifest'.
> Manifest merger failed : uses-sdk:minSdkVersion 4 cannot be smaller than version 7 declared in library [com.android.support:appcompat-v7:23.0.1] /Users/dom/Entwicklung/MacBookPro/git/GradleTest/app/build/intermediates/exploded-aar/com.android.support/appcompat-v7/23.0.1/AndroidManifest.xml
Suggestion: use tools:overrideLibrary="android.support.v7.appcompat" to force usage
Изменение его на
<uses-sdk tools:overrideLibrary="android.support.test, android.support.v7.appcompat"/>
снова вызывает первую ошибку:
Error:Execution failed for task ':app:processDebugAndroidTestManifest'.
> java.lang.RuntimeException: Manifest merger failed : uses-sdk:minSdkVersion 4 cannot be smaller than version 8 declared in library [com.android.support.test:runner:0.3] /Users/dom/Entwicklung/MacBookPro/git/GradleTest/app/build/intermediates/exploded-aar/com.android.support.test/runner/0.3/AndroidManifest.xml
Suggestion: use tools:overrideLibrary="android.support.test" to force usage
Я использую новейшие инструменты для Android и сборки. Команда gradle, которую Android Studio использует для создания приложения,
Gradle tasks [clean, :app:generateDebugSources, :app:generateDebugAndroidTestSources, :app:compileDebugSources, :app:compileDebugAndroidTestSources]
поэтому проблема может быть воспроизведена, например. с
gradle :app:generateDebugAndroidTestSources :app:compileDebugAndroidTestSources
Каков правильный синтаксис для указания нескольких библиотек в инструментах: overrideLibrary? Я прочитал, что запятая и пробел будут правильными, но это, похоже, не сработает. Я много читал об этом здесь, в StackOverflow и в других местах, но, к сожалению, пока не удалось найти решение (кроме комментариев).
Ответы
Ответ 1
Я выяснил, что решение заключается в создании второго AndroidManifest.xml, только для тестов. Он должен быть сохранен в каталог тестов и должен содержать только оператор overrideLibrary:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="${applicationId}">
<uses-sdk tools:overrideLibrary="android.app, android.support.test, android.support.test.rule, android.support.test.espresso, android.support.test.espresso.idling, android.support.test.uiautomator.v18"/>
</manifest>
Если вы используете другой каталог для своих задач, вы можете указать его таким образом в файле gradle:
androidTest.setRoot('src_test_uiautomator')
Файл AndroidManifest.xml должен находиться в корневой директории этого каталога, в тестовом источнике в подкаталоге java.
Ответ 2
Согласно официальному документу (раздел "Объединить маркер конфликта для импортированных библиотек" ), он должен быть.
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.android.example.app"
xmlns:tools="http://schemas.android.com/tools">
...
<uses-sdk android:targetSdkVersion="22" android:minSdkVersion="2"
tools:overrideLibrary="com.example.lib1, com.example.lib2"/>
где com.example.lib1, com.example.lib2
- пакеты, объявленные в AndroidManifes внутри библиотек.