如何在build.gradle文件中使用tools:overrideLibrary工具?

364

我正在使用leanback库,它要求Android 17或更高版本。但是我的应用程序支持最低SDK版本为16,因此我会从gradle中得到一个构建错误。

Error:Execution failed for task ':Tasks:processPhoneDebugManifest'.
> Manifest merger failed : uses-sdk:minSdkVersion 16 cannot be smaller than version 17 declared in library /Users/mike/Projects/android-for-dummies-v3/Tasks/build/intermediates/exploded-aar/com.android.support/leanback-v17/21.0.2/AndroidManifest.xml
    Suggestion: use tools:overrideLibrary="android.support.v17.leanback" to force usage

当我查看构建工具文档时,我看到如何将overrideLibrary标记添加到我的清单中,但问题是我在gradle文件中声明了我的minSdk而不是在清单中声明。
当minSdk在build.gradle中声明而不是在AndroidManifest.xml中声明时,我该如何使用overrideLibrary

不要这样做。相反,在 build.gradle 中更新 minsdkversion。 - Dr Deo
8
有合理的理由这样做,例如在使用某个库之前测试 API 级别以进行条件性使用。 - Guillaume Perrot
对于那些不知道overrideLibrary是什么的人,“当较低优先级的清单具有更高的minSdkVersion值时,除非应用overrideLibrary合并规则,否则会出现错误。”来源。实际上,这个overrideLibrary只是移除警告,它不会改变其他任何内容。 - Ben Butterworth
9个回答

686

打开Android Studio -> 打开Manifest文件

添加 <uses-sdk tools:overrideLibrary="android.support.v17.leanback"/>,不要忘记在<application>标签之前包含xmlns:tools="http://schemas.android.com/tools"

输入图像描述


在我的情况下 tools:overrideLibrary="info.hoang8f.fbutton" - shareef
18
注意那些包含 <uses-sdk tools:ignore="GradleOverrides"> 的库,它们会导致你的 tools:overrideLibrary 属性被忽略。请参考 https://dev59.com/gYzda4cB1Zd3GeqPlmCS - Theo
1
在添加了tools:overrideLibrary="ca.barrenechea.widget.recyclerview.decoration"之后,我的问题仍然存在。它之前是可以工作的,但今天在创建新活动后突然停止工作了。 - arjunkn
@arjunkn:添加<uses-sdk tools:overrideLibray="ca.barrenechea.widget.recyclerview.decoration"/>,如果不起作用,请检查您的工具命名空间是否正确。正确的命名空间是xmlns:tools="http://schemas.android.com/tools"。 - NIPHIN
2
如果我想要更多的东西,超过覆盖库怎么办? - Mostafa Anssary

225

在 build.gradle 中声明你的 minSdk 版本并不重要。你必须按照这里所述,在 AndroidManifest.xml 中复制 overrideLibrary

<manifest 
    ... >
<uses-sdk tools:overrideLibrary="com.example.lib1, com.example.lib2"/>
    ...
</manifest>
系统会自动忽略在AndroidManifest.xml中声明的sdkVersion版本号。
希望这能解决你的问题。

1
在 uses-sdk 中必须指定任何版本吗?在 AndroidManifest 中指定将被忽略的版本似乎很令人困惑。 - emmby
1
你是对的。不过即使你在AndroidManifest中设置了它,gradle在编译时也会忽略它。 - icastell
21
在示例中显示两个库,给你一个赞。你不能使用两个独立的uses-sdk标签,所以如果您想要覆盖两个或更多个版本,可以在它们之间加上逗号。谢谢! - Hitesh Chavda
2
但是对我来说,使用逗号分隔的两个库并不起作用,我的库有什么问题吗? - Zia Ur Rahman

20
<manifest xmlns:tools="http://schemas.android.com/tools" ... >
  <uses-sdk tools:overrideLibrary="nl.innovalor.ocr, nl.innovalor.corelib" />

我遇到了不同min sdk版本之间的冲突问题,这个解决方案对我有效。


3

只更改了android:minSdkVersion="16",就可以完美运行。 C:\MyApp\platforms\android\CordovaLib\AndroidManifest.xml


1
在manifest.xml中使用这段代码。
<uses-sdk
android:minSdkVersion="16"
android:maxSdkVersion="17"
tools:overrideLibrary="x"/>

0

那对我有效

<uses-sdk 
    android:minSdkVersion="16"
    android:maxSdkVersion="17"
    tools:overrideLibrary="pl.droidsonroids.gif" />
      


   

0

我刚刚在C:\MyApp\platforms\android\CordovaLib\AndroidManifest.xml中更改了minSdkVersion="7",然后它就可以工作了。

步骤:

  1. 路径:C:\MyApp\platforms\android\CordovaLib\AndroidManifest.xml
  2. 值:<uses-sdk android:minSdkVersion="7"/>
  3. 在新的cmd提示符中运行命令:

    C:\MyApp>phonegap build android --debug [phonegap] executing 'cordova build android --debug'... [phonegap] completed 'cordova build android --debug'


1
这并没有回答问题,即如何在 build.gradle 中声明 minSdk 时使用 overrideLibrary - LarsH

0
作为所有库的解决方案,我们可以匹配它们的SDK版本,以避免发生意外事件。
subprojects { 
afterEvaluate {project -> 
    if (project.hasProperty("android")) { 
        android { 
            compileSdkVersion 28 
            buildToolsVersion '28.0.3'
            defaultConfig {
                //It's kinda tricking android studio but anyway it works
                minSdkVersion 17
            }
        } 
    } 
    if (project.hasProperty("dependencies")) {
        dependencies {
            implementation 'com.android.support:support-core-utils:28.0.0'
            implementation 'com.android.support:appcompat-v7:28.0.0'
            implementation 'com.google.android.gms:play-services-base:16.1.0'
        }
    }
} 
}

从你的项目中移除不使用的库(例如 gms),并确保 SDK 版本与你应用级别的 Gradle 数据匹配


-1

因为库需要 minSdkVersion 17 ,所以你可以在 build.gradle(模块:应用程序)文件中更改相同的内容:

defaultConfig {
        minSdkVersion 17 
        targetSdkVersion 25
}

然后构建项目时不应抛出任何构建错误。


4
虽然这个方法能够起作用,但其实并没有回答问题。原帖的提问是如何使用 overrideLibrary,而且还有一些特定情况下你可能想要覆盖它而不是遵从它(因为覆盖它是可以接受的)。 - Zoe stands with Ukraine

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接