Android студія: чому minSdkVersion і targetSdkVersion вказані як в AndroidManifest.xml, так і build.gradle?


103

Щойно я виявив щось дивне в студії Android: у 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>

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


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 під час альфа-та бета-тестування. Це має вирішитись, коли ви натискаєте на прод. Не авторитетне джерело, але дивіться відповіді.unity3d.com/ questions/683972/…
Том Любіц,

0

З Документів Android:

Примітка. Якщо ваша програма визначає версію програми безпосередньо в елементі, значення версій у файлі збірки Gradle замінять налаштування в маніфесті. Крім того, визначення цих параметрів у файлах збірки Gradle дозволяє вказувати різні значення для різних версій програми. Для більшої гнучкості та уникнення потенційного перезапису під час об'єднання маніфесту слід видалити ці атрибути з елемента та натомість визначити параметри версії у файлах збірки Gradle.

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


Я думаю, що про цю частину йшлося versionCode . Вам слід було б процитувати наступний у Specify API level requirementsрозділі
Довгий
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.