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

Mar*_*cus 56 android android-manifest android-studio android-gradle-plugin

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

目前的项目结构

AndroidManifest.xmlfree味道是这样的:

<?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>
Run Code Online (Sandbox Code Playgroud)

AndroidManifest.xmlmain味道没有用途的权限,但其中包含的是所有口味之间共享清单代码的其余部分.

AndroidManifest.xmlpro味道是这样的:

<?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>
Run Code Online (Sandbox Code Playgroud)

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'
    }
}
Run Code Online (Sandbox Code Playgroud)

我期待的结果是不同的风格定义了不同的使用权限.不是这种情况.结果目前两种口味仅定义了专业口味中<uses-permission android:name="com.android.vending.CHECK_LICENSE" />定义AndroidManifest.xml的口味.

我试过了:

  • 清洁项目
  • 重建项目
  • 重启Android Studio
  • 同步gradle

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

编辑1

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

  1. Pro flavor按预期显示许可权限.
  2. Free flavor显示来自两个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
Run Code Online (Sandbox Code Playgroud)

优点:

uses-permission#com.android.vending.CHECK_LICENSE
MERGED from qwknoteGIT:licencing-library:unspecified:26:5
Run Code Online (Sandbox Code Playgroud)

Bud*_*ius 51

技术背景:

在此链接上,它解释了可用于清单合并的技术和参数:http://tools.android.com/tech-docs/new-build-system/user-guide/manifest-merger#TOC-tools : node -markers

具体的一点tools:node是指出清单上某些XML节点在合并时应该如何表现.

解:

要在其他清单中实现一个不同的权限,并在其他清单中添加所需的权限,main并在其中添加您不需要的权限,如下例所示:

free 删除支票许可证

<uses-permission
   android:name="com.android.vending.CHECK_LICENSE" 
   tools:node="remove"/>
Run Code Online (Sandbox Code Playgroud)

  • 只有一个问题,为什么我们不能将`android:name ="com.android.vending.CHECK_LICENSE"添加到单个"专业版"清单中,而不是将其添加到主清单中并将其从"免费"版本中删除 (13认同)

Com*_*are 23

你的问题来自图书馆,而不是你的口味.具体来说,qwknoteGIT:licencing-library是请求CHECK_LICENSE.

如果您没有在所有风格中使用该库,请使用一种风格的compile语句(例如proCompile)仅在该风格中使用该库.

如果您将库用于所有风格,但确信您不需要一种风格的权限,那么tools:node可以在风格的清单中使用属性来阻止库提供的权限.

明确的合并报告是你的朋友.:-)


Row*_*ezi 6

这至少应该可以解决问题。我发现它在指定用于每个变体的确切清单时很有用。干杯! 它明确指向每个变体文件夹下的清单文件。

    android {
      productFlavors {
        prod {
          manifest.srcFile "prod/AndroidManifest.xml"
        }
        dev {
          manifest.srcFile "dev/AndroidManifest.xml"
        }
      }
      ...

}
Run Code Online (Sandbox Code Playgroud)

  • 无需指定 `AndroidManifest.xml` 文件的路径,除非您更改了它们的默认路径(我不建议这样做),否则 gradle 本身会从风味文件夹中获取它们。 (5认同)
  • 但是当仍然有 Maven 风格的项目布局时很有用 (3认同)

Ebi*_*Joy 6

在您的应用程序 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 '.'
                }
            }
       }
    }
Run Code Online (Sandbox Code Playgroud)


小智 5

请参阅https://developer.android.com/studio/build/manifest-merge参数工具:node =“merge”

高优先级清单(免费):

<activity android:name="com.example.ActivityOne"
    android:screenOrientation="portrait"
    tools:node="merge">
</activity>
Run Code Online (Sandbox Code Playgroud)

低优先级清单(主要):

<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>
Run Code Online (Sandbox Code Playgroud)

合并清单结果:

<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>
Run Code Online (Sandbox Code Playgroud)