如何使用工具:overrideLibrary与多个库

时间:2015-10-02 13:26:57

标签: android android-studio android-gradle

我想创建一个与Android兼容的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 Studio和构建工具。 Android Studio用于构建应用程序的gradle命令是

Gradle tasks [clean, :app:generateDebugSources, :app:generateDebugAndroidTestSources, :app:compileDebugSources, :app:compileDebugAndroidTestSources]

因此可以重现问题,例如与

gradle :app:generateDebugAndroidTestSources :app:compileDebugAndroidTestSources

在工具中指定多个库的正确语法是什么:overrideLibrary?我已经读过逗号和空格是正确的,但它似乎不起作用。我在StackOverflow和其他地方已经阅读了很多关于它的内容,但遗憾的是到目前为止我找不到解决方案(除了评论测试外)。

2 个答案:

答案 0 :(得分:72)

我发现解决方案是创建一个第二个 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”子目录中。

答案 1 :(得分:19)

根据official doc(导入库的合并冲突标记部分),它应该是。

<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中声明的包。

相关问题