我在Android Studio中为我的风格定义了两个不同的清单文件时遇到了问题。这是我目前的项目结构:
AndroidManifest.xml
风格中的free
如下所示:
<?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>
AndroidManifest.xml
风格中的main
没有使用权限,但包含所有风格之间共享的其余清单代码。
AndroidManifest.xml
风格中的pro
如下所示:
<?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定义了两种风格,如
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
文件夹中每个flavor 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
答案 0 :(得分:48)
技术背景:
在此链接上,它解释了可用于清单合并的技术和参数:http://tools.android.com/tech-docs/new-build-system/user-guide/manifest-merger#TOC-tools:node-markers
具体的一个是tools:node
,它指出清单上某些XML节点在合并时应该如何表现。
<强>解决方案:强>
要在其他清单中实现一个不同的权限,请在main
中添加所需的所有权限,并在flavor清单中删除不需要的权限,如下例所示:
free
删除支票许可证
<uses-permission
android:name="com.android.vending.CHECK_LICENSE"
tools:node="remove"/>
答案 1 :(得分:21)
你的问题来自图书馆,而不是你的口味。具体而言,qwknoteGIT:licencing-library
正在请求CHECK_LICENSE
。
如果您没有在所有版本中使用该库,请使用一种风味compile
语句(例如proCompile
)仅使用该库中的库。
如果您正在使用该库来获取所有风格,但您确信您不需要一种风格的权限,那么可以在风格清单中使用tools:node
属性来阻止该权限由图书馆提供。
清单合并报告是你的朋友。 : - )
答案 2 :(得分:3)
这应该至少可以解决问题。我发现在指定每个变体使用的确切清单时很有用。干杯!它明确指向每个变体文件夹下的清单文件。
$http.get.done
答案 3 :(得分:1)
您应该更改代码:
<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">
答案 4 :(得分:0)
在您的App 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 '.'
}
}
}
}
答案 5 :(得分:0)
参见https://developer.android.com/studio/build/manifest-merge及其参数 tools:node =“ merge”
高优先级清单(免费):
<activity android:name="com.example.ActivityOne"
android:screenOrientation="portrait"
tools:node="merge">
</activity>
低优先级清单(主要):
<activity android:name="com.example.ActivityOne"
android:windowSoftInputMode="stateUnchanged">
<intent-filter>
<action android:name="android.intent.action.SEND" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
合并清单结果:
<activity android:name="com.example.ActivityOne"
android:screenOrientation="portrait"
android:windowSoftInputMode="stateUnchanged">
<intent-filter>
<action android:name="android.intent.action.SEND" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
答案 6 :(得分:0)
我遇到了同样的问题,我发现这是因为我在lib项目下放置了“ pro”和“ tree”风味文件夹,而在我将app风味文件夹移至app项目下后,问题得以解决