【问题标题】:How to use tools:overrideLibrary with multiple libraries如何使用工具:overrideLibrary 与多个库
【发布时间】:2015-10-02 13:26:56
【问题描述】:

我想创建一个兼容的 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

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

【问题讨论】:

    标签: android android-studio android-gradle-plugin


    【解决方案1】:

    我发现解决方案是创建一个 second 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”子目录中的测试源。

    【讨论】:

    • 谢谢,它有效!谷歌懒得记录这个问题真是太愚蠢了……
    • 设置像androidTest { setRoot('src/main/androidTest/') java.srcDirs = ['src/main/androidTest/java/'] }这样的gradle文件让这一切都为我工作。
    • @ericharlow 正在尝试使用您的解决方案,但在我的 app.gradle 中出现错误 未找到 Gradle DSL 方法:'androidTest()' 我已尝试使用 @987654324 @ 但当我同步时仍然得到同样的错误。我该如何解决这个问题?
    • 我的猜测是您将 androidTest{} 放在 build.gradle 的错误位置。它需要嵌套在您的android{ sourceSets{androidTest{}}}
    • @ericharlow 你是对的。我从来不知道它应该在那里。它终于奏效了。为那个老板点赞。
    【解决方案2】:

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

    【讨论】:

    • 是的,我已经阅读了这些文档,并且我现在尝试添加 minSdkVersion 和 targetSdkVersion 但这并没有什么区别 :-( 另外,这些值无论如何都是从 build.gradle 中获取的。据我所见,我已经完全按照您的示例以及我在 StackOverflow 上找到的另一个示例。我无法找出问题所在。这是一个空项目,我只添加了测试库依赖项。
    • @Dominique 它不能解决你的问题,但如果它是一个新项目,你为什么要使用 minSdk=4。使用 minSdk=8 您将覆盖 100% 的当前 android 发行版。 developer.android.com/intl/ru/about/dashboards/index.html
    • minSdk=8 没有帮助,因为库“android.support.test.uiautomator.v18”需要 minSdk=18。此外,实际项目不是一个新项目。但是为了确保存在真正的问题,我用一个新的空项目重现了这个问题。我可以通过将四个 androidTestCompile 依赖行添加到 minSdk=7 或 minSdk=8 的新 Android Studio 项目来重现它。
    • @Dominique 你设法解决了这个问题吗?我也在实现 uiAutomator 并遇到同样的问题。 tools:overrideLibrary 似乎没有被 android studio 采纳。
    • @Mixx 我已经找到原因和解决方法了,请看下面我的回答。
    猜你喜欢
    • 2020-04-19
    • 1970-01-01
    • 2016-07-31
    • 1970-01-01
    • 1970-01-01
    • 2019-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多