在不同的构建类型中自定义AndroidManifest

我想在不同的构建类型中定制AndroidManifest。 例如在调试模式下,我只想要导出一个活动。

假设主要清单:

/main/AndroidManifest.xml

<application>
    <activity
        android:name="com.example.MainActivity" />
</application>

调试清单:

/debug/AndroidManifest.xml

<application>
    <activity
        android:name="com.example.MainActivity"
        android:exported="true" />
</application>

清单示例(与调试相同):

/example/AndroidManifest.xml

<application>
    <activity
        android:name="com.example.MainActivity"
        android:exported="true" />
</application>

在调试清单中,我获得了Duplicate registration for activity com.example.MainActivity

这就是我创建示例构建类型的原因。

/build.gradle

android {
    buildTypes {
        example.initWith(buildTypes.debug)
    }
}

但它也行不通。

[AndroidManifest.xml:17, AndroidManifest.xml:4] Trying to merge incompatible /manifest/application/activity[@name=com.example.MainActivity] element:
  <activity
--    @android:name="com.example.MainActivity">
--</activity>
--(end reached)
  <activity
++    @android:exported="true"
++    @android:name="com.example.MainActivity">
++</activity>

我想知道这是否是一个错误,缺少功能(将在未来实施)还是我做错了什么?

我知道我可以在发行版和调试版中提供不同的清单(没有在/main ),但我不认为这是一个好的解决方案。

编辑:到目前为止的解决方案是在资源中定义布尔,并在主清单中使用它。 在调试资源布尔将true而释放false 。 这个解决方案似乎比重复清单好得多,但问题仍然存在。


从gradle插件0.10开始,它终于得到支持。 有关新清单合并的更多信息:http://tools.android.com/tech-docs/new-build-system/user-guide/manifest-merger

目前(gradle plugin 0.10)它需要build.gradle额外配置

android {
 useOldManifestMerger false
}

我知道我可以在发行版和调试版中提供不同的清单(没有在/ main中),但我不认为这是一个好的解决方案。

不幸的是,在你不能在主清单和构建类型清单中定义相同的事物(Activity,Service,Receiver等)时清单合并存在限制。 解决方案是仅在主清单中定义非生成类型特定的东西,并在生成类型清单中定义其他所有内容。

链接地址: http://www.djcxy.com/p/76083.html

上一篇: Customize AndroidManifest in different build types

下一篇: How do I get dialyzer to ignore certain unexported functions?