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"/>

同じ設定を2つの異なるファイルに分散させたくないので、安全に削除できるのbuild.gradleAndroidManifest.xml、どこに保存しておくのが適切かを考えています。

回答:


111

Gradleはマニフェストの値を上書きするため、マニフェストbuild.gradleではなくファイルを更新することを好みます。おそらくこれはGradleを使用する正しい方法です。GradleはIDEを介して制御できる製品フレーバーをサポートしており、それらの製品フレーバーは、パッケージ名、バージョンコード、バージョン名、ターゲットSDKなど、マニフェストの多くの変更を行うことができます。次に、Android Studioでワンクリックすることで、多くのプロパティを変更し、別のAPKを生成できます。

マニフェストはそのままにして、すべての構成をで行うことができますbuild.gradle。安全に削除できます

<uses-sdk></uses-sdk>

マニフェストとバージョンコードから。


3
不思議に思う人のために、apktoolを使用してこのように構築されたAPKを解凍すると、実際にはAndroidManifestにminSdkVersionが表示されません。どこに行くのかはわかりませんが、正しいことを行っています(Google Playにアップロードして確認しました)。
Dan J

6
奇妙な。Googleはアプリが呼び出すAPIによってminSDKを決定しているようです。私のapp / build.gradleはminSDKをAndroid 2.2と指定していますが、Google PlayではminSDK = Android 1.6と表示されています。そして、はい、逆コンパイルされたAndroidManifest.xmlにはminSDK情報が含まれていません。Android 1.6デバイスもサポートする必要があるため、これは問題だと思います。
sancho21 2014年

1
ここのサイドバー: developer.android.com/guide/topics/manifest/…は、Playがマニフェストをまだ何らかの形で使用していることを示唆しています。多分それはAPKビルドの前にgradleによって舞台裏で再挿入されましたか?
jordanpg 2014

4
それがどのように機能するかです。Gradleは、コンパイル中に不足している情報を挿入して表示します。
mar3kk 2014

5
@ sancho21これは、アルファおよびベータテスト中のGoogle Playストアの既知のバグです。本番環境に移行すると解決するはずです。信頼できるソースではありませんが、answers.unity3d.com
questions / 683972 /…を

0

Androidドキュメントから:

注:アプリがアプリのバージョンを要素で直接定義している場合、Gradleビルドファイルのバージョン値はマニフェストの設定をオーバーライドします。さらに、Gradleビルドファイルでこれらの設定を定義すると、アプリのバージョンごとに異なる値を指定できます。柔軟性を高め、マニフェストをマージするときに上書きされる可能性を回避するには、要素からこれらの属性を削除し、代わりにGradleビルドファイルでバージョン設定を定義する必要があります。

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


その部分について話していたと思いますversionCode 。あなたはSpecify API level requirementsセクションの次のものを引用するべき
ロング
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.