Android Studio: por que minSdkVersion e targetSdkVersion são especificados em AndroidManifest.xml e build.gradle?

103

Acabei de descobrir algo estranho sobre o Android Studio: ele tem algumas opções de configuração no build.gradlearquivo que substituem o que está especificado no AndroidManifest.xmlarquivo.

Por exemplo, eu tinha as seguintes linhas em build.gradle:

android {
    compileSdkVersion 18
    buildToolsVersion "18.1.1"

    defaultConfig {
        minSdkVersion 10
        targetSdkVersion 10
    }
...
}

que estava substituindo a tag correspondente em AndroidManifest.xml:

<uses-sdk
    android:minSdkVersion="8"
    android:targetSdkVersion="8"/>

Eu realmente não gosto de ter as mesmas configurações espalhadas em dois arquivos diferentes, então gostaria de saber se posso removê-lo com segurança de build.gradleou AndroidManifest.xmle onde faz mais sentido mantê-lo.

mariosangiorgio
fonte

Respostas:

111

O Gradle substitui os valores do manifesto e prefiro atualizar o build.gradlearquivo em vez do manifesto. Provavelmente, esta é a maneira certa de usar o Gradle. O Gradle oferece suporte a variações de produto que podem ser controladas por meio de um IDE e essas variações de produto podem mudar muitas coisas em nosso Manifesto, como nome do pacote, código da versão, nome da versão, SDK de destino e muitos outros. Então, com um clique no Android Studio, você pode alterar muitas propriedades e gerar outro apk.

Você pode deixar o manifesto como está e fazer toda a configuração em build.gradle. Você pode remover com segurança

<uses-sdk></uses-sdk>

do manifesto, bem como dos códigos de versão.

mar3kk
fonte
3
Para quem está se perguntando, se você usar o apktool para descompactar um APK construído como este, você não verá o minSdkVersion no AndroidManifest. Não sei para onde vai, mas faz a coisa certa (confirmei enviando para o Google Play)!
Dan J
6
Estranho. Parece que o Google decide o minSDK por qual API nosso aplicativo chama. Embora meu app / build.gradle especifique minSDK como Android 2.2, no Google Play ele diz minSDK = Android 1.6. E sim, o AndroidManifest.xml descompilado não contém informações de minSDK. Acho que isso é um problema, já que nos "força" a também oferecer suporte a dispositivos Android 1.6.
sancho21
1
A barra lateral aqui: developer.android.com/guide/topics/manifest/… sugere que o Play ainda usa o manifesto de alguma forma. Talvez seja reinserido nos bastidores pelo gradle antes da construção do APK?
jordanpg
4
É assim que funciona. O Gradle inserirá informações ausentes para manifestar durante a compilação.
mar3kk
5
@ sancho21 Este é um bug conhecido da Google Play Store durante os testes alfa e beta. Deve resolver quando você pressiona para estimular. Não é uma fonte confiável, mas consulte answers.unity3d.com/questions/683972/…
Tom Lubitz
0

Dos documentos do Android:

Observação: se seu aplicativo definir a versão do aplicativo diretamente no elemento, os valores da versão no arquivo de compilação do Gradle substituirão as configurações no manifesto. Além disso, definir essas configurações nos arquivos de compilação do Gradle permite que você especifique valores diferentes para versões diferentes do seu aplicativo. Para maior flexibilidade e para evitar a possível substituição quando o manifesto for mesclado, você deve remover esses atributos do elemento e definir suas configurações de versão nos arquivos de compilação do Gradle.

https://developer.android.com/studio/publish/versioning.html#appversioning

CONTO
fonte
Acho que essa parte estava falando versionCode . Você deveria ter citado o próximo na Specify API level requirementsseção
Longo dia