Android Studio。これは私の現在のプロジェクト構造です。私のフレーバーの2つの異なるマニフェストファイルの定義に問題があります。
free
フレーバーのAndroidManifest.xml
は次のようになります。
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:Android="http://schemas.Android.com/apk/res/Android"
package="se.example.package">
<uses-permission Android:name="Android.permission.INTERNET" />
<uses-permission Android:name="Android.permission.ACCESS_NETWORK_STATE" />
<uses-permission Android:name="Android.permission.ACCESS_WIFI_STATE" />
</manifest>
main
フレーバーのAndroidManifest.xml
には使用許可はありませんが、すべてのフレーバーで共有されるマニフェストコードの残りが含まれています。
pro
フレーバーのAndroidManifest.xml
は次のようになります。
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:Android="http://schemas.Android.com/apk/res/Android"
package="se.example.package">
<uses-permission Android:name="com.Android.vending.CHECK_LICENSE" />
</manifest>
build.gradleは、次のような2つのフレーバーを定義します
productFlavors {
free {
applicationId 'se.example.package.free'
minSdkVersion 14
targetSdkVersion 21
versionCode 1
versionName '1.0'
}
pro {
minSdkVersion 14
applicationId 'se.example.package.pro'
targetSdkVersion 21
versionCode 2
versionName '1.1'
}
}
私が期待している結果は、異なるフレーバーが異なる使用許可を定義することです。 これは当てはまりません。現在、両方のフレーバーは、プロフレーバーの<uses-permission Android:name="com.Android.vending.CHECK_LICENSE" />
で定義されているAndroidManifest.xml
のみを定義しています。
私が試してみました:
しかし、成功せず。どうすれば修正できますか?どんな助けも大歓迎です。
編集1
各フレーバーAndroidManifest.xml
ファイルの場所をres
フォルダーのそれぞれからfree
およびpro
フォルダーに変更しました。この結果:
AndroidManifest.xml
ファイル、ライセンス、ネットワークの両方のアクセス許可が表示されます(ネットワークのみ)これはプロジェクト構造の問題のように感じます。これをどうするか?
編集2
Commonswareが示唆したように、マージレポートを引き出しました。これらはuses-permissions
に関するレポートです
自由:
uses-permission#com.Android.vending.CHECK_LICENSE
ADDED from qwknoteGIT:licencing-library:unspecified:26:5
Android:name
ADDED from qwknoteGIT:licencing-library:unspecified:26:22
プロ:
uses-permission#com.Android.vending.CHECK_LICENSE
MERGED from qwknoteGIT:licencing-library:unspecified:26:5
技術の背景:
このリンクでは、マニフェストのマージに使用できるテクニックとパラメーターについて説明しています: http://tools.Android.com/tech-docs/new-build-system/user-guide/manifest-merger#TOC -tools:node-markers
具体的には、tools:node
マニフェストの特定のXMLノードがマージ中にどのように動作するかを示します。
解決策:
他のマニフェストと別のマニフェストでいくつかの許可を得るには、必要なすべてのアクセス許可をmain
に追加し、フレーバーマニフェストで不要なものを削除します(以下の例のように)。
free
checkライセンスを削除します
<uses-permission
Android:name="com.Android.vending.CHECK_LICENSE"
tools:node="remove"/>
あなたの問題は、あなたのフレーバーではなく、ライブラリに起因しています。具体的には、qwknoteGIT:licencing-library
がリクエストしていますCHECK_LICENSE
。
すべてのフレーバーでそのライブラリを使用していない場合、フレーバー付きcompile
ステートメント(たとえば、proCompile
)を使用して、そのフレーバーでのみそのライブラリを使用します。
すべてのフレーバーにライブラリを使用しているが、1つのフレーバーで許可が必要ないと確信している場合は、_tools:node
属性をフレーバーのマニフェストで使用して、ライブラリが提供する許可をブロックできます。
そして、マニフェスト合併報告書はあなたの友人です。 :-)
これで少なくとも問題は解決するはずです。各バリアントに使用する正確なマニフェストを指定するのに役立ちます。乾杯!各バリアントフォルダーの下のマニフェストファイルに明示的に指示します。
Android {
productFlavors {
prod {
manifest.srcFile "prod/AndroidManifest.xml"
}
dev {
manifest.srcFile "dev/AndroidManifest.xml"
}
}
...
}
コードを変更する必要があります。
<manifest xmlns:Android="http://schemas.Android.com/apk/res/Android"
package="se.example.package">
ために:
<manifest xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:tools="http://schemas.Android.com/tools"
package="com.your.appid">
アプリのbuild.gradleで、sourceSetsの下にマニフェストのみを指定します。
Android {
productFlavors {
bizdartFlavourNoCallLog {
minSdkVersion 16
applicationIdSuffix '.bizdart'
targetSdkVersion 26
dimension "tier"
sourceSets {
main {
manifest.srcFile "src/bizdartFlavourNoCallLog/AndroidManifest.xml"
}
}
copy {
from 'src/bizdartFlavourNoCallLog/'
include '*.json'
into '.'
}
}
}
}