【问题标题】:Android Studio two flavors with different manifest filesAndroid Studio 两种具有不同清单文件的风格
【发布时间】: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'
    }
}

我期望的结果是不同的风格定义了不同的使用权限。 情况并非如此。结果是目前这两种风格都只定义了&lt;uses-permission android:name="com.android.vending.CHECK_LICENSE" /&gt;,正如在专业风格中的AndroidManifest.xml 中定义的那样。

我试过了:

  • 清理项目
  • 重建项目
  • 重启 Android Studio
  • 同步分级

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

编辑 1

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

  1. Pro 版本按预期显示许可权限。
  2. 免费风味显示来自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 中定义的 。 " -- 你是怎么确定的?
  • @CommonsWare 我在我的 HTC one x 上安装了这两种风格,当我检查每一种的权限时,他们都说“Google Play 的许可证控制”(翻译自我的手机,使用瑞典语语言环境, 可能不是英文的准确翻译)。他们都没有声明互联网权限。
  • 查看app/build/output/apk/ 中的清单合并报告,看看他们告诉你什么。
  • 您的问题来自图书馆,而不是您的口味。具体来说,qwknoteGIT:licencing-library 正在请求CHECK_LICENSE。如果您没有在所有风格中使用该库,请使用风格化的compile 语句(例如,proCompile)以仅在该风格中使用该库。

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


【解决方案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 我已经尝试过你的答案它没有用也许你也可以查看我的帖子stackoverflow.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项目下后问题解决了

        【讨论】:

          猜你喜欢
          • 2015-09-10
          • 1970-01-01
          • 1970-01-01
          • 2016-01-26
          • 2015-11-26
          • 2014-12-25
          • 1970-01-01
          • 2012-02-18
          • 1970-01-01
          相关资源
          最近更新 更多