组件化攻略-资源合并与冲突

Android资源ID冲突解决方案 本文深入解析了Android多模块开发中的资源ID冲突问题,并提供了两种主流解决方案:资源前缀强制隔离和AAPT2动态资源合并机制。通过详细代码示例和配置指南,帮助开发者在模块化、组件化和插件化场景中有效避免资源ID冲突。资源前缀强制隔离方案通过在资源文件名和内部资源名称中添加前缀,确保资源ID唯一;AAPT2动态资源合并机制通过packageId配置和稳定ID机制,为不同模块分配不同的资源ID范围。 阅读详情

在这里插入图片描述
组件化、模块化就是理清关系、解耦、组合的过程。

资源合并

先来回顾下,模块化架构的图。
在这里插入图片描述
组件化中,Network、Image等功能模块 与 BaseLib是一样的,都是Library Module,所以,都将会被编译成aar文件。

先学一个命令
./gradlew module_name:dependencies

这是gradle命令,可以查看module的依赖树。
你会发现preRelease、release、debug等各种Build variant。

给发范例
dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])

    //黄油刀
    annotationProcessor "com.jakewharton:butterknife-compiler:$rootProject.butterknifeVersion"
    //ARouter
    annotationProcessor "com.alibaba:arouter-compiler:$rootProject.arouterCompilerVersion"
    //Lombok
    compileOnly 'org.projectlombok:lombok:1.18.8'
    annotationProcessor 'org.projectlombok:lombok:1.18.8'

    compile project(path: ':projectcore')
}

你会看到以release为例。
你会看到

releaseAnnotationProcessorClasspath - Resolved configuration for annotation-processor for variant: release
+--- com.jakewharton:butterknife-compiler:8.4.0
     |    |    +--- com.android.support:support-fragment:27.1.1
     |    |    |    +--- com.android.support:support-compat:27.1.1 (*)
     |    |    |    +--- com.android.support:support-core-ui:27.1.1
     |    |    |    |    +--- com.android.support:support-annotations:27.1.1 -> 28.0.0
     |    |    |    |    +--- com.android.support:support-compat:27.1.1 (*)
     |    |    |    |    \--- com.android.support:support-core-utils:27.1.1 (*)
     |    |    |    +--- com.android.support:support-core-utils:27.1.1 (*)
     |    |    |    +--- com.android.support:support-annotations:27.1.1 -> 28.0.0
     |    |    |    +--- android.arch.lifecycle:livedata-core:1.1.0
     |    |    |    |    +--- android.arch.lifecycle:common:1.1.0
     |    |    |    |    +--- android.arch.core:common:1.1.0
     |    |    |    |    \--- android.arch.core:runtime:1.1.0
     |    |    |    |         \--- android.arch.core:common:1.1.0
     |    |    |    \--- android.arch.lifecycle:viewmodel:1.1.0
|    ......
+--- com.alibaba:arouter-compiler:1.1.4
|    ......
\--- org.projectlombok:lombok:1.18.8

这里我节选了一部分

releaseCompileClasspath - Resolved configuration for compilation for variant: release
+--- project :projectcore
|    +--- project :basePlatform:core
|    |    +--- com.android.support:appcompat-v7:27.1.1
|    |    +--- com.android.support.constraint:constraint-layout:1.1.1
|    |    +--- com.github.chrisbanes.photoview:library:1.2.4
|    |    ......
|    +--- project :basePlatform:net
|    \--- project :otherLib:customview
\--- org.projectlombok:lombok:1.18.8

这便是module的引用依赖库列表。

在编码过程中,一旦你改动了build.gradle、settings.gradle。你总会看gradle sync同步的提示,这时就会再次生成目录树。

目录树产生后,便gradle就不会重复添加 库 到编译内。

你需要注意 * 号,这个依赖会被忽略,因为重复了。可以看上面,引入的第一段gradle dependencies依赖树。

资源冲突

这包括AndroidManifest冲突、包冲突(aar、lib库等)、资源名冲突

AndroidManifest冲突

这里包括几方面呢?

Actiivty

通过编译生成的apk,用AS进行查看。可以看到这样一段

        <activity
            android:theme="@ref/0x7f0b0186"
            android:name="com.wangxueming.account.module.cash.WithDrawActivity"
            android:screenOrientation="1" />

编译完成后,其实,activity的路径是被完整的补齐的。

Application

在多模块的情况下,我们一般是支持剔除几个模块,以加快编译速度的。所以,每个模块是可以有自己的Application的。
按照App Module、Library module来划分,规则如下

App ModuleLibrary Module结果
有定义无定义用App的Module
无定义有定义用功能的Module
无定义多个定义解决冲突后用功能的Module
有定义多个定义解决冲突后用App的Module
高优先级属性低优先级属性属性的合并结果
高优先级属性低优先级属性属性的合并结果
没有值没有值没有值(使用默认值)
没有值值 B值 B
值 A没有值 值 A
值 A值 A值 A
值 A值 B冲突错误 - 您必须添加合并规则标记

注意:

  • 这里会有tools:replace来解决冲突
  • App Module > Library Module (优先级)

更详细的请科学上网,参考这个合并多个清单文件

Permission

这块就参考 《组件化攻略-权限管理》

主题

Activity的主题是独立的,每个Activity的主题都会引用自身module的AndroidManifest所声明的主题,若没声明,就是系统默认主题。
我截取编译出来Apk的AndroidManifest.xml的一部分theme

<activity
            android:name="com.winfae.login.LoginActivity"
            android:screenOrientation="1" />

        <activity
            android:theme="@ref/0x7f0b0186"
            android:name="com.winfae.fintransation.module.home.HomeActivity"
            android:screenOrientation="1" />
            
        <activity
            android:theme="@ref/0x7f0b019e"
            android:label="@ref/0x7f090028"
            android:icon="@ref/0x7f020143"
            android:name="com.squareup.leakcanary.internal.RequestStoragePermissionActivity"
            android:enabled="false"
            android:taskAffinity="com.squareup.leakcanary.com.winfae.fintransation" />
shareUid

只有App module的sharedUserId,才会最终打包进full AndroidManifest.xml。

service

参考activity的规则

包冲突

使用gradlew dependencies来查看 module的依赖树(参考本文第一部分)
规则:

  • 多个lib同时依赖同一个包的 多个版本,默认使用版本比较高的依赖
  • 如果想使用版本较低的依赖,可以用exclude来排除依赖。
    比如以下的范例
    api("com.squareup.retrofit2:converter-simplexml:$rootProject.retrofitVersion") {
        exclude group: 'xpp3', module: 'xpp3'
        exclude group: 'stax', module: 'stax-api'
        exclude group: 'stax', module: 'stax'
    }

资源名冲突

资源名冲突,涉及到R.java文件。这一块,我觉得不需要详细叙述。
R.drawable.xxxx来进行引用,如果资源名称一样,就存在,你用了另外一个资源。

直接上解决方案:

强制添加前缀!

    defaultConfig {
        //强制前缀
        resourcePrefix "acco_"
    }

同时,每次上传版本到master,请进行一次lint(我的用的AliLint)进行检测。
通过resourcePrefix会进行提醒,通过Lint进行二次确认。避免冲突产生。

Android AAR包生成与使用全攻略:从模块化到Maven发布 在Android开发中,模块化是提升代码复用和工程效率的核心实践。其原理在于将功能封装为独立组件,通过依赖管理实现解耦。这一技术价值显著,能加速编译、清晰架构边界,是大型项目与团队协作的基石。应用场景广泛,涵盖UI控件库、网络框架乃至商业SDK的交付。本文聚焦于Android模块化的核心载体——AAR包,深入解析其生成流程中的关键配置,如混淆规则与依赖传递管理,并系统对比本地文件、Maven本地仓库及远程仓库三种使用方式的优劣与避坑指南,助力开发者实现高效的组件化开发。 阅读详情

相关推荐

UniApp高级进阶

以下为你整理了一份关于UniApp高级进阶的详细分享,涵盖性能优化、复杂功能实现及最佳实践等核心内容,助你突破开发瓶颈,打造高性能跨平台应用!:性能优化需持续迭代,建议结合。

GanKuRenSheng的博客 1001

安卓热修系列-插件资源冲突解决方案

插件源码工程中的插件apk结构(也就是plugin.apk):实际代码下沉为resmodule作为library模块,app模块中并无实际功能,仅仅作为application模块引用library,这样就可以输出我们的插件plugin.apk。这样做的目的上面有说,其实就是避免我们的代码等在app模块,被弄成常量了。本文介绍了插件资源加载的多种方案,可以按照自己的使用场景以及团队技术能力选择合适的方案。

1 682

2026年软件测试面试全攻略与核心技术解析

软件测试作为质量保障的核心环节,其技术体系持续演进。从基础的黑盒/白盒测试到现代灰盒测试,测试方法不断融合创新。测试流程已从传统V模型发展为持续测试流水线,结合BDD和自动化工具实现质量左移。在测试设计领域,四象限法帮助工程师根据业务关键性和技术复杂度制定策略,而自动化测试框架如Playwright和k6正成为技术选型热点。随着AI和车载系统等新兴领域发展,测试工程师需要掌握智能测试用例生成、CAN总线测试等专项技能。性能测试方面,全链路压测和火焰图分析成为定位瓶颈的利器。无论是面试准备还是工程实践,理解这

weixin_33895695的博客 296

一个 Android MVVM 组件化架构框架,又是一年金九银十

为了方便有学习需要的朋友,我把资料都整理成了视频教程(实际上比预期多花了不少精力)当程序员容易,当一个优秀的程序员是需要不断学习的,从初级程序员到高级程序员,从初级架构师到资深架构师,或者走向管理,从技术经理到技术总监,每个阶段都需要掌握不同的能力。早早确定自己的职业方向,才能在工作和能力提升中甩开同龄人。无论你现在水平怎么样一定要 持续学习 没有鸡汤,别人看起来的毫不费力,其实费了很大力,这四个字就是我的建议!!我希望每一个努力生活的IT工程师,都会得到自己想要的,因为我们很辛苦,我们应得的。

2301_79058515的博客 855

前端攻略系列:面向真实问题的工程化方法论体系

前端工程化不是工具配置的堆砌,而是围绕可维护性、稳定性与协作效率构建的系统性解题能力。其核心原理在于将技术决策锚定在具体业务场景中,通过问题驱动的方式反向推导出适配团队规模、交付节奏和长期演进需求的技术方案。这种‘问题域优先’而非‘框架优先’的思维,显著提升代码在生产环境中的存活率与迭代韧性,广泛应用于中后台系统重构、大促稳定性保障、微前端落地及新人 onboarding 等关键场景。Darren 的《前端攻略系列》正是这一理念的实践结晶,强调可测量、可归因、可传承的工程实践。

世范水晶 391

SpringBoot+Vue游戏攻略平台项目实战:从源码到部署全程解析

前后端分离架构已成为现代Web开发的主流模式,SpringBoot与Vue的组合凭借生态成熟、上手门槛低,成为中小型项目和个人开发者首选。理解一个完整全栈项目的代码结构、数据流向与部署流程,远比单纯写几个接口更有价值。本文以MOBA类游戏攻略分享平台为例,拆解项目从环境配置、数据库设计、后端接口实现到前端联调、论文写作与答辩准备的全过程。涵盖用户认证、评论点赞、分页查询等核心模块,并总结了启动失败排查、版本兼容等典型避坑经验,帮助开发者快速掌握从零跑通并二次开发SpringBoot+Vue项目的完整技能。

weixin_34221654的博客 231

Android模块化开发遇到的问题: 资源名冲突的问题

三方jar或者aar资源名冲突的问题

chenhuakang的博客 844

Android-一个强大完善的Android组件化方案

一个强大完善的Android组件化方案

Android构建--资源文件如何合并

什么文件是资源文件? /res目录下的所有文件, /assets目录 Manifest文件 需要合并的资源文件来源是哪? 通常apk中的资源来源有3个,具体可以参考官网: 主资源(main source set):比如src/main/res 编译变量(Build variant source set): 比如src/demoDebug/res 库文件依赖(libraries): 也就是我们...

Ada_jqd 2670

二、租用AutoDL服务器与连接教程

点击右上角控制台,选择【租用新的实例】;,我这里使用的是xshell和xftp工具(自行下载)。打开本地目录和服务器目录,直接拖动文件。

zzf021122的博客 1326

避坑指南:Cursor AI生成Flutter代码时最容易翻车的5个配置细节

本文深入剖析了使用Cursor AI生成Flutter代码时,因.cursorrules配置文件不当而导致的五大常见问题。重点探讨了如何通过制定清晰、具体的规则,避免状态管理混乱、设计图输入低效、项目架构脱节、性能隐患及规则维护缺失等陷阱,从而将AI转化为高效、可靠的开发伙伴,提升代码质量和团队协作效率。

wdx0123456的博客 415

告别图标协作混乱:IconPark团队共享与评论功能全攻略

在现代UI/UX设计流程中,图标协作往往成为团队效率瓶颈。GitHub 加速计划下的 IconPark 项目,作为一款能够将 SVG 图标转换为多种主题,并生成 React、Vue 和 SVG 格式图标的强大工具,为解决这一痛点提供了完整解决方案。本文将详细介绍如何利用 IconPark 的团队共享与评论功能,彻底告别图标版本混乱、反馈延迟等协作难题。 ## 为什么选择 IconPark 进行图

gitblog_00695的博客 338

ROS中tf2_ros::Buffer.lookupTransform的正确使用姿势:从踩坑到填坑

本文深入解析了ROS中tf2_ros::Buffer.lookupTransform接口的正确使用方法,重点剖析了因tf2_ros::TransformListener生命周期管理不当导致的经典问题。文章提供了从理解Buffer与Listener共生关系、类成员设计黄金法则到参数详解与异常处理的完整避坑指南,并给出了构建健壮坐标变换工具类的实战方案,帮助开发者稳定实现机器人坐标系变换。

weixin_29253711的博客 135

Android面试全攻略:从Java基础到架构设计,助你斩获心仪Offer

在移动开发领域,扎实的技术基础和清晰的架构思维是开发者职业发展的核心。理解计算机基础原理,如JVM内存模型与垃圾回收机制,是构建高性能应用的基石。掌握Android平台核心技术,包括四大组件生命周期、View渲染流程及事件分发机制,能有效解决UI卡顿等性能问题。在工程实践中,性能优化和架构设计体现了开发者的综合能力,例如通过启动优化、内存管理及合理的组件化方案,可以显著提升应用质量与团队协作效率。这些技术最终服务于构建稳定、高效的大型应用,也是当前Android面试中的高频考点和深度考察方向。

weixin_33692284的博客 384

从零开始玩转Franka Panda机器人

本文总结了笔者在学习使用Franka Panda机器人时的一些方法和经验总结。

止于至玄 1万+

解决开着代理情况下pip或魔搭下载失败

最近由于经常配环境导致,老是要来回切clash关掉代理,非常的不方便如下面的,魔搭模型下载失败如下面的,pip换源后下载失败。

风吹落叶的博客 2950

加速网页加载,提升用户体验:HTML、JS 和 Vue 项目优化全攻略

除了以上列出的方法,还有很多其他的优化技巧,例如使用 CDN 加速、HTTP/2 协议、Service Worker 缓存等等。在信息爆炸的时代,网页加载速度成为了用户体验的重中之重。为了留住用户,提升转化率,网页优化势在必行!网页优化是一个持续的过程,需要不断学习和实践。通过以上方法,你可以有效提升网页加载速度,为用户提供更流畅的体验,最终实现更高的转化率和用户满意度。本文将从 HTML、JavaScript 和 Vue 项目三个方面,为你提供一份全面的网页优化指南,助你打造闪电般的加载速度!

服务员的博客 1434

错误代码105(ERR_NAME_NOT_RESOLVED)详解与解决方案

错误代码105表示"",当您的浏览器无法将网站域名转换为IP地址时就会出现此错误。这是最常见的网络连接问题之一,通常与DNS(域名系统)有关。

欢乐打代码! 1万+

MATLAB 2021a安装全攻略:从许可证管理到工具箱选择与数据分析实战

在科学计算与工程仿真领域,MATLAB作为一款集算法开发、数据分析、可视化及模型仿真于一体的高级技术计算语言和交互式环境,其核心价值在于为工程师和研究人员提供了一个强大的矩阵运算平台和丰富的专业工具箱。理解其工作原理,尤其是基于许可证的授权机制和模块化的工具箱架构,是确保软件正常运行和高效利用的基础。从技术实现角度看,MATLAB通过许可证文件(.lic)进行身份验证,并允许用户按需安装如统计与机器学习、图像处理、控制系统等专用工具箱,从而构建定制化的技术栈。这种设计不仅优化了存储空间,更让用户能精准匹配其

weixin_30319153的博客 348

贝叶斯时空模型-INLA-4

该文章中,会简化数学计算的过程,主要是针对,在有数据的基础上,如何应用贝叶斯时空模型,找出影响因素,绘制时间变化的空间分布预测图。上述中关键一步与前几期介绍的不一样的地方是,我们加入了n.group参数,用来指定年份,先看一下Year有多少年的,然后封装在s.index里面。在前述的内容中,我们介绍了,如何处理空间的数据,利用海拔高度预测降雨量的例子。建立好数据及mesh以后,我们现在写INLA公式,如果不考虑残差项,那就是固定效应,现在我们增加残差项,及空间与时间效应。这里的Mesh设定值为10,20。

学习中 2948

SAP 成本分摊逻辑与案例(含具体数据)

摘要: SAP成本分摊通过**分配(Allocation)与分摊(Assessment)**两种方式,将间接成本中心费用按预设规则(如人数、工时、比例等)结转至直接成本对象。分配保留原始成本要素(如电费、工资),适用于需明细追踪的场景;分摊则打包为次级成本要素(如管理费用),简化核算。实操案例涵盖行政费用分配(按人数)、水电车间分摊(按工时)、机修作业分摊(作业成本法)及内部订单结算,系统通过KSV1/KSU1配置循环规则,KSV5/KSU5执行结转。关键点在于选择匹配业务的分摊基础,合理配置次级成本要素,

金牌架构师 550

3个维度解锁PlantUML Editor:高效UML绘图工具全攻略

PlantUML Editor是一款基于文本描述的在线UML绘图工具,通过简洁代码即可生成专业图表,无需复杂安装配置,是程序员、系统分析师和架构师提升文档效率的必备工具。其核心优势在于**代码驱动设计**、**实时预览反馈**和**团队协作友好**三大特性,完美解决传统绘图工具操作繁琐、版本控制困难的痛点。 ## 问题定位:传统UML绘图的三大核心痛点 ### 痛点一:软件安装与环境配置障碍

gitblog_00834的博客 295

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

Angular开发环境搭建与VS Code高效配置全攻略

前端开发中,开发环境的配置是项目启动的第一步,直接影响开发效率和工程体验。对于基于TypeScript的现代框架如Angular,一个集成度高、智能提示完善的开发环境尤为重要。Visual Studio Code(VS Code)凭借其轻量、插件生态丰富以及对TypeScript的原生支持,成为Angular开发的理想选择。通过合理配置Node.js环境、Angular CLI工具链以及VS Code的核心插件(如Angular Language Service、Prettier),开发者可以构建一个支持智

weixin_30945039的博客 385

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

2025大厂前端面试全攻略:1000道真题解析与备战指南

前端开发作为现代Web应用的核心技术栈,其知识体系涵盖JavaScript基础、框架原理、工程化实践等多个维度。理解事件循环、闭包等JavaScript核心机制是构建复杂应用的基础,而Vue/React等框架的响应式原理和Fiber架构则决定了应用性能上限。在工程化方面,Webpack优化和性能指标监控直接影响用户体验。本指南系统整理了大厂前端面试的1000道高频真题,覆盖从基础概念到微前端架构的前沿实践,特别针对事件循环、React Hooks等热词考点提供深度解析,帮助开发者高效备战2025技术面试。

weixin_30430169的博客 503

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

软件测试面试全攻略:从基础理论到实战技巧

软件测试作为质量保障的核心环节,其技术体系包含黑盒/白盒测试、自动化测试框架、性能测试等多个维度。测试金字塔理论揭示了不同层级测试的经济学原理,而等价类划分等用例设计方法则是功能测试的基石。在工程实践中,Selenium、Cypress等自动化测试框架的选择需要结合项目架构特点,CI/CD流水线中的测试策略直接影响交付效率。对于高级测试工程师,建立包含基础设施层、应用层、业务层的完整性能指标体系,以及深入理解OWASP Top 10安全漏洞原理尤为重要。当前测试领域正经历AI与云原生技术的变革,掌握测试用例

cuyi7076的博客 574

开源在线演示文稿工具全攻略:5分钟学会免费制作专业PPT

在当今数字化时代,你是否还在为昂贵的Office软件订阅费而烦恼?是否需要一个随时随地都能编辑演示文稿的解决方案?这款**开源在线演示文稿工具**为你提供了完美的答案。它是一款基于Vue3和TypeScript开发的免费PPT制作工具,完整复刻了Microsoft PowerPoint的核心功能,让你在浏览器中就能创建、编辑和展示专业的幻灯片。无论你是学生、教师还是商务人士,这款免费PPT制作工具

gitblog_00213的博客 990
上一篇: android Manifest.permission normal权限合集
下一篇: 组件化攻略-R2.java的今生前世和静态变量
手艺人王学明
手艺人王学明 领域专家: 操作系统技术领域 领域专家: 操作系统技术领域
博客等级 码龄17年 441粉丝 185原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值