Студия Android: почему minSdkVersion и targetSdkVersion указаны как в AndroidManifest.xml, так и в build.gradle?

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.gradleлибо, AndroidManifest.xmlи где имеет смысл их хранить.

Мариосангиоржио
источник

Ответы:

111

Gradle переопределяет значения манифеста, и я предпочитаю обновлять build.gradleфайл, а не манифест. Наверное, это правильный способ использования Gradle. Gradle поддерживает разновидности продуктов, которыми можно управлять через IDE, и эти разновидности продуктов могут изменить многие вещи в нашем манифесте, такие как имя пакета, код версии, название версии, целевой SDK и многое другое. Затем одним щелчком мыши в Android Studio вы можете изменить многие свойства и сгенерировать другой apk.

Вы можете оставить манифест как есть и выполнить всю настройку в build.gradle. Вы можете безопасно удалить

<uses-sdk></uses-sdk>

из манифеста, а также из кодов версий.

mar3kk
источник
3
Кому-нибудь интересно, если вы используете apktool для распаковки APK, созданного таким образом, вы фактически не увидите minSdkVersion в AndroidManifest. Я не знаю, куда он идет, но он действительно работает правильно (я подтвердил, загрузив в Google Play)!
Dan J
6
Странный. Похоже, Google определяет minSDK по тому, какой API вызывает наше приложение. Несмотря на то, что мое приложение / build.gradle указывает minSDK на Android 2.2, в Google Play указано, что minSDK = Android 1.6. И да, декомпилированный файл AndroidManifest.xml не содержит информации minSDK. Я считаю, что это проблема, так как это «заставляет» нас также поддерживать устройства Android 1.6.
sancho21
1
Боковая панель здесь: developer.android.com/guide/topics/manifest/… предполагает, что Play каким-то образом использует манифест. Может быть, он повторно вставлен за кулисами с помощью gradle до сборки APK?
jordanpg
4
Вот как это работает. Gradle вставит недостающую информацию в манифест во время компиляции.
mar3kk
5
@ sancho21 Это известная ошибка магазина Google Play во время альфа- и бета-тестирования. Он должен разрешиться, когда вы нажимаете на prod. Не авторитетный источник, но см. Answer.unity3d.com/questions/683972/…
Tom Lubitz
0

Из документов Android:

Примечание. Если ваше приложение определяет версию приложения непосредственно в элементе, значения версии в файле сборки Gradle переопределят настройки в манифесте. Кроме того, определение этих параметров в файлах сборки Gradle позволяет вам указывать разные значения для разных версий вашего приложения. Для большей гибкости и во избежание возможной перезаписи при слиянии манифеста вы должны удалить эти атрибуты из элемента и вместо этого определить настройки своей версии в файлах сборки Gradle.

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

СКАЗКА
источник
1
Я думаю, что в этой части говорилось versionCode . Вы должны были процитировать следующий в Specify API level requirementsразделе
Длинный