Android Studio有两种不同的清单文件
我在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
没有使用权限,但包含了所有风格之间共享的其他清单代码。
专业版的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' } }
我期待的结果是不同的口味定义了不同的使用权限。 不是这种情况。 目前的结果是这两种风格只定义了AndroidManifest.xml
中定义的<uses-permission android:name="com.android.vending.CHECK_LICENSE" />
。
我努力了:
- 清洁项目
- 重build项目
- 重新启动Android Studio
- 同步gradle
但没有成功。 我该如何解决这个问题? 任何帮助表示赞赏。
编辑1
我将每个风格的AndroidManifest.xml
文件的位置从每个res
文件夹更改为free
和pro
文件夹。 结果如下:
- 专业风味显示许可证的权限。
- 免费味道显示来自
AndroidManifest.xml
文件的权限,许可证和networking权限(应该只有networking)
这感觉就像一个项目结构的问题。 这个怎么办?
编辑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节点在合并时应该如何工作。
解:
要实现一个permisions在一个不同的其他清单,添加所有权限,你需要的main
和在口味清单删除那些你不需要的,如下面的例子:
free
移除支票许可证
<uses-permission android:name="com.android.vending.CHECK_LICENSE" tools:node="remove"/>
你的问题来自图书馆,而不是你的口味。 具体来说, qwknoteGIT:licencing-library
要求CHECK_LICENSE
。
如果你没有使用这个类库,那么使用一个风格化的compile
语句(比如proCompile
)来只使用那个类库。
如果您正在使用所有types的库,但是确信您不需要某种口味的权限,那么可以在flavor的清单中使用tools:node
属性来阻止库提供的权限。
明细合并报告是你的朋友。 🙂
至less应该解决这个问题。 我发现在指定每个变体使用的确切清单时非常有用。 干杯! 它明确指向每个变体文件夹下的清单文件。
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">
- 无法parsing符号“AppCompatActivity”
- java.lang.IllegalArgumentException:包含一个path分隔符
- Android:在Google地图中设置缩放级别以包含所有标记点
- 获取屏幕宽度和高度
- Firebase离线功能和addListenerForSingleValueEvent
- app-debug.apk和app-debug-unaligned.apk之间的区别
- Android Facebook SDK 3.0在login时给出“remote_app_id与存储的ID不匹配”
- Android Studio键盘快捷键控制
- 如何才能拉自己的Android应用程序的(私人)数据?