带着以下疑问阅读本篇:
组件化是什么?
组件化要怎么做?
怎么样才能做好组件化?
前言
基本思想:高内聚低耦合原则,不断提高开发效率,减少代码冗余并提升质量,提高应用稳定性。
背景
早期的项目框架结构采用MVP框架,代码杂乱,同时开发者没有遵守框架开发,随着项目功能的丰富,整个项目特点:代码臃肿、耦合性高、不易维护阅读。
看到这样的旧项目,所以觉得应该学习更多的知识储备才能做好高质量的代码,由于之前有阅读过组件化开发相关技术分享文献,因此在空闲时实操了一下组件化与mvp的结合,实践下来对于组件化配置有一些感悟,一个人负责的项目,那么使用MVP就足够了,但是要遵守MVP架构写法,将复用的功能封装起来,注释和命名要规范,组件化适合多个人项目开发,可以有效提高开发效率。
组件化是什么呢?
组件化是将项目分离出多个组件进行开发,将复用性高的代码块抽离出来成公共组件(library)提供给其它组件使用,可以有效的降低耦合性,便于开发者维护开发。
- 组件化和模块化有什么区别?
模块是以lib的形式进行开发,而组件是以module 小项目的形式,需要打包的时候再切换成lib形式,这样可以有效的减少编译时间。
简单的说组件化是在模块化的基础上,进行更进一步的优化!
组件化要怎么做?
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)进行管理

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


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配置如何更方便以及如何解决组件引用出现问题,组件化的资源管理是一个痛点这些问题如何去解决和完善。
网友评论