浅谈Android模块化和组件化

1.模块化简介

简单的小项目,大多都采用的是单一工程,独立开发。由于项目不大,编译速度及维护成本这些也在接受范围之内。一个大型App产品,多人合作、单一工程的App架构势必会影响开发效率,增加项目的维护成本。

大项目使用单一工程的劣势:
A:每个开发者都要熟悉如此之多的代码,将很难进行多人协作开发,
B:Android项目在编译代码的时候电脑会非常卡,又因为单一工程下代码耦合严重,每修改一处代码后都要重新编译打包测试,导致非常耗时。所以必须要有更灵活的架构代替过去单一的工程架构

2.模块化和组件化的区别

2.1.按照业务划分,模块指的是独立的业务模块。按照功能划分,组件指的是单一的功能组件。每个组件都可以以一个单独的module开发,并且可以单独抽取出来作为SDK对外发布使用。模块和组件最明显的区别是模块相对组件来说粒度更大。一个模块中可能包含多个组件。
2.2 模块化的优点

用模块化架构,业务模块分离,低耦合,高内聚,代码边界清晰,每一个模块业务都可以单独抽取出来作为SDK对外发布使用。

3. 模块化的具体实现

3.1 对项目代码分层级
3.1.1 抽取基础library

library-base BaseActivity BaseFragment BaseApplication ...
library-db SQLiteOpenHelper Dao
library-network OkHttp Retrofit 网络请求库
library-widget 第三方控件封装
......
library-base 依赖一下 library-db library-network library-widget ...等第三方库

3.1.2 按照业务新建Model
image.png
比如美团那种:
image.png

外卖Model
美食Model
电影Model
打车Model

3.2 动态配置模块的工程类型, ApplicationId 和 AndroidManifest 文件

3.2.1 gradle.properties 中申明一个变量 isRunModel =true/false
image.png
3.2.2 在Model的build.gradle中根据isRunModel是true或者false来生命是library 还是application,在DefaultConfig中配置applicationId,SourceSets中配置
if (isRunModule.toBoolean()) {
    apply plugin: 'com.android.application'
} else {
    apply plugin: 'com.android.library'
}
 sourceSets {

        main {
            // 1.单独调试与集成调试时使用不同的 AndroidManifest.xml 文件
            // 我们还可以根据不同工程配置不同的 Java 源代码、不同的 resource 资源文件等的
            if (isRunModule.toBoolean()) {
                manifest.srcFile 'src/main/manifest/AndroidManifest.xml'
            } else {
                manifest.srcFile 'src/main/AndroidManifest.xml'
            }
        }
    }
image.png
image.png
3.2.3 AndroidManifest.xml的异同

作为Library:


    
        
        
    

作为Model:



    
        
            
                
                
            
        
        
        
    

HomeApp 继承BaseApplication

public class HomeApp extends BaseApplication {
    @Override
    public void onCreate() {
        super.onCreate();
        ModuleLifecycleConfig.getInstance().initModuleAhead(this);
    }
}
public class HomeAc extends BaseAc {
    @Override
    protected int getLayoutId() {
        return R.layout.ac_home;
    }
}

R.layout.ac_home




4.组件之间页面的跳转【由于各个模块之间互不相关,不能采用通过Intent,类名显式调用的方式调用】

ARouter是阿里巴巴开源路由框架

你可能感兴趣的:(浅谈Android模块化和组件化)