Подтвердить что ты не робот

Как использовать инструменты: 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 и в других местах, но, к сожалению, пока не удалось найти решение (кроме комментариев).

4b9b3361

Ответ 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 внутри библиотек.