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

108

我刚刚发现了关于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中删除它,并且更合理的是将其保留在哪里。

2个回答

117

Gradle覆盖了清单文件中的值,我更喜欢更新build.gradle文件而不是清单文件。可能这是使用Gradle的正确方式。Gradle支持产品风味(product flavours),可以通过IDE进行控制,这些产品风味可以改变我们清单文件中的许多内容,例如包名、版本代码、版本名称、目标SDK等等。然后,在Android Studio中单击一下,您就可以更改许多属性并生成另一个apk。

您可以将清单文件保留为原样,并在build.gradle中执行所有配置。您可以放心地删除

<uses-sdk></uses-sdk>

来自清单文件以及版本代码。


3
如果有人想知道,如果您使用apktool来解压像这样构建的APK,您实际上不会在AndroidManifest中看到minSdkVersion。我不知道它去了哪里,但它确实做了正确的事情(我通过上传到Google Play进行了确认)! - Dan J
6
奇怪。似乎谷歌根据我们的应用调用哪个API来决定minSDK。尽管我的app/build.gradle指定了minSDK为Android 2.2,在Google Play上却显示minSDK = Android 1.6。是的,反编译的AndroidManifest.xml中没有minSDK信息。我认为这是一个问题,因为它“强制”我们也支持Android 1.6设备。 - sancho21
1
这里的侧边栏:http://developer.android.com/guide/topics/manifest/uses-sdk-element.html 表明Play仍然以某种方式使用清单。也许在APK构建之前,gradle会在幕后重新插入它? - jordanpg
4
Gradle会在编译期间向清单文件中插入缺失的信息,这就是它的工作原理。 - mar3kk
5
这是Google Play商店在alpha和beta测试期间已知的一个bug。当你推送到生产环境时,它应该得到解决。虽然不是权威来源,但可以参考http://answers.unity3d.com/questions/683972/published-unity-android-app-has-lower-android-vers.html。 - Tom Lubitz
显示剩余2条评论

1

来自Android文档:

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

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


1
我认为那部分是在谈论 versionCode。你应该引用下一部分在 指定 API 级别要求 部分中。 - Long

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