Android studio: Tại sao minSdkVersion và targetSdkVersion được chỉ định cả trong AndroidManifest.xml và build.gradle?


103

Tôi vừa phát hiện ra điều kỳ lạ về Android studio: nó có một số tùy chọn cấu hình trong build.gradletệp ghi đè lên những gì được chỉ định trong AndroidManifest.xmltệp.

Ví dụ, tôi có những dòng sau trong build.gradle:

android {
    compileSdkVersion 18
    buildToolsVersion "18.1.1"

    defaultConfig {
        minSdkVersion 10
        targetSdkVersion 10
    }
...
}

đã ghi đè thẻ tương ứng trong AndroidManifest.xml:

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

Tôi thực sự không thích có các cài đặt giống nhau trải rộng trong hai tệp khác nhau, vì vậy tôi đang tự hỏi liệu tôi có thể xóa nó một cách an toàn từ build.gradlehay AndroidManifest.xmlvà ở đâu sẽ hợp lý hơn nếu giữ nó.

Câu trả lời:


111

Gradle ghi đè các giá trị tệp kê khai và tôi muốn cập nhật build.gradletệp hơn là tệp kê khai. Có lẽ đây là cách sử dụng Gradle đúng đắn. Gradle hỗ trợ hương vị sản phẩm có thể được kiểm soát thông qua IDE và những hương vị sản phẩm đó có thể thay đổi nhiều thứ trong Tệp kê khai của chúng tôi như tên gói, mã phiên bản, tên phiên bản, SDK mục tiêu và nhiều thứ khác. Sau đó, bằng một cú nhấp chuột trong Android Studio, bạn có thể thay đổi nhiều thuộc tính và tạo một apk khác.

Bạn có thể để nguyên tệp kê khai và thực hiện tất cả các cấu hình trong build.gradle. Bạn có thể loại bỏ một cách an toàn

<uses-sdk></uses-sdk>

từ tệp kê khai cũng như mã phiên bản.


3
Đối với bất kỳ ai thắc mắc, nếu bạn sử dụng apktool để giải nén một APK được xây dựng như thế này, bạn sẽ không thực sự thấy minSdkVersion trong AndroidManifest. Tôi không biết nó đi đâu, nhưng nó làm đúng như vậy (tôi đã xác nhận bằng cách tải lên Google Play)!
Dan J

6
Thật kỳ lạ. Có vẻ như Google quyết định minSDK bằng API mà ứng dụng của chúng tôi gọi. Sự kiện mặc dù app / build.gradle của tôi chỉ định minSDK là Android 2.2, trong Google Play, nó cho biết minSDK = Android 1.6. Và có, AndroidManifest.xml được dịch ngược không chứa thông tin minSDK. Tôi nghĩ đây là một vấn đề, vì nó "buộc" chúng tôi cũng phải hỗ trợ các thiết bị Android 1.6.
sancho21

1
Thanh bên ở đây: developer.android.com/guide/topics/manifest/… gợi ý rằng Play vẫn sử dụng tệp kê khai bằng cách nào đó. Có thể nó được lắp lại đằng sau hậu trường bằng gradle trước khi xây dựng APK?
jordanpg

4
Đó là cách nó hoạt động. Gradle sẽ chèn thông tin còn thiếu vào tệp kê khai trong quá trình biên dịch.
mar3kk

5
@ sancho21 Đây là một lỗi đã biết với cửa hàng Google Play trong quá trình thử nghiệm alpha và beta. Nó sẽ giải quyết khi bạn đẩy đến sản phẩm. Không phải là một nguồn có thẩm quyền, nhưng thấy answers.unity3d.com/questions/683972/...
Tom Lubitz

0

Từ tài liệu Android:

Lưu ý: Nếu ứng dụng của bạn xác định phiên bản ứng dụng trực tiếp trong phần tử, thì giá trị phiên bản trong tệp bản dựng Gradle sẽ ghi đè cài đặt trong tệp kê khai. Ngoài ra, việc xác định các cài đặt này trong tệp bản dựng Gradle cho phép bạn chỉ định các giá trị khác nhau cho các phiên bản ứng dụng khác nhau của mình. Để linh hoạt hơn và tránh khả năng bị ghi đè khi tệp kê khai được hợp nhất, bạn nên xóa các thuộc tính này khỏi phần tử và xác định cài đặt phiên bản của bạn trong tệp bản dựng Gradle.

https://developer.android.com/studio/publish/versaction.html#appversinstall


Tôi nghĩ rằng phần đó đã được nói về versionCode . Bạn nên trích dẫn câu tiếp theo trong Specify API level requirementsphần
Dài
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.