Android Studio:为什么要在AndroidManifest.xml和build.gradle中同时指定minSdkVersion和targetSdkVersion?


103

我刚刚发现了一些关于Android Studio的怪异现象:它在build.gradle文件中具有一些配置选项,可以覆盖文件中指定的配置选项AndroidManifest.xml

例如,我在以下几行中build.gradle

android {
    compileSdkVersion 18
    buildToolsVersion "18.1.1"

    defaultConfig {
        minSdkVersion 10
        targetSdkVersion 10
    }
...
}

它覆盖了中的相应标签AndroidManifest.xml

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

我真的不喜欢有两个不同的文件相同的设置蔓延,所以我想知道如果我可以放心地无论是从删除它build.gradleAndroidManifest.xml与它更有意义,保持它。

Answers:


111

Gradle会覆盖清单值,我更喜欢更新build.gradle文件而不是清单。也许这是使用Gradle的正确方法。Gradle支持可以通过IDE进行控制的产品样式,这些产品样式可以更改清单中的许多内容,例如包名称,版本代码,版本名称,目标SDK等。然后在Android Studio中一键单击即可更改许多属性并生成另一个apk。

您可以保留清单,并在中进行所有配置build.gradle。您可以安全地删除

<uses-sdk></uses-sdk>

来自清单以及版本代码。


3
对于任何想知道的人,如果您使用apktool解压缩这样构建的APK,您实际上不会在AndroidManifest中看到minSdkVersion。我不知道它去了哪里,但是它确实做了正确的事(我已上传到Google Play确认了)!
Dan J

6
奇怪。看来Google会通过我们的应用调用的API来决定minSDK。尽管我的app / build.gradle将minSDK指定为Android 2.2,但在Google Play中却说minSDK = Android 1.6。是的,反编译的AndroidManifest.xml不包含minSDK信息。我认为这是一个问题,因为它“迫使”我们也支持Android 1.6设备。
sancho21,2014年

1
此处的侧栏: developer.android.com/guide/topics/manifest/…建议Play仍以某种方式使用清单。也许它是在构建APK之前通过gradle重新插入幕后的?
jordanpg 2014年

4
就是这样。Gradle将在编译过程中插入缺少的信息以进行显示。
mar3kk 2014年

5
@ sancho21这是在Alpha和Beta测试期间Google Play商店的一个已知错误。当您按下产品时,它应该会解决。没有一个权威的来源,但看到answers.unity3d.com/questions/683972/...
汤姆Lubitz

0

从Android文档:

注意:如果您的应用直接在元素中定义应用版本,则Gradle构建文件中的版本值将覆盖清单中的设置。此外,在Gradle构建文件中定义这些设置可让您为应用的不同版本指定不同的值。为了获得更大的灵活性并避免合并清单时可能发生的覆盖,您应该从元素中删除这些属性,并在Gradle构建文件中定义版本设置。

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


我认为那部分是在谈论versionCode 。您应该在本Specify API level requirements节中引用下一篇
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.