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

Android studio:为什么在AndroidManifest.xml和build.gradle中都指定了minSdkVersion和targetSdkVersion?,android,android-studio,Android,Android Studio,我刚刚发现了Android studio的一些奇怪之处:它在build.gradle文件中有一些配置选项,可以覆盖AndroidManifest.xml文件中指定的内容 例如,我在build.gradle中有以下几行: android { compileSdkVersion 18 buildToolsVersion "18.1.1" defaultConfig { minSdkVersion 10 targetSdkVersion 10

我刚刚发现了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.gradle
AndroidManifest.xml
中删除,并将其保存在更有意义的位置。

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

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

<uses-sdk></uses-sdk>

来自清单和版本代码。

来自Android文档:

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


如果你想知道,如果你使用apktool解包一个像这样构建的APK,你实际上不会在AndroidManifest中看到minsdk版本。我不知道它去了哪里,但它确实做了正确的事情(我上传到谷歌播放确认)!奇怪。谷歌似乎是根据我们的应用程序调用的API来决定minSDK的。尽管我的app/build.gradle将minSDK指定为Android 2.2,但在Google Play中,它表示minSDK=Android 1.6。是的,反编译的AndroidManifest.xml不包含minSDK信息。我认为这是一个问题,因为它“迫使”我们也支持安卓1.6设备。这里的边栏:表明Play仍然以某种方式使用清单。也许它是在APK构建之前由gradle在幕后重新插入的?这就是它的工作原理。Gradle将在编译过程中插入缺少的信息以显示。@sancho21这是Google Play store在alpha和beta测试期间的已知错误。它应该在你推到prod时解决。这不是一个权威的源代码,但我认为那部分是在谈论
versionCode
。您应该在
指定API级别要求
一节中引用下一个