JIMU

Project Url: mqzhangw/JIMU
Introduction: 一种简单有效的 android 组件化方案,支持组件的代码资源隔离、单独调试、集成调试、组件交互、UI 跳转、生命周期等完整功能。
More: Author   ReportBugs   
Tags:

PRs Welcome License

项目介绍

JIMU(积木)是一套 Android 组件化框架,支持组件的代码资源隔离、单独调试、集成调试、组件交互、UI 跳转、生命周期等完整功能。

取名为 JIMU(积木),其含义是应用这套框架可以做到组件之间的完全隔离,每个组件可以单独运行,同时又可以通过“接口”任意拼接成一个完成 APP,这种能力就是我们实施组件化的最终目的。

最新版本

2021-06-10 补充: 因为我的错误操作,导致发布到 MavenCentral 的版本:

  • build-gradle:1.3.5
  • componentlib: 1.3.3
  • router-anno-compiler: 1.0.1 均出现了 Pom 文件错误,遗失了 dependency,再问题被修正前,可以按照 hotfix-bad-pom 分支的内容,做紧急修复。致歉 -- leobert

2021-05-23 补充: 受 JFrog 运营策略影响,项目重新发布到 MavenCentral,注意仓库变更

release-note&change-logs 关注版本变更以及注意事项是个好习惯。

模块 build-gradle componentlib router-anno-compiler router-annotation
最新版本 Download Download Download Download

实现功能:

  • 组件可以单独调试
  • 杜绝组件之前相互耦合,代码完全隔离,彻底解耦
  • 组件之间通过接口+实现的方式进行数据传输
  • 使用 scheme 和 host 路由的方式进行 activity 之间的跳转
  • 自动生成路由跳转路由表
  • 任意组件可以充当 host,集成其他组件进行集成调试
  • 可以动态对已集成的组件进行加载和卸载
  • 支持 kotlin 组件
  • 组件独立运行的 Manifest 可以基于“壳”和组件原始的 Manifest 合并生成(from version 1.3.4)
  • 组件初始化支持按序(from version 1.3.4)这部分基于Maat, 参考博客

原理解析

组件化设计思路 浅谈 Android 组件化

原理解释请参考文章Android 彻底组件化方案实践

demo 解读请参考文章Android 彻底组件化 demo 发布

按序初始化业务组件请参考文章组件化:代码隔离也难不倒组件的按序初始化

单项目,多 module 背景下,依赖方式的优雅实践探索:三思系列:组件化场景下 module 依赖优雅实践方案

使用指南

1、主项目引用编译脚本

在根目录的 gradle.properties 文件中,增加属性:

mainmodulename=app

其中 mainmodulename 是项目中的 host 工程,一般为 app

添加 mavenCentral 仓库

在根目录的 build.gradle 中增加配置

buildscript {
    dependencies {
        classpath 'io.github.leobert-lan:jimu-build-gradle:A.B.C'
    }
}

A.B.C 是版本号,最新的版本号可以参考上面的 MavenCentral 外链

为每个组件引入依赖库,如果项目中存在 basiclib 等基础库,可以统一交给 basiclib 引入

compile 'io.github.leobert-lan:jimu-componentlib:A.B.C'

注意 GroupId 和 ArtifactId 在重新发布到 MavenCentral 后已经变更

'componentLib'        : 'io.github.leobert-lan:jimu-componentlib:{version}',
'router_anno'         : 'io.github.leobert-lan:jimu-router-annotation:{version}',
'router_anno_compiler': 'io.github.leobert-lan:jimu-router-anno-compiler:{version}',

2、拆分组件为 module 工程

在每个组件的工程目录下新建文件 gradle.properties 文件,增加以下配置:

isRunAlone=true
debugComponent=sharecomponent
compileComponent=sharecomponent

上面三个属性分别对应是否单独调试、debug 模式下依赖的组件,release 模式下依赖的组件。具体使用方式请解释请参见上文第二篇文章

3、应用组件化编译脚本

在组件和 host 的 build.gradle 都增加配置:

apply plugin: 'com.dd.comgradle'

注意:不需要在引用 com.android.application 或者 com.android.library

同时增加以下 extension 配置:

combuild {
    applicationName = 'com.luojilab.reader.runalone.application.ReaderApplication'
    isRegisterCompoAuto = true
}

组件注册还支持反射的方式,有关 isRegisterCompoAuto 的解释请参见上文第二篇文章

1.3.4 新特性
def projectRoot = project.getRootProject().rootDir.absolutePath

combuild {
    applicationName = 'com.luojilab.reader.runalone.application.ReaderApplication'
    isRegisterCompoAuto = false

    originalManifest = projectRoot + "/readercomponent/src/main/AndroidManifest.xml"

    runAloneManifest = projectRoot + "/readercomponent/src/main/runalone/AndroidManifest.xml"
    targetManifest = projectRoot + "/readercomponent/src/main/runalone/mergedManifest.xml"
    //如果不需要合并,改为 false
    enableManifestMerge = true
}

增加了 5 个可配项目:

  • useMaat 默认为 true,本处没有写,如果你不打算使用 Maat,务必改为 false,否则会织入代码并发生 ClassNotFoundException
  • originalManifest 原始 manifest 文件路径
  • runAloneManifest 一个壳 manifest,用于指定独立运行时额外需要的权限、Application 配置,启动 Activity、额外的四大组件,metadata
  • targetManifest 合并后输出的 manifest,需要先创建文件,runalone 使用的 manifest;如不先创建会影响 gradle 任务,被认为是一个缺失 manifest 的 Component!
  • enableManifestMerge 如果是 true,则会在合适的时机执行 manifest 合并功能,并且插件中增加的如:runaloneMergeDebugManifest 等任务会执行合并,否则该任务并不会合并 manifest 文件

4、混淆

在混淆文件中增加如下配置

-keep interface * {
  <methods>;
}
-keep class com.luojilab.component.componentlib.** {*;}
-keep class com.luojilab.gen.router.** {*;}
-keep class * implements com.luojilab.component.componentlib.router.ISyringe {*;}
-keep class * implements com.luojilab.component.componentlib.applicationlike.IApplicationLike {*;}

注意:com.luojilab.component.componentlib 和 com.luojilab.gen.router 包可能在项目迁移的过程中发生过或即将发生变化,文档更新不一定及时,请手工确认一下生成类的包路径。

关于如何进行组件之间数据交互和 UI 跳转,请参看 Wiki 关于消息中间件,请参考v1.3.3releaseNote

组件化讨论群

JIMU 的讨论群,群号 693097923,欢迎大家加入:

进群请扫码

PS:最近千人群满了,建议一些基础性问题仔细琢磨下文章,比较麻烦的问题提 issue 求助。

Apps
About Me
GitHub: Trinea
Facebook: Dev Tools