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

时间:2013-12-05 16:17:25

标签: android android-manifest android-gradle

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

假设主要清单:

/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中的清单),但我不认为这是一个很好的解决方案。

修改 到目前为止,解决方案是在资源中定义bool并在主清单中使用它。 在调试资源中,bool在true版本中将为false。这个解决方案似乎比重复的清单要好得多,但问题仍然存在。

2 个答案:

答案 0 :(得分:3)

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

目前(gradle插件0.10),它需要在build.gradle

中进行额外配置
android {
 useOldManifestMerger false
}

答案 1 :(得分:1)

  

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

不幸的是,there's a limitation在清单的合并中,您无法在主清单和构建类型清单中定义相同的内容(活动,服务,接收方等)。解决方案是仅定义主清单中的非构建类型特定内容以及构建类型清单中的所有其他内容。