Android Studio有两种不同的清单文件

时间:2015-02-12 12:59:13

标签: android android-studio android-manifest android-gradle

我在Android Studio中为我的风格定义了两个不同的清单文件时遇到了问题。这是我目前的项目结构:

Current project structure

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

我试过了:

  • 清理项目
  • 重建项目
  • 重新启动Android Studio
  • 同步gradle

但没有成功。我该怎么解决这个问题?任何帮助表示赞赏。

编辑1

我将每个AndroidManifest.xml文件夹中每个flavor res文件的位置更改为freepro文件夹。结果如下:

  1. Pro flavor按预期显示许可权限。
  2. 免费风味显示AndroidManifest.xml的权限 文件,许可证和网络权限(应该只是网络)
  3. 这感觉就像项目结构的问题。该怎么做?

    编辑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
    

7 个答案:

答案 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项目下后,问题得以解决