Android开发之组件化

news2024/11/15 11:36:22

#来自ウルトラマンゼロ(哉阿斯)

1 简介

通俗来讲,将一个功能完整的 App 或模块拆分成多个子模块, 每个子模块可以独立编译和运行。也可以任意组合成另一个新的 App 或模块, 每个模块即不相互依赖但又可以相互交互, 遇到某些特殊情况甚至可以升级或者降级。

2 组件化架构

组件化架构通常如下图所示:

  • App 壳:负责管理各个业务组件,和打包 apk,没有具体的业务功能;
  • 业务组件: 根据具体业务而独立形成一个个单独工程,即可以单独打包成一个 apk,也可以变成组件的一部分;
  • 功能组件(common):支撑业务组件的基础,例如网络请求、数据管理等;
  • 第三方库:包含第三方的库,微信、分享、推送、IM 等;

实际项目中应用类似如下结构:

  • app:壳

  • module_main:业务组件

  • module_mine:业务组件,我的模块

  • module_news:业务组件,新闻模块

  • module_common:公共模块

  • config.gradle:统一管理 SDK 和 依赖库。

    //在 project -> build.gradle 中使用 apply from: "config.gradle"
    ext {
        /**
         * module 开关统一
         * true:module 作为 application,可单独打包为apk
         * false:module 作为 library,可作为宿主 application 的组件
         */
        isMineModule = false
        isNewsModule = false
        isMainModule = false
        
        //1.android开发版本配置
        build_version = [
                compileSdkVersion: 28,
                ...
        ]
    
        //2.version配置
        versions = [
                android              : '3.4.1'
                ...
         ]  
        
        //3.依赖库
        libs = [
                "support_v4"      : "androidx.legacy:legacy-support-v4:${versions["support"]}",
            ...
        ]    

    在业务组件的 gradle 中配置。

    if (Boolean.valueOf(rootProject.ext.isMineModule)) {
        //作为独立App应用运行
        apply plugin: 'com.android.application'
    } else {
        //作为组件运行
        apply plugin: 'com.android.library'
    }
    apply plugin: 'kotlin-android'
    ...

    在 app 的 build.gradle 中配置。

    //主模块
    implementation project(':module_main')
    //我的模块
    if (Boolean.valueOf(rootProject.ext.isMineModule)) {    
         implementation project(':module_mine')
    }    
     //新闻模块
    if (Boolean.valueOf(rootProject.ext.isNewsModule)) { 
         implementation project(':module_news')
    }  

    至此,组件化架构的搭建基本完成。

3 注意

3.1 Application

需要在 common 组件中创建 BaseAppliaction,提供全局唯一的 context,上层业务组件在组件化模式下,均需继承于 BaseAppliaction。

3.2 applicationId管理

可为不同组件设置不同的 applicationId,也可以缺省,在 AS 中,默认的 applicationId 与包名一致。

组件的 applicationId 在其 build.gradle 文件的 defaultConfig 中进行配置。

defaultConfig {
    if (Boolean.valueOf(rootProject.ext.isModuleNews)) {
    //组件模式下设置applicationId
    applicationId "com.miya.news"
}    

3.3 manifest管理

组件在集成模式和组件化模式,需要配置不同的manifest文件。

   /*
    * SourceSets 可以指定哪些源文件(或文件夹下的源文件)要被编译,哪些源文件要被排除。
    * 
    */
    sourceSets {
        main {
            if (Boolean.valueOf(rootProject.ext.isModuleNews)) {//apk
                manifest.srcFile 'src/main/manifest/AndroidManifest.xml'
            } else {
                //在这个包下创建
                manifest.srcFile 'src/main/AndroidManifest.xml'
                java {
                    //library模式下,排除java/debug文件夹下的所有文件
                    exclude '*module'
                }
            }
        }
    }
 

3.4 资源名冲突问题

多人开发中,可以通过设置资源名前缀 resourcePrefix 以及约束资源名。在业务组件 build.gradle 配置。

android {
    //统一资源前缀,规范资源引用
    resourcePrefix "mine_"
}

针对图片、字体、string 等资源,有一个方法是,新建一个 module_res 保存所有的资源文件。

3.5 组件跳转

可以使用 ARouter 这种的路由第三方库。

3.6 混淆

一:在 app 模块中管理所有的混淆规则

优点:所有混淆规则在app模块的proguard-rule.pro文件中统一管理

缺点:移除某些模块后,需手动移除 app 模块中的混淆规则。理论上混淆规则添加多了不会造成崩溃或者编译不通过,但是会影响编译效率

二:组件模块管理各自的混淆规则

优点:将混淆文件解耦到每个模块中,并且不会影响编译效。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1967416.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

RN 开发环境搭建(Windows For Android)

传送门:官网的搭建步骤(英文) 传送门:官网的搭建步骤(中文) 注:教程写于2022年11月21日,当时也是根据官网步骤一步步操作的。现在时隔2年,最新的 RN 版本(V…

在现有的vue3项目中 配置electron

Vue项目已创建,在此基础上安装electron 配置步骤: 装依赖 yarn install装electron安装concurrently ( 一条命令实现同时启动vue项目和electron)安装nodemon (实现热更新) 一、配置途中遇到的问题: 1. 安装 yarn add electron -D 一直卡在这…

连锁企业组网的优化解决方案

对于连锁企业来说,建立高效的网络组网很重要,因为它直接影响到各分支机构之间的信息共享、管理效率和业务流程的顺畅。一个理想的解决方案需要从多个角度入手,以确保网络的稳定性、安全性和可扩展性。 首先,需要选择合适的网络拓扑…

stm32番外-----0.96寸OLED播放电影《你的名字》

目录 前言 OLED播放视频 1.简述 2.现象 3.电路连接图​编辑 4.项目主要文件 5.代码 6.注意事项 前言 刚好前面学习了USART串口通信,本期咱们来玩个有意思的,就是去通过USART实现视频的播放,本期内容程序是来自江协科技的&#xf…

Getty 携手英伟达升级商业文生图 AI 模型;苹果新专利探索「心跳」解锁 iPhone 丨 RTE 开发者日报

开发者朋友们大家好: 这里是 「RTE 开发者日报」 ,每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享 RTE(Real-Time Engagement) 领域内「有话题的 新闻 」、「有态度的 观点 」、「有意思的 数据 」、「有思考的 文…

中科院4区救命神刊!主打不让任何一个人延毕~沾边可录!

【SciencePub学术】本期,小编给大家推荐一本JCR2区中科院4区的“救命神刊”!征稿领域可谓是相当广泛,且国人友好,计算机领域的学者可以考虑一下这本期刊! 期刊解析 KNOWLEDGE AND INFORMATION SYSTEMS 《知识与信息系统…

计算机毕业设计选题推荐-学院教学工作量统计系统-Java/Python项目实战

✨作者主页:IT毕设梦工厂✨ 个人简介:曾从事计算机专业培训教学,擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Py…

Unity后处理(Post-processing)

Unity post-processing 就像是对图片采用滤镜一样(如下图对比)对当前场景显示做一定的显示处理,使得场景更漂亮、有趣或者有型。 视觉风格与视觉保真 游戏场景后处理能够达到所需的视觉风格(visual style)同时也保证视…

【Stack和Queue模拟实现】

Stack和Queue模拟实现 小杨 在模拟实现之前,有必要介绍一下什么是容器适配器 容器适配器 适配器是一种设计模式,该种模式是将一个类的接口转换成客户希望的另一个接口。 虽然stack和queue中也可以存放元素,但在STL中并没有将其划分在容器的…

星环科技推出革新性智能业务分析洞察平台——无涯·问数

5月30-31日,2024向星力未来数据技术峰会期间,星环科技重磅发布一款新产品无涯问数——智能业务分析洞察平台。该产品旨在解决传统BI在数据获取、使用门槛和效率方面的挑战,为决策者和业务人员带来前所未有的数据分析体验。 无涯问数的问世&am…

丰田生产方式:拒绝表面效率!!!

在需要的时间,一件一件地生产所需要的东西,就可以避免“过量生产的浪费”。但是,这时你必须知道“需要的时间”是在什么时候。于是,“单位时间”的意义就很重要了。 所谓“单位时间”,就是指制造一件产品的时间。这必须…

【开源分享】2024最新php在线客服系统源码|聊天系统 附搭建教程

源码的主要特色 自动回复和机器人知识库:通过后台设置机器人知识库,系统可以根据关键词自动回复用户,提高响应速度和服务效率。 内容过滤:支持设置违禁词,避免接收包含不良信息的用户消息,维护平台健康。…

黑马JavaWeb后端案例开发(包含所有知识点!!!)

目录 1.准备工作 环境搭建 开发规范 REST(REpresentation State Transfer),表述性状态转换,它是一种软件架构风格 注意事项 统一响应结果 2.部门管理功能 查询部门 删除部门 新增部门 RequestMapping 3.员工管理功能 分页查询 批…

Vue前端工程

创建一个工程化的vue项目 npm init vuelatest 全默认回车就好了 登录注册校验 //定义数据模型 const registerDataref({username:,password:,rePassword: }) //校验密码的函数 const checkRePassword(rule,value,callback)>{if (value){callback(new Error(请再次输入密…

受够了限速,用teamOS搭建家庭私有云盘,不再受限于人

在现在这个数字化的年代,手机、电脑、平板,到处都有我的照片、视频和文件。 每次想找个东西都得翻遍所有设备,简直就像大海捞针。 我也试过用那些公有云存储服务,但真的用不惯。首先,我总是担心数据安全问题&#xff…

oracle linux源码安装rabbitMQ并部署三节点rabbitmq集群

一.安装rabbitMQ的基础软件下载 Rabbitmq是现阶段比较常用的一个消息队列服务,是基于erlang语言开放的,需要首先安装erlang,并且rabbitmq和erlang的版本是有关系的。 1.基础依赖软件(主要是是编译和erlang安装的时候的一些依赖软…

君正T41开发板环境搭建_串口登陆_配置IP_telnet登陆_mount挂载_安装交叉编译工具链

目录 1 开发板外观 2 串口连接 3芯片内存情况 4 配置IP地址 5 telnet登陆 6 mount挂载目录 7 安装交叉编译工具链 1 开发板外观 2 串口连接 我直接用MobaXterm连接,虽然我还没有文档,但是我觉得波特率大概率就是115200,试了下确实可以…

电流在PCB中的奥秘:《PCB电流与信号完整性设计》解读

我们生活中的每一个电子设备,从简单的家用电器到复杂的通信系统,都依赖于高效、可靠的印制电路板。然而,随着工作频率的提高和电路尺寸的缩小,PCB设计中的信号完整性问题变得日益突出。如何在设计阶段就确保信号的高质量传输&…

Android 10.0 Launcher 启动流程

在前面SystemUI启动流程中说到,在SystemServer中会去启动各种系统服务,这里的launcher也是启动的其中一个服务ActivityManagerService去启动的。在android10之前,系统四大组件的启动都是在ActivityManagerService中,在android10中…

NPDP学习之路:科学规划顺利拿证

备考策略:制定合理学习计划 开始学习前需要制定一个合理的学习计划是备考过程中的关键。 最好根据自己个人的工作和生活习惯,合理安排每天的学习时间,并合理分配各个知识点的学习进度,把不理解的问题提前记录下来,要…