Android Studio 两种具有不同清单文件的风格
Posted
技术标签:
【中文标题】Android Studio 两种具有不同清单文件的风格【英文标题】:Android Studio two flavors with different manifest files 【发布时间】:2015-04-13 05:26:09 【问题描述】:我在 android Studio 中为我的风格定义两个不同的清单文件时遇到问题。这是我目前的项目结构:
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 定义了两种风格,如
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
中定义的那样。
我试过了:
清理项目 重建项目 重启 Android Studio 同步分级但没有成功。我该如何解决这个问题?任何帮助表示赞赏。
编辑 1
我将每个风味 AndroidManifest.xml
文件的位置从每个 res
文件夹更改为 free
和 pro
文件夹。结果:
-
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
【问题讨论】:
我不确定你必须使用哪个(你这是评论,而不是答案),但你可能可以通过使用tools:node
声明 @987654321 得到你想要的@
"目前的结果是,这两种风格都只定义了 pro 风格中 AndroidManifest.xml 中定义的 app/build/output/apk/
中的清单合并报告,看看他们告诉你什么。
您的问题来自图书馆,而不是您的口味。具体来说,qwknoteGIT:licencing-library
正在请求CHECK_LICENSE
。如果您没有在所有风格中使用该库,请使用风格化的compile
语句(例如,proCompile
)以仅在该风格中使用该库。
【参考方案1】:
技术背景:
在此链接上,它解释了可用于清单合并的技术和参数:https://developer.android.com/studio/build/manage-manifests#merge_rule_markers
一个具体的例子是tools:node
,它指出清单上的某些 XML 节点在合并时应该如何表现。
解决方案:
要在一个清单中实现某些权限并在其他清单中实现不同,请将您需要的所有权限添加到 main
并在风味清单中删除您不需要的权限,如下例所示:
free
删除检查许可证
<uses-permission
android:name="com.android.vending.CHECK_LICENSE"
tools:node="remove"/>
【讨论】:
只有一个问题,而不是将其添加到主清单并从“免费”版本中删除,为什么我们不能将android:name="com.android.vending.CHECK_LICENSE"
添加到单个“专业”版本清单中【参考方案2】:
您的问题来自图书馆,而不是您的口味。具体来说,qwknoteGIT:licencing-library
正在请求CHECK_LICENSE
。
如果您没有在所有风格中使用该库,请使用风格化的compile
语句(例如,proCompile
)以仅在该风格中使用该库。
如果您将库用于所有风味,但确信您不需要某个风味的权限,则可以在风味的清单中使用tools:node
属性来阻止由图书馆。
清单合并报告是您的朋友。 :-)
【讨论】:
非常感谢您的努力,虽然我不能接受两个答案,但您提供了一个很好的解释和一个可行的解决方案。 +1 @Marcus 您可以更改已接受的答案。我认为这个答案应该被接受。【参考方案3】:这至少应该可以解决问题。我发现它在指定用于每个变体的确切清单时很有用。干杯!它明确指向每个变体文件夹下的清单文件。
android
productFlavors
prod
manifest.srcFile "prod/AndroidManifest.xml"
dev
manifest.srcFile "dev/AndroidManifest.xml"
...
【讨论】:
不需要指定AndroidManifest.xml
文件的路径,gradle 本身会从风味文件夹中获取它们,除非您更改了它们的默认路径(我不推荐)。
有用但是当仍然有一个 maven 风格的项目布局时
是的,@GoRos,就像我说的,当您指定确切的路径时,这很有用。人们有各种理由需要这样做。
@OtienoRowland 我已经尝试过你的答案它没有用也许你也可以查看我的帖子***.com/questions/69122776/…【参考方案4】:
在您的 App build.gradle 中的 sourceSets 下专门指定您的 Manifest
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】:使用参数tools:node="merge"
查看https://developer.android.com/studio/build/manifest-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】:你应该改变你的代码:
<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">
【讨论】:
【参考方案7】:遇到同样的问题,发现是因为我把“pro”和“tree”的flavor文件夹放在lib项目下,我把flavor文件夹移到app项目下后问题解决了
【讨论】:
以上是关于Android Studio 两种具有不同清单文件的风格的主要内容,如果未能解决你的问题,请参考以下文章
Gradle:如何为需要相同 Activity 但具有不同意图过滤器的不同 buildType 合并 Android 清单文件
如何在 Android Studio 中使用具有不同应用名称的风味?
如何从提交清单 Android Studio 中删除一些文件?