--- title: 原生扩展 - 清单合并工具 brief: 本手册介绍了应用清单的合并工作原理 --- # 应用清单 一些平台上需要提供清单片段(或称存根)来为扩展提供支持。 可以是部分 `AndroidManifest.xml`、`Info.plist` 或者 `engine_template.html`。 从应用基础清单开始,每个扩展清单存根依次被应用。 基础清单可以是默认的(位于 `builtins\manifests\\...`),也可以是由用户自定义的。 ## 命名和结构 扩展清单必须被放置在适当的指定位置才能生效。 /myextension ext.manifest /manifests /android AndroidManifest.xml /ios Info.plist /osx Info.plist /web engine_template.html ## Android Android 平台提供了清单合并工具(基于 `ManifestMerger2`),`bob.jar` 中使用此工具合并清单。 关于 Android 清单的详细信息,请参见[官方文档](https://developer.android.com/studio/build/manifest-merge) ::: important 如果扩展清单中没有设置应用的 `android:targetSdkVersion`,下列权限会被自动加入:`WRITE_EXTERNAL_STORAGE`、`READ_PHONE_STATE`、`READ_EXTERNAL_STORAGE`。详情请见[此文档](https://developer.android.com/studio/build/manifest-merge#implicit_system_permissions)。 我们推荐这样设置:`` ::: ### 示例 基础 manifest ```xml ``` 扩展 manifest: ```xml ``` 合并结果 ```xml ``` ## iOS / macOS 对于 `Info.plist`,我们使用自己的实现来合并列表和字典。可以在键上指定合并标记属性 `merge`、`keep` 或 `replace`,默认是 `merge`。 ### 示例 基础 Manifest ```xml NSAppTransportSecurity NSExceptionDomains foobar.net testproperty INT 8 REAL 8.0 BASE64 SEVMTE8gV09STEQ= Array1 Foobar a Array2 Foobar a ``` 扩展 manifest: ```xml NSAppTransportSecurity NSExceptionDomains facebook.com NSIncludesSubdomains NSThirdPartyExceptionRequiresForwardSecrecy INT 42 REAL 16.0 BASE64 Rk9PQkFS Array1 Foobar b Array2 Foobar b ``` 合并结果: ```xml NSAppTransportSecurity NSExceptionDomains foobar.net testproperty facebook.com NSIncludesSubdomains NSThirdPartyExceptionRequiresForwardSecrecy INT 8 REAL 16.0 BASE64 SEVMTE8gV09STEQ= INT 42 Array1 Foobar a b Array2 Foobar a Foobar b ``` ## HTML5 对于html模板,我们为每个部分命名,以便能够匹配(例如"engine-start")。 然后可以指定属性 `merge` 或 `keep`。`merge` 是默认值。 ### 示例 基础 manifest ```html ``` 扩展 manifest ```html ``` 合并结果 ```html ```