使用JIMU组件化方案

开源组件化方案JIMU

写在前面

公司为提高开发效率,降低模块之间的耦合,寻求一种高效、稳定的组件开发方案。有幸看到 JIMU ,现记录下使用步骤。
android studio 3.0之后,对模块的引入方式


image.png

一、模块划分

此方案把App划分为
basiclib、basicres、componentservice、components、app五大类模块。

basiclib是公共基础库,包括 三方库如网络请求框架(okhttp、retrofit)、图片加载(picasso、glide、fresco)等,自定义的util工具类,如日志、网络状态、app状态等。

basicre是公共资源库,定义全局通用的theme、color、动画等公共资源。

componentservice集结所有组件的服务接口,通过接口加实现的方式传输数据,解除组件和主项目的耦合。

components指所有封装的组件,可以独立运行调试,并实现componentservice内定义的服务接口。

app是主项目,集成组件并控制组件生命周期。

依赖关系为
app --> componentservice --> basicres --> basiclib
components --> componentservice --> basicres --> basiclib

二、组件单独调试,主项目集成组件运行

1、根目录

gradle.properties文件中增加一条属性

mainmodulename=app

build.gradle中添加依赖

dependencies {
    ...
    classpath 'com.luojilab.ddcomponent:build-gradle:1.2.0'
}

这个是组件化编译的gradle插件,也是整个组件化方案的核心。

2、基础库basiclib

build.gradle中添加依赖

dependencies {
    ...
    api 'com.luojilab.ddcomponent:componentlib:1.3.0'
}

组件化的基础库,像Router/UIRouter等都定义在这里。

3、host和 各组件

新建gradle.properties文件,添加如下代码

isRunAlone=true
debugComponent=mapcomponent
compileComponent=mapcomponent

isRunAlone用来标记组件是否单独调试,其中mainmodulename 指定的host永远为true。
debugComponent用来指定调试阶段引用的组件,也可以通过modulePackage:module的方式引用,这种方式引用的是发布的arr,而非整个module工程。
compileComponent用来指定release模式依赖的组件。

build.gradle中的com.android.application或者com.android.library全部更改为
apply plugin: 'com.dd.comgradle'
并添加extension配置

combuild {
    applicationName = 'cn.vkel.componentdemo.application.AppApplication'
    isRegisterCompoAuto = true
}

applicationName指定组件的application,如果没有application则需要新建。
isRegisterCompoAuto 指定组件是否在主项目调用时自动注册。
为防止各组件之间资源名冲突,在组件的build.gradle添加如下代码

android {
    ...
    //资源前缀,防止冲突
    resourcePrefix "map_"

可单独调试的组件目录结构如下


image.png

runalone是固定写法,包含启动Activity和application,需要在Manifest中注册并指定theme。

service接口定义了组件对位提供数据的抽象方法。


image.png

applike是组件用于注册时使用的类,实现IApplicationLike接口,组件中唯一。
build-gradle插件ComCodeTransform类的transform()方法,会搜集所有IApplicationLike的实现类,达到自动注册的效果。
serviceimpl是对service接口的实现,至少有N+1个。


image.png

image.png

三、组件之间的跳转和传值

1、配置

在组件(包括主项目app模块)的build.gradle
改变插件

apply plugin: 'com.dd.comgradle'

添加如下依赖

    //注解处理器
    annotationProcessor 'com.luojilab.ddcomponent:router-anno-compiler:1.0.0'

并设置host路径

    defaultConfig {
        ...
        //设置host路径
        javaCompileOptions {
            annotationProcessorOptions {
                arguments = [host: "uirouter"]
            }
        }

让组件自动注册

combuild {
    //applicationName = '....application.AppApplication' //不单独调试不添加
    isRegisterCompoAuto = true
}

添加资源前缀防止冲突

    //资源前缀,防止冲突
    resourcePrefix "router_"

创建gradle.properties添加

#不单独调试,false
isRunAlone=false 
#debugComponent=sharecomponent
#compileComponent=sharecomponent
2、跳转

为可跳转页面添加path路径

@RouteNode(path = "/demo", desc = "UiRouter使用演示demo")
public class UiRouterDemoActivity extends AppCompatActivity {

跳转

UIRouter.getInstance().openUri(context, url, bundle);

bundle内可以传递数据,包括基本数据类型、Parcelable对象,但是不可以传递Serializable对象。
url也可以传值,但变量名不能为中文。

"VMap://uirouter/demo/3?name=王小二&age=24"

接收参数时需要执行

AutowiredService.Factory.getInstance().create().autowire(this);

一般放在activity基类。
使用注解接受参数

@Autowired(name = "姓名")//本地变量名与传递过来的变量名不一致时使用name声明。
String name;
    @Autowired(required = true,throwOnNull = true)//throwOnNull 必须参数,不能为null,否则直接crash
    String name;

你可能感兴趣的:(使用JIMU组件化方案)