AndroidManifest 合并冲突处理

本文详细介绍了AndroidManifest.xml在模块化构建中的合并冲突处理,包括优先级定义(构建变体清单、应用主模块清单、库模块清单)、隐式系统权限、合并规则、属性标记和节点标记的使用,以及常见问题和解决方案。重点讨论了如何通过属性和节点标记解决合并冲突,以确保最终应用的权限和配置正确。
摘要由CSDN通过智能技术生成

0. 前言

AndroidStuido 采用模块化构建工程的方式,每个模块配置一个 AndroidManifest.xml ,甚至每个构建类型、产品特性都可以配置一个 AndroidManifest.xml。最终生成 apk 的时候,按照下图指定的优先级进行合并处理。(图片来源:Google 官方文档)

1. 优先级定义

上图介绍了三种清单文件的合并流程,从左到右,优先级由低到高。

1.1 构建变体清单文件

构建变体清单,主要包含两种:buildType 和 productFlavor 。

优先级由高到低依次是:

  1. 产品特性(productFlavors)。
  2. 构建类型 (buildType)。
  3. 编译变体(前两者组合)。
    buildTypes {
        // 测试版本
        debug {
        }
        // 发行版本
        release {
        }
    }

    flavorDimensions 'stage', 'api'

    productFlavors {
        // 开发阶段
        dev {
            dimension 'stage'
        }
        // 生产阶段
        pro {
            dimension 'stage'
        }

        minApi21 {
            dimension 'api'
        }
        minApi23 {
            dimension 'api'
        }
        minApi26 {
            dimension 'api'
        }
    }

分别建立对应的编译变体目录和 AndroidManifest.xml 文件。

以上面的配置为例,优先级依次是(高到低的顺序):

dev -> minApi23 -> devMinApi23 -> debug -> devMinApi23Debug

  • dev 高于 minApi23 是因为 flavorDimensions 声明 stage 优先于 api 。
  • 不存在 devDebug 和 minApi23Debug 这样的组合。

1.2 应用主模块清单文件

主模块中的清单文件,即 main 目录下的 AndroidManifest.xml 文件。

1.3 库模块及依赖库清单文件

依赖库指依赖本地的 aar 文件或依赖远程 maven 仓库的 aar 文件。它们通常都包含一个 AndroidManifest.xml 文件。

jar 类型的三方库,只有 class 文件,不在此讨论范围。

与主模块相对立,库模块也可以包含多个构建类型和产品特性。首先,它们先按照 构建变体清单文件 定义的优先级,合并出自身的一个 AndroidManifest.xml ,再作为库模块的清单文件与主模块的清单文件合并。

2. 隐式系统权限

早期 Android 版本中,应用可以自由访问的 API ,在新版本中受到系统权限的限制。为兼容这些应用,新版本中会允许这些应用在无权限的情况下访问这些受限的 API 。

WRITE_EXTERNAL_STORAGE 最早出现在 Android API 4 中。那么,当你应用的 targetSdkVersion 设置成小于 4 时,也可以在无权限的情况下访问 外部存储

在 AndroidManifest 合并中,如果优先级低的 Manifest 中 targetSdkVersion 小于 4,那么在 合并后的 AndroidManifest 中,会自动添加这些隐式权限。

下面两张图是合并前后,app/AndrodManifest.xmllibrary/AndroidManifest.xml 的对比。

发现 合并前 app/AndrodManifest.xml 中未申明权限,但是合并后多了三条权限记录。

优先级较低的清单声明 向合并后的的清单添加的权限
targetSdkVersion <= 3 WRITE_EXTERNAL_STORAGE
READ_EXTERNAL_STORAGE
READ_PHONE_STATE
targetSdkVersion <= 15
且使用 READ_CONTACTS
READ_CALL_LOG
targetSdkVersion <= 15
且使用 WRITE_CONTACTS
WRITE_CALL_LOG

隐式系统权限主要为兼容 Android 早起版本。在 9102 年及以后的开发中并不多见。因此,了解即可。

3. 合并规则

借用官方的一张图,介绍了在合并过程中,默认的一些合并方式。

以 dev 是高优先级,debug 是低优先级为例:

<!-- dev 的 Manifest-->
<activity
    android:name="com.flueky.lib.TestActivity"
    android:exported="false"
    android:windowSoftInputMode="adjustPan">
    <meta-data
        android:name="dev_index"
        android:value="dev" />
</activity>
<!-- debug 的 Manifest-->
<activity android:name="com.flueky.lib.TestActivity"
    android:exported="false"
    android:screenOrientation="portrait">
    <meta-data
        android:name="debug_index"
        android:value="debug" />
</activity>   
  1. dev 没有值,debug 值 B,合并后值 B,android:screenOrientation=“portrait”
  2. dev 值 A,debug 没有值,合并后值 A,android:windowSoftInputMode=“adjustPan”
  3. dev 值 A,debug 值 A,合并后值 A,android:exported=“false”

因此最终合并结果如下:

<!-- 合并后devDebug 的 Manifest-->
<activity android:name="com.flueky.lib.TestActivity"
    android:screenOrientation="portrait"
    android:exported="false"
    android:windowSoftInputMode="adjustPan">
    <meta-data
        android:name=
  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值