Android架构项目代码结构规范--组件化代码

2023-11-10

前言:

组件化和插件化有什么区别?虽说网上有很多文章但是讲清的聊聊无几,这也是这篇文章的由来。

大方向:组件化是一个项目主管设计管理项目架构方案,而插件化有商务上的合作和局部功能热更换修复等

小方向: 如果是公司app合作,组件化也就是插件化作为别人公司的一个子模块。

简介:组件化是代码上的功能模块化,而插件化是功能上的模块apk插件化。具体看下文

一.原因

项目迭代到一个时期后,随着开发人员的增加,各人的开发风格掺杂到一起,将使代码越发臃肿并且不易维护,这时候公司就会分出一部分人将代码风格统一并且模块化封装和拆分结构。重构代码的核心思想:高内聚低耦合设计思想原则。

Android工程中如何实施两大流派,一个是组件化,一个是插件化。

二.优势

代码重构目的:高内聚,低耦合。规范统一的代码结构,减少更新版本修改代码的工作量

人员效率目的:每个人研发个人的module组件,减少svn或git代码对代码的合并工作,提高分工合作开发效率

bug修复目的:修改代码生产bug最麻烦的就是找bug,由于每个人负责各自的模块代码,方便查找问题的提供的组件接口,快速修正bug。

1、组件化与插件化

 

  上面的图看上去似乎比较清晰,其实容易导致一些误解,有下面几个小问题,图中说的就不太清楚:

  • 组件化是一整个apk如图所示,Android机器人有头有手有脚(各个组件或子模块),手有毛病bug了,就对手部做检查。而各个部件又都依赖于这一整个apk,缺少任何一个器官app都是可以存在并正常运行的。它偏向于编写代码生产机器前的过程。
  • 插件化是多个apk组合在一起,在 组件化中头和手脚可以分开,但是不能作为一个机器人存在。组件化分开都可以作为一个器件(子模块),但是插件化就是将这个器件apk和主人组合在一起,它更偏向于实际的产品使用。

三.组件化架构

1.语言场景:java,cotlin,C或C++(ndk功能开发),mvp或mvvm等

举个栗子1:同事他会cotlin,而我不会,若他在多人开发公共项目代码中使用cotlin语言,所有人都需要学习一边cotlin语言,将会造成其他不会cotlin语言的开发负担。

举个栗子2:同事喜欢mvp模式,另一个同事喜欢用mvvm模式,但是一个项目中多种结构就会显得很杂乱,这个时候如果mvvm的模式只会在那个喜欢mvvm的模块组件中使用,mvp只会喜欢mvp同事的代码模块中,修正过程互不干涉就会使每个人开发更方便,当然建议一种架构模式最好,但是阻挡不了强势的个人思想。

面对团队多人开发时候的争论,这时候如果有一个人做架构处理,就算是cotlin程序猿,ndk底层开发工程师,framework开发部分,以后这代码编写模式不统一都可以解决。并且大公司都有做权限管理,为什么会有呢?一个开发人员就把所有代码都拿到手那大公司还怎么混。因此在做组件化的过程中,可以分权限下载,分工合作开发。

简要图:

详细解析图:

cotlin开发:由于谷歌的推荐导致后来有些公司也开始推崇cotlin语言,而module中可一转化为cotlin形式的module。

cpp开发:一般专门编写c/c++语言的ndk开发人员,主要编写FFmpeg底层功能。这类核心功能开发基本都有一位专门的人员开发。

hook反射:现在已经出现招募framework开发工程师来做市场应用app开发,由于对系统源码了解更多,所以通过各种反射来开发特殊定制功能。

普通java开发:这个也就是我们经常做的开发范围,mvc,mvp,mvvm代码编写模式,都可以直接在module中进行使用,而不会产生冲突,当然推荐是使用统一的模式比较好。

通过上图可以看出,为什么称组件化为架构设计,而不称插件化为架构设计。作为团队开发,如果将分工合作和开发效率做到最高效,所以组件化开发的意义就不言而喻了。当然如果是单人独立开发,博主也可以告诉你,组件化开发依然有意义,可以快速定位模块代码修复bug。

总而言之:

组件化具有强大的兼容性,容纳下整个团队各个开发人员甚至不同开发职能的人员。

组件化具有高效的效率,各种子模块的解耦,就可以快速定位bug,而且子模块的单独编译修改,可以大幅度减少整个项目的编译运行时间(终于不用浪费生命在等as编译了,感谢上天)

 

当然上面所描述的可以了解组件化整体的概念,通过下图,我就可以彻底了解开发步骤了:

四.代码实践:

1、主工程(主module入口):主要负责容纳所有子模块,不包含业务逻辑。主要用于使用组合业务组件、初始化配置和发布应用配置等操作。

2、组件(module/lib):主要实现具体业务逻辑,尽可能保证业务独立性,例如现在手淘这样一个大型的app几乎各个功能块都能够拿出来作为一个独立业务app。但是没有这么大型也可以按照小一些的业务逻辑来区分组件,例如:购物车组件、收银台组件、用户中心组件等,具体更具自己的项目需要来划分。

3、公共库(library):公共使用的application,通用工具类、通用sdk等库,例如eventbus、xutils、okhttp、timber日志工具、自定义工具类等等,这些库可以做成一个公共libcommon。关系则是 主工程依赖组件、组件依赖公共库。

组件化调试分两种模式:1.分模块开发测试模式。2.组合容纳发布模式。
1、分模块开发测试模式:子模块(lib)转化为module模式,子模块module是可以独立运行的,保证高内聚低耦合对其他业务没有依赖就可以独立开发测试。
2、组合容纳发布模式:依赖所有子模块(lib),整合所有模块,所有业务将组合成完整app发布运行。

组件化实质上是一个gradle编写的进阶学习和应用:Android组件化之gradle使用

-----------------------------代码:

步骤1:各个模块的第三方引用库版本号统一放置project根目录gradle.properties,方便各个模块引用相同的参数 根部gradle配置可变参数:

#组件化开发 --module/lib切换
pro_isPlugn=true

步骤2:各子模块build.gradle配置,通过参数pro_isPlugn切换子模块的lib/module模式

一读取gradle.properties中储存String值的pro_isPlugn是否组件化开发,然后对子模块设置为library或者application(module)

if ("true".equals(pro_isPlugn)) {   //组件化步骤1
    apply plugin: 'com.android.application'
} else {
    apply plugin: 'com.android.library'
}

二.解决包名,要知道library是不需要包名的,那么就可以这样操作:

    defaultConfig {
        if ("true".equals(pro_isPlugn)){  //组件化步骤2
            applicationId "lsh.com.module_mvp"
        }
        ...
    }

三.设置lib模式和子module模式各自对应的AndroidManifest.xml

   sourceSets {
        main { //组件化步骤3
            if ("true".equals(pro_isPlugn)){
                manifest.srcFile 'src/main/AndroidManifest.xml'
            }else {
                manifest.srcFile 'src/main/plugmodule/AndroidManifest.xml'
            }
        }
    }

总体图:

四.plugmodule中的AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
          package="lsh.com.module_mvp">

    <application >
        <activity android:name=".MvpActivity">
        </activity>
    </application>

</manifest>

普通的module的AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
          package="lsh.com.module_mvp">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name="lsh.com.module_mvp.MvpActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN"/>

                <category android:name="android.intent.category.LAUNCHER"/>
            </intent-filter>
        </activity>
    </application>

</manifest>

步骤3:主module判断是否使用子模块,组件化切换后不报错。

一.普通的跳转子模块:注意:将lib切换为module过程中会出现不存在提示红线

startActivity(new Intent(MainActivity.this,CotlinActivity.class));//普通跳转activity,组件化代码切换模式报错,强迫症患者可以选择下面方式

二.反射方式跳转子墨跨:推荐。

        String activityName="lsh.com.module_mvp.MvpActivity";
        try {
            Class clazz = Class.forName(activityName);
            Intent intent=new Intent(MainActivity.this,clazz);
            startActivity(intent);
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }

三.通过阿里巴巴开源的库ARouter实现跳转,为什么没放进来,复杂化代码,并且个人观点各个子模块要求多升级改动成本大

ARouter.getInstance().build("/MvpActivity/1").navigation();

 

五.作为架构的层次看:

团队开发:容纳所有成员的代码开发,甚至可以两人同时开发一个子模块,切换子模块的代码,快速开发

商业合作:商家合作的插件apk集成可以直接插件化开发。

权限限制:对整个项目做查看的权限处理,防止开发人员的流动,代码的核心保密

预设前景:程序部分功能可以直接插件化,可以重新组合作为新项目。

 

 

插件化见个人下一篇博客。

谢谢观看,有用请点赞和在GitHub上star,作为鼓励!!

个人代码demo下载

 

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android架构项目代码结构规范--组件化代码 的相关文章

随机推荐

  • 运用打分和Boost优化Elasticsearch搜索结果

    来自Optimizing Search Results in Elasticsearch with Scoring and Boosting 作者 Neil Alex 2015 03 18 虽然es提供了高效的打分函数 但是在电商环境下还是
  • python趣味编程-扫雷游戏

    在上一期我们用Python实现了一个弹跳球的游戏 这一期我们继续使用Python实现一个简单的弹跳球游戏 让我们开始今天的旅程吧 Python中的扫雷游戏GUI免费源代码 这 Python中的扫雷游戏GUI免费源代码 是一个以 python
  • UE4 List View 在蓝图中的使用

    在使用中遇到的问题 蓝图中调用userListEntry 接口的IsListItemSelected IsListItemExpanded GetOwningListView 函数 均会崩溃 一 创建用作item显示的 控件蓝图 命名为 l
  • redis-cli 利用管道批量导入MySQL数据到Redis

    前言 因为公司业务的需要 需要快速的将mysql的中的数据查询导入到redis中 程序遍历MySQL然后插入Redis 效率极低 利用redis cli命令行工具有一个批量插入模式 是专门为批量执行命令设计的 可以把Mysql查询的内容格式
  • JS操作字符串方法学习系列(1)-每天学习10个方法

    目录 字符串连接 Concatenation 字符串长度 Length 字符串查找 Search 字符串替换 Replace 字符串分割 Split 字符串大小写转换 Case Conversion 字符串切片 Slice 字符串删除空白
  • 校园二手市场交易平台(JAVA,SSM,BOOTSTRAP,JSP,AJAX,MYSQL)

    今天 我们发布一套 校园二手市场交易 系统使用技术包含JAVA SSM BOOTSTRAP JSP AJAX MYSQL 这套系统后台框架使用SSM 前台框架为BOOTSTRAP 数据库使用MySql 这套系统包含完整的源代码和数据库脚本
  • 如何通过使用 SQL Server 中的 Detach 和 Attach 函数将 SQL Server 数据库移到新位置(转载)

    载自http support microsoft com kb 224071 zh cn 如何通过使用 SQL Server 中的 Detach 和 Attach 函数将 SQL Server 数据库移到新位置 参考概要本文描述如何更改任何
  • Element的message消息提示每次只出现一个

    使用element的message消息提示框有时出现这种重复弹出情况 解决办法 if document getElementsByClassName el message length 0 也就是当前没有提示弹窗 that message
  • 汽车变排量空调压缩机的工作原理

    不同于定排量压缩机 fixed displacement compressor FDC 变排量压缩机 variable displacement compressor VDC 可自动改变其泵送能力以满足空调的需求 当车厢温度高时 它会提高其
  • 《Perl语言入门》读书笔记(四)子程序

    1 子程序 1 1 定义子程序 使用关键字sub开头 在写上子程序名 字母 数字和下划线组成 不能以数字开头 大括号框柱子程序主体 子程序可以定义在文件的任意位置 为了方便代码阅读 一般建议放在开头或结尾处 sub marine n 1 全
  • WebSocket的使用指南---前端

    1 WebSocket概述 WebSocket 是 HTML5 开始提供的一种浏览器与服务器间进行全双工通讯的网络技术 WebSocket 通信协议于2011年被IETF定为标准RFC 6455 WebSocketAPI 被 W3C 定为标
  • String

    String是一个对象 不是基本数据类型 String的特点 字符串对象一旦初始化 便不能被修改 改变的只是引用型变量的指向 例如 String str abc String str ert abc 依然存在 只是str的指向变了 Stri
  • Mysql系列 - 第4天:DDL常见操作汇总

    这是Mysql系列第4篇 环境 mysql5 7 25 cmd命令中进行演示 DDL Data Define Language数据定义语言 主要用来对数据库 表进行一些管理操作 如 建库 删库 建表 修改表 删除表 对列的增删改等等 文中涉
  • 机器学习中的特征变量及处理总结

    文章目录 1 定性特征变量 1 1 定类变量处理 1 2 定序变量处理 2 定量特征变量 3 总结 牢记一句话 数据和特征决定了机器学习的上限 而模型和算法只是逼近这个上限而已 机器学习的根本目标 就是用数据的特征变量去对目标变量进行预测
  • Github 榜首!B 站疯传!程序员思维导图 48 张!!!

    介绍在下面 整个内容包括 程序员史上最强编程思维导图 48 张 800 份求职简历模板 我写的 图解算法小册 解析 150 道高频算法面试题目 25k star Github 榜首项目 资料获取地址 无套路 直接可以下载 Github 榜首
  • Jmeter快速上手之接口测试

    目录 1 前言 2 简介 3 安装 4 环境变量 4 1 Windows环境 4 2 Mac环境 5 启动程序 6 目录说明 7 操作示例 7 1 Get请求 7 2 Post请求 7 3 依赖请求 1 前言 压测工具 Jmeter 除了可
  • 什么是接口?

    1 什么是接口 接口是一种特殊的内部类 它里面的所有方法都没有实现 2 接口的特点 1 接口中成员默认访问修饰符都是public 即便你不写 2 定义接口必须interface关键字完成 3 接口中可以定义变量 但是变量必须有固定的修饰符修
  • JUC并发编程--------线程安全篇

    目录 什么是线程安全性问题 如何实现线程安全 1 线程封闭 2 无状态的类 3 让类不可变 4 加锁和CAS 并发环境下的线程安全问题有哪些 1 死锁 2 活锁 3 线程饥饿 什么是线程安全性问题 我们可以这么理解 我们所写的代码在并发情况
  • java自引用/类的递归调用问题

    Java的自引用问题 什么是自引用 递归调用 代码示例和分析 自引用情况 类比C 什么是自引用 递归调用 在编写代码的过程中 我们经常看到类中出现该类的声明 示例 class A int data A a 这种情况就被称为自引用 代码示例和
  • Android架构项目代码结构规范--组件化代码

    前言 组件化和插件化有什么区别 虽说网上有很多文章但是讲清的聊聊无几 这也是这篇文章的由来 大方向 组件化是一个项目主管设计管理项目架构方案 而插件化有商务上的合作和局部功能热更换修复等 小方向 如果是公司app合作 组件化也就是插件化作为