美文网首页Android开发经验谈Android技术知识Android开发
告别传统单一模块开发,拥抱组件化开发模式

告别传统单一模块开发,拥抱组件化开发模式

作者: 躲得过初一躲不过十五 | 来源:发表于2020-07-09 20:39 被阅读0次

前言

该资料中包含一些组件化开发中的重要知识点,大家可以对于文章中对于的组件化开发是视频更容易上手掌握。

一丶什么是组件化?

二丶为什么一定要掌握组件化开发?

其实在讲到为什么一定要掌握组件化开发的时候,也要刨一刨单一模块开发的坑:

  • 单一模块开发中耦合太严重
    类与类之间藕断丝连。
  • 单一模块编译速度太慢
    所以的业务逻辑都在一个模块中,每次修改哪怕一个变量,在测试的时候都要编译整个工程。
  • 无法去做到功能复用
    正是因为耦合太严重,一些功能在进行重用的时候需要去一个类一个类中理清楚,太麻烦。
  • 团队开发不便利
    开发大项目的时候都是团队开发,但是单一模块注定是团队开发的死敌。

so,单一模块从上分析还是有很多不足的,所以在这种背景下出现了组件化开发,接下来说说组件化开发的优势(其实就是弥补了单一模块的不足)

  • 业务模块解耦
    组件化开发中,会根据业务来拆分模块,每个模块之间没有任何的耦合,这样就能够和好的解决单一模块耦合严重的问题。
  • 极大提高工程编译速度
    所以的业务逻辑都在一个模块中,每次修改哪怕一个变量,在测试的时候都要编译整个工程。
  • 组件化是功能重用的基石
    每个业务逻辑模块是彼此独立,如果在新项目中又需要用到这个功能,可以直接复制过去使用,不需要进行任何解耦。
  • 团队开发神器
    如果是团队开发的话,可以每个人或着每个项目小组负责一个模块即可,无需关注其他的功能模块,这样就可以减少沟通成本,提高开发效率。

组件化和单一模块项目结构对比


三丶组件化开发的注意事项

  • 要注意包名和资源文件命名冲突问题
    组件化开发虽然会分将业务逻辑拆分为一个个模块,但是最终打包发布的时候依然要打包到主模块中,所以要注意包名和资源名字的命名问题。
  • Gradle中的版本号的统一管理
    在组件化开发中一定会存在多个模块,每个模块都会有一个build.gradle文件,所以必须对每个模块的build.gradle进行统一的管理。
  • 组件在Application和Library之间如何做到随意切换
    因为每个模块在开发过程中都是Application,但是最终打包发布的时候都要变为Library,所以每个模块都需要在ApplicationLibrary之间进行随意的切换。
  • AndroidManifest.xml文件的区分
    正是因为模块要在Application与Library之间进行切换,所以在不同的状态下要加载不同的AndroidManifest.xml
  • Library不能在Gradle文件中有applicationId
    当模块是Application的时候,在它的build.gradle文件中会有ApplicationId,但是当它成为Library之后,ApplicationId就不能有了,所以要怎么去进行控制这种情况。

四丶 如何把项目组件化

如果是老项目就设计到项目迁移的问题,如果是新项目那就直接可以在创建项目的时候就进行组件化开发。具体步骤如下:

第一步:把业务模块划分好之后,创建相对应的module

最终效果如下:例子

注意: 在创建module以及Activity的时候,命名最好有自己的规则(防止类名重复以及资源名字重复)

第二步:把所有module中的版本号以及一些需要统一管理的内容进行统一管理(通过定义全局变量的方式,常用有三种方式)

1.直接定义在gradle.properties文件中,如图:


使用方式:
  android {
       compileSdkversion TAR_SDK_VERSION.toInteger()
       buildToolsverion BUILD_TOOL_VESION

       defaultConfig {
           applicationId "com.maniu.member" 
           minSdkversion MIN_SDK_VERSION.toInteger ()
           targetsdkversion TAR_SDK_VERSION.toInteger ()
           versioncode    VERSION_CODE.toInteger ()
           versionName  VERSION_NAME

           testInstrumentationRunner "android.support.test.runner.AndroidJunitRunner"
  }

注意: 定义在gradle.properties文件中的全局变量都是String类型,使用的时候请先转换为需要的类型。

2.定义在工程的build.gradle文件中,如:

  task clean(type:Delate) {
         delete rootproject.buildDir
  }
  
  ext {
        compilesdkversion = 28
        bulidToolsversion = "29.0.0"
        minsdkversion =21
        versioncode =1
        versionName = '1.0'
        APP_COMPAT = ''com.android.support:appcompat-v7:28.0.0''
  }

使用方式:

  android {
      compilesdkversion rootproject.ext.compilesdkversion
      buildToolsversion   rootproject.ext.buildToolsversion
    
      defaultconfig {
          applitcationId ''com.maniu.member''
          minsdkversion rootproject.ext.minsdkversion
          targetsdkversion rootproject.ext.targetsdkversion
          versioncode rootproject.ext.versioncode
          versionName rootproject.ext.versionName
          testinstrumentationRunner ''android.support.test.runner.AndroidJunitRunner''
  }

3.自定义gradle文件.如:

  ect {
       android = [
                    compilesdkversion  : 28,
                    buildToolsversion  : ''29.0.0'',
                    minsdkversion      :21,
                    targetsdkversion   :28,
                    versioncode   : 1,
                    versionName   :'1.0'
      ]
       dependencies = [
                   appcpmpatv7: ':com.android.support:appcompat-v7:28.0.0',
     ]
  }

定义好之后还需要是主工程的build.gradle进行应用定义,如:


使用方式:
  android {
      compilesdkversion  rootproject.ext.android.compilesdkversion
      buildToolsversion rootproject.ext.android.buildToolsversion

      defaultconfig {
           applicationId ''com.maniu.member''
           minsdkversion rootproject.ext.android.minsdkversion
           targetsdkversion rootproject.ext.android.targetsdkversion
           versioncode rootproject.ext.android.versioncode
           versionName rootproject.ext.android.versionName
           testInstrumentationRunner ''android.support.test.runner.AndroidJunitRunner"
  }
第三步:如何让每个module都能在Application和Library之间进行随意的切换(其实很简单,定义一个boolean类型的全局变量当做开关)


注意: 只有当module是Application的时候才具有applicationId,所以这里也要进行处理。
第四步:Application和Library所加载AndroidManifest.xml文件要区分,因为他们对AndroidManifest.xml文件的要求不一样。

处理方式很简单,直接复制一个AndroidManifest.xml文件,一份在module是Application的时候用,一份在module是Library的时候用。如图:


Library下的AndroidManifest.xml文件

在module的build.gradle文件中区分使用
  buildTypes {
       release {
          minifyEnabled false
          proguardFiles getDefaultproguardFile('proguard-android-optimize.txt'),
       }
  } 
  sourcesets {
       main {
          if(rootproject.ext.android.is_application) {
               manifest.srcFile 'src/main/AndroidMainfest.xml'
          }else{
               manifest.srcFile 'src/main/manifest/AndroidManifest.xml'
          }
      }
  }
第五步:将其他业务逻辑module注入到主module中(注意Application是不能依赖其他的Application,所以要记得判断依赖的时候,其他模块是否是Application)。

到此为止,一个组件化项目的架子就搭好了。注意:以上的操作都针对所有的业务逻辑module,所有业务逻辑module都要进行这样处理。
更多面试内容,技术干货,技术交流:
star一下我的GitHub

原创不易,点点关注

相关文章

  • 项目中的组件化

    前情提要 传统的开发模式是全部的都在app模块里面,项目越做越大,单一模块的开发,耦合非常严重。那么项目组件化、模...

  • 告别传统单一模块开发,拥抱组件化开发模式

    前言 该资料中包含一些组件化开发中的重要知识点,大家可以对于文章中对于的组件化开发是视频更容易上手掌握。 一丶什么...

  • Angular项目目录结构

    angular结构 主要文件 模块化组件化开发模式 创建组件命令 引用组件 数据绑定

  • 组件化

    说明 采用组件化,是为了组件能单独开发,单独开发是结果。要让组件能单独开发,组件必须职责单一,职责单一需要用到重构...

  • iOS组件化初探

    为什么要组件化 随着App的快速迭代,业务模块越来越复杂,开发人数越来越多。传统的开发模式会导致代码管理混乱,发布...

  • Android组件化和插件化开发

    Android组件化和插件化开发 什么是组件化和插件化? 组件化开发 就是将一个app分成多个模块,每个模块都是一...

  • 分享Spring Cloud分布式微服务架构图

    分布式、微服务、云架构 JAVA语言开发、跨平台、高性能、高可用、安全、服务化、模块化、组件化、驱动式开发模式 从...

  • 分享Spring Cloud分布式微服务架构图

    分布式、微服务、云架构 JAVA语言开发、跨平台、高性能、高可用、安全、服务化、模块化、组件化、驱动式开发模式 从...

  • Spring Cloud微服务分布式云架构

    分布式、微服务、云架构 JAVA语言开发、跨平台、高性能、高可用、安全、服务化、模块化、组件化、驱动式开发模式 从...

  • Spring Cloud分布式微服务云架构

    分布式、微服务、云架构 JAVA语言开发、跨平台、高性能、高可用、安全、服务化、模块化、组件化、驱动式开发模式 从...

网友评论

    本文标题:告别传统单一模块开发,拥抱组件化开发模式

    本文链接:https://www.haomeiwen.com/subject/tmvccktx.html