Como uso ferramentas: overrideLibrary em um arquivo build.gradle?

295

Estou usando as bibliotecas leanback, que exigem o Android 17 ou posterior. No entanto, meu aplicativo suporta um minSDK de 16, então recebo um erro de construção da gradle dizendo

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

Quando olho para a documentação das ferramentas de construção , vejo como adicionar o overrideLibrarymarcador ao meu manifesto, mas o problema é que estou declarando meu minSdk no meu arquivo gradle em vez de no meu manifesto.

Como uso overrideLibraryquando o minSdk é declarado no build.gradle em vez de no AndroidManifest.xml?

empapar
fonte
Não faça isso. Em vez minSdkVersion atualização no build.gradle
Dr. Deo
4
Há razões legítimas para fazer isso, como usar uma biblioteca condicionalmente testando o nível da API antes de usá-la.
Guillaume Perrot

Respostas:

568

Abra o Android Studio -> Abrir arquivo de manifesto

adicionar <uses-sdk tools:overrideLibrary="android.support.v17.leanback"/> , não esqueça de incluir xmlns:tools="http://schemas.android.com/tools"também, antes da <application>tag

insira a descrição da imagem aqui

xDragonZ
fonte
no meu casotools:overrideLibrary="info.hoang8f.fbutton"
shareef
13
Cuidado com as bibliotecas incluídas que contêm <uses-sdk tools:ignore="GradleOverrides">. Isso fará com que seu tools:overrideLibraryatributo seja ignorado. Veja stackoverflow.com/questions/31062893/…
Theo
1
Meu problema ainda existe após a adição de ferramentas: overrideLibray = "ca.barrenechea.widget.recyclerview.decoration". Ele estava funcionando, mas de repente parou de funcionar hoje após a criação de uma nova atividade.
arjunkn
você salvou o meu dia (y)
KunalK
@arjunkn: add <ferramentas-usos-sdk: overrideLibray = "ca.barrenechea.widget.recyclerview.decoration" />, Se não estiver funcionando, verifique se o espaço de nomes de suas ferramentas está correto ou se o espaço de nomes correto é xmlns: tools = " schemas. android.com/tools "
NIPHIN 04/04
170

não importa que você declare seu minSdk em build.gradle. Você deve copiar o overrideLibraryseu AndroidManifest.xml, conforme documentado aqui .

<manifest 
    ... >
<uses-sdk tools:overrideLibrary="com.example.lib1, com.example.lib2"/>
    ...
</manifest>

O sistema ignora automaticamente a sdkVersion declarada no AndroidManifest.xml.

Espero que isso resolva seu problema.

icastell
fonte
1
Você precisa especificar alguma versão no uses-sdk? Ele parece confuso para especificar as versões em AndroidManifest que está indo só para ser ignorado
emmby
1
Você está certo. Não é necessário. De qualquer forma, se você o definir no gradiente AndroidManifest o ignorará no momento da compilação.
icastell
13
+1 para exibir duas bibliotecas no exemplo. Você não pode usar duas tags uses-sdk separadas. portanto, se você deseja substituir dois ou mais, pode colocar vírgula no meio. Obrigado!!
Hitesh Chavda
1
mas isso não funcionou para eu usar duas bibliotecas separadas por vírgula, algum problema com minha biblioteca?
Zia Ur Rahman
7
<manifest xmlns:tools="http://schemas.android.com/tools" ... >
  <uses-sdk tools:overrideLibrary="nl.innovalor.ocr, nl.innovalor.corelib" />

Eu estava enfrentando a questão do conflito entre diferentes versões mín sdk. Portanto, esta solução funcionou para mim.

Kuldeep Saxena
fonte
1

Conforme a biblioteca exigir minSdkVersion 17, você poderá alterar o mesmo no build.gradlearquivo (Módulo: Aplicativo):

defaultConfig {
        minSdkVersion 17 
        targetSdkVersion 25
}

e depois disso, o projeto não deve gerar nenhum erro de compilação.

Arpit Namdev
fonte
4
Embora isso funcione, na verdade não responde à pergunta. O OP pergunta como overrideLibrary é usada. E há casos específicos em que você gostaria de substituí-lo, em vez de cumprir (como é bom para substituí-lo)
Zoe
1

Eu só mudou minSdkVersion="7"em C:\MyApp\platforms\android\CordovaLib\AndroidManifest.xmle funcionou.

Passos:

  1. Caminho: C:\MyApp\platforms\android\CordovaLib\AndroidManifest.xml
  2. Valor: <uses-sdk android:minSdkVersion="7"/>
  3. Comando Ran no novo prompt do cmd:

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

Manjunath Mruthyunjaya
fonte
1
Isso não responde à pergunta, que é como usar overrideLibraryquando o minSdk é declarado em build.gradle.
Larsh
1

acabou de mudar apenas android: minSdkVersion = "16" e funciona perfeitamente C: \ MyApp \ plataformas \ android \ CordovaLib \ AndroidManifest.xml

BIRJA KUMAR
fonte
0

use esse código no manifest.xml

<uses-sdk
android:minSdkVersion="16"
android:maxSdkVersion="17"
tools:overrideLibrary="x"/>
Ali Bagheri
fonte
0

Como soulution para todas as bibliotecas, podemos combinar a versão sdk delas, para que nenhum evento inesperado possa acontecer

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'
        }
    }
} 
}

Remova as bibliotecas que você não usa no seu projeto (gms) e verifique se a versão sdk corresponde aos dados gradle no nível do aplicativo

Mohammad f
fonte