在Android开发中,组件化是将一个大型应用程序拆分成多个独立的组件,每个组件都是一个相对独立、可复用的单元。
组件化强调的是减少组件之间的耦合,提高代码的可维护性和可测试性。
每个组件可以独立开发、测试和编译,组件之间通过定义接口和调用API的方式进行通信和交。
组件化的优势包括:
提高开发效率:解耦,多个小团队可以并行开发不同的组件。
提高代码复用性:不同的组件可以通过接口和API进行通信和交互。
提高系统稳定性:每个组件可以独立运行,一个组件的崩溃不会影响整个系统。
模块化、插件化区别
1.模块化是将一个应用程序按照功能或业务领域划分为多个相互独立、低耦合的模块。每个模块专注于实现特定的功能或解决特定的问题。模块化强调的是功能的分离和模块之间的独立性。
模块化的优势包括:
清晰的结构:使得代码结构更清晰、易于理解和维护。
促进重用和扩展:模块化的设计可以促进代码的重用和扩展。
2.插件化是将一个应用程序拆分成多个独立的插件,每个插件可以独立开发、测试、编译和发布。插件化强调的是功能的动态加载和卸载,以及功能的动态更新。
插件化的优势包括:
功能扩展:通过加载和卸载插件,可以动态地扩展宿主应用程序的功能。
灵活性:插件可以独立开发和测试,不需要修改宿主应用程序的代码。
动态更新:插件可以在运行时动态加载和卸载,实现功能的动态更新。
企业大多常用组件化架构进行开发,也仅有国内部分企业使用插件化开发。不过随着Android版本迭代更新,权限越来越严格插件化将受到限制。
需要解决的问题
-
组件分层:怎么将一个项目分成多个组件、组件间的依赖关系是怎么样的?
-
组件单独运行和集成调试:组件是如何独立运行和集成调试的?
-
组件间通信:主项目与组件、组件与组件之间如何通信的?
-
业务组件不能反向依赖壳工程,如何获取Application实例、如何获取Application onCreate()回调(用于任务初始化)?
组件划分

根据上面的组件化架构图,组件分为 基础组件、业务功能组件、业务组件。
-
基础组件,不用多说,就是基础功能,例如网络请求、日志框架、图片加载,这些与业务毫无关联,可用于公司所有项目,是底层最稳定的组件。
-
业务功能组件,主要是供业务组件依赖使用,例如 分享、支付组件,通常是一个完整的功能,是较为最稳定的组件。
-
业务组件,完整的业务块,例如前面提到京东的 “首页”、“分类”、“发现”、“购物车”、“我的”。
项目搭建
- 单工程方案
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
| isDebug = true 独立调试
if(isDebug.toBoolean()){ apply plugin: 'com.android.application' }else{ apply plugin: 'com.android.library' }
android { defaultConfig { if(isDebug.toBoolean()){ applicationId "com.demo.module.collect" } } sourceSets { main { if (isDebug.toBoolean()) { manifest.srcFile 'src/main/debug/AndroidManifest.xml' } else { manifest.srcFile 'src/main/AndroidManifest.xml' } } } }
|
- 多工程方案
多工程方案,业务组件以library module形式存在于独立的工程。再新增独立工程引入组件就可以独立调试了,不再需要进行上面那些配置了。
1 2 3
| include ":app", include ":app_pay",
|

-
选择合适的库或框架
组件间的跳转和通信: ARouter, TheRouter, WMRouter
依赖注入框架: Hilt, Dagger等。
架构模式: MVI、MVVM、MVP。
Jetpack库:ViewModel、LiveData、Room等。
服务暴露组件:新建服务继承IProvider、EventBus等。
-
Application生命周期分发
使用AppLifeCycle插件,它专门用于在Android组件化开发中,Application生命周期主动分发到组件。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112
| dependencies { ... api 'com.github.hufeiyang.Android-AppLifecycleMgr:applifecycle-api:1.0.4' }
implementation 'com.github.hufeiyang:Common:1.0.2' annotationProcessor 'com.github.hufeiyang.Android-AppLifecycleMgr:applifecycle-compiler:1.0.4'
@AppLifecycle public class ModuleApplication implements IApplicationLifecycleCallbacks {
public Context context;
@Override public int getPriority() { return NORM_PRIORITY; }
@Override public void onCreate(Context context) { this.context = context; }
@Override public void onTerminate() { }
@Override public void onLowMemory() { }
@Override public void onTrimMemory(int level) { } }
buildscript { repositories { google() jcenter()
maven { url 'https://jitpack.io' } } dependencies { classpath 'com.android.tools.build:gradle:3.6.1'
classpath 'com.github.hufeiyang.Android-AppLifecycleMgr:applifecycle-plugin:1.0.3' } }
/使用插件applifecycle apply plugin: 'com.hm.plugin.lifecycle' ... dependencies { ... implementation 'com.github.hufeiyang:Common:1.0.2' }
public class MyApplication extends Application {
@Override public void onCreate() { super.onCreate(); ... ApplicationLifecycleManager.init(); ApplicationLifecycleManager.onCreate(this); }
@Override public void onTerminate() { super.onTerminate(); ApplicationLifecycleManager.onTerminate(); }
@Override public void onLowMemory() { super.onLowMemory(); ApplicationLifecycleManager.onLowMemory(); }
@Override public void onTrimMemory(int level) { super.onTrimMemory(level); ApplicationLifecycleManager.onTrimMemory(level); } }
|
新增组件的话,只需要实现IApplicationLifecycleCallbacks并添加了@AppLifecycle注解即可,无需修改宿主壳工程。
总结
总之Android开发组件化,是在项目发展到一定规模后必定要使用的技术,学习至完全掌握是非常必要的。