美文网首页
项目组件化之入门

项目组件化之入门

作者: rv要努力 | 来源:发表于2022-12-21 10:02 被阅读0次

带着以下疑问阅读本篇:

组件化是什么?
组件化要怎么做?
怎么样才能做好组件化?

前言

基本思想:高内聚低耦合原则,不断提高开发效率,减少代码冗余并提升质量,提高应用稳定性。

背景

早期的项目框架结构采用MVP框架,代码杂乱,同时开发者没有遵守框架开发,随着项目功能的丰富,整个项目特点:代码臃肿、耦合性高、不易维护阅读。
看到这样的旧项目,所以觉得应该学习更多的知识储备才能做好高质量的代码,由于之前有阅读过组件化开发相关技术分享文献,因此在空闲时实操了一下组件化与mvp的结合,实践下来对于组件化配置有一些感悟,一个人负责的项目,那么使用MVP就足够了,但是要遵守MVP架构写法,将复用的功能封装起来,注释和命名要规范,组件化适合多个人项目开发,可以有效提高开发效率。

组件化是什么呢?

组件化是将项目分离出多个组件进行开发,将复用性高的代码块抽离出来成公共组件(library)提供给其它组件使用,可以有效的降低耦合性,便于开发者维护开发。

  • 组件化和模块化有什么区别?
    模块是以lib的形式进行开发,而组件是以module 小项目的形式,需要打包的时候再切换成lib形式,这样可以有效的减少编译时间。
    简单的说组件化是在模块化的基础上,进行更进一步的优化!

组件化要怎么做?

  • 了解完什么是组件化
  • 然后学习一些比较好的组件化项目基础案例 Github 仓库
    推荐:
  • 开始动手搭建。
    【小笔记】
    1.你打算使用mvc、mvp、mvvm、mvi那种框架结合使用?
    2.你打算分离出几个公共的基础lib?例如:资源lib、公共类lib、工具类lib
    3.了解组件间如何通信?一般使用eventBusARouter
    4.了解公共build.gradle配置文件如何做到易维护的?组件化和模块化是如何快速切换?
    5.要了解组件间的资源怎么隔离?
    6.框架的可扩展性(意思就是框架不是单单给一个项目使用的)

1 . 组件创建

File -> New -> New Module


image.png

2 . build.gradle配置

创建一个新的config.gradle 专门用来设置参数,提供给其它build.gradle引用
config.gradle:

ext {
    //isModule是config.gradle定义的组件化开关
    //这里非常重要组件化的关键就是各个module是否可以单独运行
    isModule = false
    android =[
            compileSdkVersion: 32,
            applicationId    : "com.android.test",
            minSdkVersion    : 21,
            targetSdkVersion : 32,
            versionCode      : 1,
            versionName      : "1.0",
    ]
    versions = [
            androidx_appcompat    : "1.3.0",
            ...
    ]
    dependencies = [
            androidxAppcompat : "androidx.appcompat:appcompat:${versions.androidx_appcompat}",
            ...
    ]
}

根目录下的build.gradle引入:

buildscript {
    apply from: "config.gradle"
}
plugins {
   ...
}

module的build.gradle:

android{
      compileSdkVersion rootProject.ext.android.compileSdkVersion
      ...
}

建议将组件的build.gradle共同点放同一个文件(例如:module.gradle)进行管理


image.png

然后在组件的build.gradle中配置引用


image.png
image.png

3 . 组件间通信

使用eventBus解决数据消息广播问题
使用ARouter解决组件间的页面跳转和数据传递问题

  • 引用ARouter的问题:
    ARouter::Compiler >>> No module name, for more information, look at gradle log
1、在需要使用路由跳转的moudle中,加上这段代码:
android {
    defaultConfig {
        ...
        javaCompileOptions {
            annotationProcessorOptions {
                arguments = [AROUTER_MODULE_NAME: project.getName()]
            }
        }
    }
}

2、在需要使用路由跳转的moudle中,加上这段代码:
annotationProcessor'com.alibaba:arouter-compiler:1.2.2'

3、在moudle中build.gradle 引入依赖
api'com.alibaba:arouter-api:1.4.1' 
annotationProcessor'com.alibaba:arouter-compiler:1.2.2'

4 . 组件间资源共享

5 . 组件与模块切换

利用Gradle帮助解决组件化和模块化切换问题
方法一:在根目录下的gradle.properties文件中,添加 isModule = false
方法二:在根目录下创建一个config.gradle文件中,添加 isModule = false

//在module下的build.gradle中添加 rootProject.ext.isModule 这是引用在config.gradle中配置的
if (rootProject.ext.isModule) {
    apply plugin: 'com.android.library'
} else {
    apply plugin: 'com.android.application'
}

6 . 组件化引用viewBinding

a. 基类处理 - 利用反射机制处理
public abstract class MvpActivity<P extends MvpPresenter, VB extends ViewBinding>{
 ...
void initContentView() {
        Type type = getClass().getGenericSuperclass();
        Type[] aClass = ((ParameterizedType) type).getActualTypeArguments();
        for (Type t : aClass) {
        //网上都是直接aClass[0] , 但是你如果仔细看的话分别有<P extends MvpPresenter, VB extends ViewBinding>
        //MvpActivity外我又封了一层 因此有时候是aClass[0] 有时候是aClass[1]
            if (t.toString().contains("binding")) {
                try {
                    Method method = ((Class) t).getDeclaredMethod("inflate", LayoutInflater.class);
                    viewBinding = (VB) method.invoke(null, getLayoutInflater());
                    setContentView(viewBinding.getRoot());
                } catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) {
                    e.printStackTrace();
                }
                break;
            }
        }
    }
 ...
}

b. 是否需要考虑混淆(网上说要考虑混淆问题,目前我还未遇到问题)

7 . 组件化打包问题(略)

  • 单独组件一直闪退,报错是Arouter 路由问题

检查思路:
1.Arouter库是否有依赖

 compile 'com.alibaba:arouter-api:x.x.x'
 annotationProcessor 'com.alibaba:arouter-compiler:x.x.x'

2.这个步骤是否有做

android {
   defaultConfig {
       ...
       javaCompileOptions {
           annotationProcessorOptions {
               arguments = [AROUTER_MODULE_NAME: project.getName()]
           }
       }
   }
}

3.检查是否是打勾了Allow parallel run引起的问题

image.png

搭建过程中,你会遇到很多小问题,可以查阅我之前记录的一些问题解决方案

怎么样才能做好组件化?

坚持设计原则、主张扩展性、全方位考虑问题、关键自我升华,最终的目标是搭建一套耦合性低、扩展性好、易用易维护的项目框架

搭建感悟

搭建前期比较慢,需要考虑性能和扩展性,引入或者接触新事物需要时间学习和解决引入的问题,build.gradle配置如何更方便以及如何解决组件引用出现问题,组件化的资源管理是一个痛点这些问题如何去解决和完善。

相关文章

网友评论

      本文标题:项目组件化之入门

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