使用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;
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,684评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,143评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,214评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,788评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,796评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,665评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,027评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,679评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,346评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,664评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,766评论 1 331
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,412评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,015评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,974评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,073评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,501评论 2 343

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,443评论 25 707
  • 不怕跌倒,所以飞翔 组件化开发 参考资源 Android组件化方案 为什么要组件化开发 解决问题 实际业务变化非常...
    笔墨Android阅读 2,968评论 0 0
  • 【每日一行】:留意当天发生的事,体会当下的感受,建立自己的感受书。 事件:孩子写数学试卷,写到最后两题花了20分钟...
    孙苹阅读 240评论 0 0
  • 秋风秋雨落叶舞,寒露浇花枝叶枯。 严冬寄送纷飞雪,银装素裹洁净无。 赏冰雕透无瑕疵,唯有亮景雪中竖。 红梅绽放雪中...
    雪荩阅读 256评论 0 0
  • 父亲,天空使我想起你(9.13) 1、 美丽的天空让我想起你 紫色的花儿让我想起你 你的眼神和歌声让我想起你 ...
    青叶苓轩阅读 605评论 2 3