Android studio: dlaczego minSdkVersion i targetSdkVersion są określone zarówno w AndroidManifest.xml, jak i build.gradle?

103

Właśnie odkryłem coś dziwnego w Android Studio: ma pewne opcje konfiguracyjne w build.gradlepliku, które zastępują to, co jest określone w AndroidManifest.xmlpliku.

Na przykład miałem następujące wiersze w build.gradle:

android {
    compileSdkVersion 18
    buildToolsVersion "18.1.1"

    defaultConfig {
        minSdkVersion 10
        targetSdkVersion 10
    }
...
}

który przesłaniał odpowiedni tag w AndroidManifest.xml:

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

Naprawdę nie lubię, gdy te same ustawienia są rozmieszczone w dwóch różnych plikach, więc zastanawiam się, czy mogę je bezpiecznie usunąć z build.gradlelub AndroidManifest.xmli gdzie warto je zachować.

mariosangiorgio
źródło

Odpowiedzi:

111

Gradle zastępuje wartości manifestu i wolę aktualizować build.gradleplik, a nie manifest. Prawdopodobnie jest to właściwy sposób korzystania z Gradle. Gradle obsługuje smaki produktów, które można kontrolować za pomocą IDE, a te smaki produktów mogą zmienić wiele rzeczy w naszym Manifeście, takich jak nazwa pakietu, kod wersji, nazwa wersji, docelowy SDK i wiele innych. Następnie jednym kliknięciem w Android Studio możesz zmienić wiele właściwości i wygenerować kolejny apk.

Możesz pozostawić manifest bez zmian i wykonać całą konfigurację w programie build.gradle. Możesz bezpiecznie usunąć

<uses-sdk></uses-sdk>

z manifestu oraz kodów wersji.

mar3kk
źródło
3
Dla każdego, kto się zastanawia, jeśli użyjesz apktool do rozpakowania zbudowanego w ten sposób APK, tak naprawdę nie zobaczysz minSdkVersion w AndroidManifest. Nie wiem, gdzie to idzie, ale działa poprawnie (potwierdziłem, przesyłając do Google Play)!
Dan J,
6
Dziwne. Wygląda na to, że Google decyduje o minSDK po tym, jakie API wywołuje nasza aplikacja. Chociaż moja aplikacja / build.gradle określa minSDK jako Androida 2.2, w Google Play jest napisane, że minSDK = Android 1.6. I tak, zdekompilowany plik AndroidManifest.xml nie zawiera informacji o minSDK. Myślę, że jest to problem, ponieważ „zmusza” nas to również do obsługi urządzeń z Androidem 1.6.
sancho21
1
Pasek boczny tutaj: developer.android.com/guide/topics/manifest/ ... sugeruje, że Play nadal w jakiś sposób używa manifestu. Może jest ponownie wstawiony za kulisami przez gradle przed kompilacją APK?
jordanpg
4
Tak to działa. Gradle wstawi brakujące informacje do manifestacji podczas kompilacji.
mar3kk
5
@ sancho21 To znany błąd występujący w sklepie Google Play podczas testów alfa i beta. Powinien ustąpić, gdy naciskasz, aby szturchnąć. Nie jest to wiarygodne źródło, ale patrz odpowiedzi.unity3d.com/questions/683972/…
Tom Lubitz,
0

Z dokumentacji Androida:

Uwaga: jeśli aplikacja definiuje wersję aplikacji bezpośrednio w elemencie, wartości wersji w pliku kompilacji Gradle zastąpią ustawienia w manifeście. Ponadto zdefiniowanie tych ustawień w plikach kompilacji Gradle umożliwia określenie różnych wartości dla różnych wersji aplikacji. Aby zapewnić większą elastyczność i uniknąć potencjalnego nadpisywania podczas scalania manifestu, należy usunąć te atrybuty z elementu i zamiast tego zdefiniować ustawienia wersji w plikach kompilacji Gradle.

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

OPOWIEŚĆ
źródło
Myślę, że ta część mówiła versionCode . Powinieneś był zacytować następny w Specify API level requirementssekcji
Długi