Android官方技术文档翻译——清单合并

2017-04-15 13:34:08

本文译自Android官方技术文档《Manifest Merger》,原文地址:http://tools.android.com/tech-docs/new-build-system/user-guide/manifest-merger。

翻译不易,转载请注明CSDN博客上的出处:

http://blog.csdn.NET/maosidiaoxian/article/details/42671999

翻译工作耗时费神,如果你觉得本文翻译得还OK,请点击文末的“顶”;如有错讹,敬请指正。谢谢。


清单合并

目录

  1. 清单文件顺序

  2. Android 清单文件合并

  3. 元素和属性的合并处理

    1. 3.9.1 合并

    2. 3.9.2 只合并子节点

    3. 3.9.3 总是合并

    4. 3.9.4 元素合并策略和key的列表

    5. 3.9.5 包名称智能替换

    6. 3.6.1 日志记录:

    7. 3.6.1.2.1 操作格式

    8. 3.6.1.2.2 示例:

    9. 3.6.1.1 消息

    10. 3.6.1.2 NodeRecord

    1. 3.5.1 tools:node 标记

    2. 3.5.2 tools:attr 标记

    3. 3.5.3 选择器(Selector)

    4. 3.5.4 tools:overrideLibrary 标记

    5. 3.1 隐含声明

    6. 3.2 自动升级

    7. 3.3 占位符支持

    8. 3.4 合并策略的常见描述

    9. 3.5 标记

    10. 3.6 日志

    11. 3.7 构建错误

    12. 3.8 Blame

    13. 3.9 合并策略

    1. 属性标记示例

      1. 4.1 重写来自库项目的属性

      2. 4.2 删除来自库项目的属性。

      3. 4.3 强制更新属性值

      4. 4.4 混合操作

    2. 元素标记示例

      1. 5.4.1 Main Manifest

      2. 5.1 移除元素

      3. 5.2 移除所有元素

      4. 5.3 元素替换

      5. 5.4 选择器示例


    本文档主要介绍新的清单合并工具。


    这个新的合并工具是gradle android 插件的 0.10 版中引入的。截至 0.11 版本,该 gradle 插件默认情况下都是使用此合并工具。


    如果想恢复使用旧的清单合并工具,可以在你的 build.gradle 中添加以下配置:

    android {
    useOldManifestMerger true

    }


    Manifest 文件排序


    一般情况下,有三种类型的清单文件需要合并成一个最终的应用程序清单,这里按照优先级顺序列出:

    1. Product flavors 和构建类型所指定的清单文件。

    2. 应用程序的主清单文件。

    3. 类库的清单文件。


    第一种类型的清单文件通常会重写清单的内容,因为它专门提供用于特定的交付的应用程序。然后,第三种类型的清单文件通常会被合并入上一步产生的主清单中。合并的规则取决于每个节点类型,可以使用“tools:”命名空间属性来更改。


    由于多个product flavors和构建类型,这些清单文件合并的结果的组合可能会是一个矩阵。然而,对于每一个组装的步骤,每一个flavor group和构建类型的值都只能选择一个,导致出现了潜伏的覆盖主清单文件的清单文件的排序列表。


    例如,下面的 FlavorGroups: abi,density,API,Prod/Internal 导致形成了以下可能的flavors的矩阵:



    ABI

    Density

    API

    Prod/Internal

    x86

    mdpi

    9

    prod

    arm

    high

    14

    internal

    mips

    xhigh

    15



    xxhigh




    这样就形成了3x4x3x2 种可能的组合。然而,对于每一次执行组装,只能是一个group里的falvor,定义在原始的 build.gradle 的flavor group 的属性形成了一个可能要合并的清单 文件的列表,并且这个列表由高优先级到低优先级排序。


    例如,构建 x86-high-15-prod 的 variant ,会查找以下的清单文件以进行合并

    1. x86/AndroidManifest.xml

    2. high/AndroidManifest.xml

    3. 15/AndroidManifest.xml

    4. internal/AndroidManifest.xml


    在这个有序列表中,每个文件根据其在列表中的顺序都有一个优先级,合并工具将使用这个优先级来决定哪个XML元素或属性将覆盖一个较低优先级的设置。


    因此,合并工具的输入将如下:

    • 由flavor或编译类型的清单文件按优先级组成的有序列表,这些会被经常引用作为 flavors的清单。

    • 主清单文件

    • 由一些类库声明(或依赖传递而有的)的清单文件组成的有序列表。

    • 用于占位符和XML产生的注入值

    Android 清单文件合并


    在一个清单文件中的每个元素都可以根据它的元素类型(比如activity,intent-filter)和一个可选的键值(key value)来识别。一些元素,如“activity”,必须有一个key,因为在一个AndroidManifest.xml中可能存在多个这样的元素。其他的元素,像“application”,就不要求一定要有一个key,因为只能有一个这样的元素。


    元素的类型和键值对代表了一个清单元素的身份。


    合并的activity的始终是两个相同类型的元素之间,一个来自更高优先级的清单文件,一个来自较低优先级的清单文件。每一个合并的activity都有一个默认的行为,这一点将在随后进行描述。此外,在节点或一个指定的属性上的每个默认合并的activity都可能会被including工具的指定标记所覆盖。


    合并过程中还会把对每一个节点的合并结果记录下来,这将在“日志”章节描述。

    元素和属性的合并过程

    隐式声明

    一些属性都会有默认值(默认定义在在线 文档中)。当一个较高优先级的元素没有定义默认值为X的属性时,如果一个较低优先级的元素也恰好定义了一个值同样是X的属性,那么这个属性仍然会被添加到合并的元素中 (当然它的值是X), 因为它表示了类库对这个属性的值的一个明确的选择,从而不去考虑把默认值作为它的值,而是为某特性设置一个正确的值(以防默认值发生改变)。


    大多数有默认值的属性,如果在低优先级的属性中已经定义了值,那么默认值将被manifest合并工具忽略;定义的值会被合并,因为在默认值 和一个设置的值之间,并没有冲突。在生成的合并的元素中,这个属性会被设置为设定的值。


    然而,下面列出的几种情况例外:


    <uses-feature android:required>

    默认值为 true。在与其他属性合并时,将使用“或”的合并策略。这时因为如果任何一个库需要该特性,那么生成的应用程序也将需要此特性。

    <uses-library android:required>

    同 uses-feature:required。

    <uses-sdk android:minSdkVersion>

    默认值为 1。

    将使用更高优先级文件的版本,但导入一个较新版本的库时将会产生错误。      

    <uses-sdk android:maxSdkVersion>

    同 uses-sdk:minSdkVersion

    <uses-sdk android:targetSdkVersion>

    同 uses-sdk:minSdkVersion


    自动升级

    当导入一个target SDK 版本比项目低的库时,它可能需要显式声明地授予权限 (可能还需要进行其他更改),以使得类库在以后运行时能正常运行。这将由清单合并工具自动进行。

    占位符支持

    当属性值包含一个占位符 (见下面的格式)时,合并工具将把此占位符的值换成一个注入的值。注入的值是在build.gradle里面定义的。

    占位符值的语法是 ${name},因为@符号已经预留给了

    • 2021-02-04 14:02:30

      window软件界面找不到了跑到屏幕外面去了

      一般可以这样操作,按Alt+空格,然后按M,然后用上下左右键把窗口移动到能看到的地方,再按回车。有些第三方的软件可能不能用,大部分都可以这样做。

    • 2021-02-04 14:08:13

      基于 Electron 的爬虫框架 Nightmare

      Electron 可以让你使用纯 JavaScript 调用 Chrome 丰富的原生的接口来创造桌面应用。你可以把它看作一个专注于桌面应用的 Node.js 的变体,而不是 Web 服务器。其基于浏览器的应用方式可以极方便的做各种响应式的交互,接下来介绍下关于 Electron 上衍生出的框架 Nightmare

    • 2021-02-04 20:13:02

      iOS framework制作及使用(包含xib和图片)

      静态库与动态库简介: 静态库:链接使用时完整地拷贝至可执行文件中 动态库:链接时不复制,程序运行时由系统动态加载到内存,供程序调用,系统只加载一次 本文制作framework对应xcode版本:10.1

    • 2021-02-11 15:53:08

      node缓存框架memory-cache

      无论是在 desktop, mobile or web哪一方面,Cache都常被我们用来提升程序性能。当处理web应用程序的时候,虽然可以使用当前所有浏览器都支持的响应头来进行客户端缓存,从而提升页面加载效率。但当一个内容非常繁杂的页面需要2s来进行HTML输出的时候,即使启用客户端缓存该页面,服务器仍然需要针对每一个来访用户进行页面渲染。想想一个大型的新闻门户网站首页,难道他们要针对每一个用户一遍又一遍地处理HTML吗?

    • 2021-02-19 16:46:35

      window安装composer

      Composer 是 PHP 的一个依赖管理工具。它允许你申明项目所依赖的代码库,它会在你的项目中为你安装他们。

    • 2021-02-21 22:52:12

      php去除字符串中的HTML标签

      php自带的函数可以去除/删除字符串中的HTML标签/代码。 strip_tags(string,allow):函数剥去 HTML、XML 以及 PHP 的标签。 参数:string,必填,规定要检查的字符串;allow,选填,规定允许存在的标签,这些标签不会被删除。