Android studio: mengapa minSdkVersion dan targetSdkVersion ditentukan di AndroidManifest.xml dan build.gradle?

103

Saya baru saja menemukan sesuatu yang aneh tentang Android studio: ini memiliki beberapa opsi konfigurasi di build.gradlefile yang menimpa apa yang ditentukan di AndroidManifest.xmlfile.

Misalnya, saya memiliki baris berikut di build.gradle:

android {
    compileSdkVersion 18
    buildToolsVersion "18.1.1"

    defaultConfig {
        minSdkVersion 10
        targetSdkVersion 10
    }
...
}

yang menggantikan tag terkait di AndroidManifest.xml:

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

Saya tidak terlalu suka pengaturan yang sama tersebar di dua file yang berbeda, jadi saya bertanya-tanya apakah saya bisa menghapusnya dengan aman baik dari build.gradleatau AndroidManifest.xmldan di mana lebih masuk akal untuk menyimpannya.

mariosangiorgio
sumber

Jawaban:

111

Gradle mengganti nilai manifes, dan saya lebih suka memperbarui build.gradlefile daripada manifesnya . Mungkin ini cara yang benar menggunakan Gradle. Gradle mendukung ragam produk yang dapat dikontrol melalui IDE dan ragam produk tersebut dapat mengubah banyak hal di Manifes kami seperti nama paket, kode versi, nama versi, SDK target, dan banyak lagi lainnya. Kemudian dengan satu klik di Android Studio Anda dapat mengubah banyak properti dan menghasilkan apk lain.

Anda dapat membiarkan manifes apa adanya dan melakukan semua konfigurasi di build.gradle. Anda bisa melepasnya dengan aman

<uses-sdk></uses-sdk>

dari manifes serta kode versi.

mar3kk
sumber
3
Bagi siapa pun yang bertanya-tanya, jika Anda menggunakan apktool untuk membongkar APK yang dibuat seperti ini, Anda tidak akan benar-benar melihat minSdkVersion di AndroidManifest. Saya tidak tahu ke mana perginya, tetapi itu melakukan hal yang benar (saya mengonfirmasi dengan mengunggah ke Google Play)!
Dan J
6
Aneh. Tampaknya Google memutuskan minSDK berdasarkan API yang dipanggil oleh aplikasi kita. Meskipun app / build.gradle saya menetapkan minSDK sebagai Android 2.2, di Google Play disebutkan minSDK = Android 1.6. Dan ya, AndroidManifest.xml yang didekompilasi tidak berisi informasi minSDK. Saya rasa ini adalah masalah, karena "memaksa" kami untuk juga mendukung perangkat Android 1.6.
sancho21
1
Bilah sisi di sini: developer.android.com/guide/topics/manifest/… menunjukkan bahwa Play masih menggunakan manifes. Mungkin itu dimasukkan kembali di belakang layar oleh gradle sebelum APK dibangun?
jordanpg
4
Begitulah cara kerjanya. Gradle akan memasukkan informasi yang hilang ke manifes selama kompilasi.
mar3kk
5
@ sancho21 Ini adalah bug yang diketahui pada Google Play Store selama pengujian alfa dan beta. Ini harus diselesaikan saat Anda mendorong untuk mendorong. Bukan sumber otoritatif, tetapi lihat jawaban.unity3d.com/questions/683972/…
Tom Lubitz
0

Dari dokumen Android:

Catatan: Jika aplikasi Anda menentukan versi aplikasi secara langsung di elemen, nilai versi dalam file build Gradle akan mengganti setelan dalam manifes. Selain itu, menentukan setelan ini dalam file build Gradle memungkinkan Anda menentukan nilai yang berbeda untuk berbagai versi aplikasi Anda. Untuk fleksibilitas yang lebih besar dan untuk menghindari potensi penimpaan saat manifes digabungkan, Anda harus menghapus atribut ini dari elemen dan menentukan setelan versi Anda di file build Gradle.

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

KISAH
sumber
Saya pikir bagian itu sedang dibicarakan versionCode . Anda harus mengutip yang berikutnya dalam Specify API level requirementsbagian
Panjang