组件化开发就是将一个app分成多个模块,每个模块都是一个组件(Module),开发的过程中我们可以让这些组件相互依赖或者单独调试部分组件等,但是最终发布的时候是将这些组件合并统一成一个apk,这就是组件化开发。
正常一个App中可以有多个module,但是一般只会有一个module是设置为application的,其他均设置为library,组件化开发就是要每个module都可以运行起来,因此在开发期间(Debug版本)每个module均设置为application,发布时(Release版本)设置为libs再进行合并。
组件可以分为两大类,一类是application组件,一类是libs组件,application组件是一个可运行的app。libs组件可以作为application的依赖,但是自身不可作为程序运行的存在。
组件化好处:
-
每个Module可以单独调试开发,节省编译时间
-
单独个模块开发可共享工具类,网络库等
-
对测试来说可以对单个模块进行快速测试
-
公司业务繁重可以不断复用模块,节省开发时间
-
对个人来说,可以积累个人的开发工具
组件化的实现:
if (isDebug.toBoolean()) {
apply plugin: 'com.android.application'
} else {
apply plugin: 'com.android.library'
}
在每个module的gradle中添加以上代码来切换子工程的工作方式。
同样,在子工程的src目录下需要两份Manifest.xml文件,并在子工程的gradle中进行配置。
android {
sourceSets {
main {
if(isDebug.toBoolean()) {
manifest.srcFile 'src/debug/AndroidManifest.xml'
} else {
manifest.srcFile 'src/release/AndroidManifest.xml'
}
}
}
}
组件化时会遇到一些问题:
1、module 中 Application 调用的问题
2、跨 module 的 Activity 或 Fragment 跳转问题
3、AAR 或 library project 重复依赖
4、资源名冲突
解决方法:
第1点:基础架构层建BaseApplication,统一使用
第2点:构建RList,动态加载包名来跳转。
第4点:命名按照moduel的开头命名
2.插件化开发
基础,动态加载
Android应用程序的.java文件在编译期会通过javac命令编译成.class文件,最后再把所有的.class文件编译成.dex文件放在.apk包里面。那么动态加载就是在运行时把插件apk直接加载到classloader里面的技术。
关于代码加载,系统提供了DexClassLoader来加载插件代码。开发者可以对每一个插件分配一个DexClassLoader(这是目前最常见的一种方式),也可以动态得把插件加载到当前运行环境的classloader中。
插件化开发的好处
- 宿主和插件分开编译,编译速度加快
- 利于并发开发
- 动态更新插件
- 按需下载模块
- 解决方法数或变量数爆棚,超过单.dex限制(65536)
目前github上已有很多开源插件化框架,但都有很多坑没有填,demo看起来很简单,但实际工程使用中会遇到各种问题。大型企业的成熟插件化框架都没有开源。
3.组件化和插件化的区别
插件化是在[运行时],而组件化是在[编译时]。换句话说,插件化是基于多 APK 的,而组件化本质上还是只有一个 APK。一般插件化用于动态修复bug或者动态更新模块,相对来说黑科技更多一些。