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

tom*_*ozb 8 android android-manifest android-gradle-plugin

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

假设主要清单:

/main/AndroidManifest.xml

<application>
    <activity
        android:name="com.example.MainActivity" />
</application>
Run Code Online (Sandbox Code Playgroud)

调试清单:

/debug/AndroidManifest.xml

<application>
    <activity
        android:name="com.example.MainActivity"
        android:exported="true" />
</application>
Run Code Online (Sandbox Code Playgroud)

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

/example/AndroidManifest.xml

<application>
    <activity
        android:name="com.example.MainActivity"
        android:exported="true" />
</application>
Run Code Online (Sandbox Code Playgroud)

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

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

/build.gradle

android {
    buildTypes {
        example.initWith(buildTypes.debug)
    }
}
Run Code Online (Sandbox Code Playgroud)

但它也行不通.

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

我想知道这是一个bug,缺少功能(将来会实现)还是我做错了什么?

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

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

tom*_*ozb 4

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

目前(gradle插件0.10)它需要这个额外的配置build.gradle

android {
 useOldManifestMerger false
}
Run Code Online (Sandbox Code Playgroud)