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文件夹更改为freepro文件夹。 结果如下:

  1. 专业风味显示许可证的权限。
  2. 免费味道显示来自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">