{"id":15034238,"url":"https://github.com/mqzhangw/jimu","last_synced_at":"2025-05-15T08:07:16.652Z","repository":{"id":41045586,"uuid":"100944569","full_name":"mqzhangw/JIMU","owner":"mqzhangw","description":"一种简单有效的android组件化方案，支持组件的代码资源隔离、单独调试、集成调试、组件交互、UI跳转、生命周期等完整功能。","archived":false,"fork":false,"pushed_at":"2021-06-13T15:55:29.000Z","size":1313,"stargazers_count":2426,"open_issues_count":15,"forks_count":385,"subscribers_count":73,"default_branch":"master","last_synced_at":"2025-04-14T13:08:37.223Z","etag":null,"topics":["android-application","android-architecture","android-component"],"latest_commit_sha":null,"homepage":"","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/mqzhangw.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2017-08-21T11:15:13.000Z","updated_at":"2025-04-13T09:43:08.000Z","dependencies_parsed_at":"2022-08-10T01:29:35.389Z","dependency_job_id":null,"html_url":"https://github.com/mqzhangw/JIMU","commit_stats":null,"previous_names":[],"tags_count":8,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mqzhangw%2FJIMU","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mqzhangw%2FJIMU/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mqzhangw%2FJIMU/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mqzhangw%2FJIMU/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/mqzhangw","download_url":"https://codeload.github.com/mqzhangw/JIMU/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":254301433,"owners_count":22047904,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["android-application","android-architecture","android-component"],"created_at":"2024-09-24T20:24:21.165Z","updated_at":"2025-05-15T08:07:16.593Z","avatar_url":"https://github.com/mqzhangw.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"## JIMU\n\n[![PRs Welcome](https://img.shields.io/badge/PRs-welcome-brightgreen.svg)](https://github.com/luojilab/DDComponentForAndroid/pulls)\n[![License](https://img.shields.io/badge/License-Apache%202.0-orange.svg)](https://github.com/luojilab/DDComponentForAndroid/blob/master/LICENSE) \n\n### 项目介绍\nJIMU（积木）是一套Android组件化框架，支持组件的代码资源隔离、单独调试、集成调试、组件交互、UI跳转、生命周期等完整功能。\n\n取名为JIMU（积木），其含义是应用这套框架可以做到组件之间的完全隔离，每个组件可以单独运行，同时又可以通过“接口”任意拼接成一个完成APP，这种能力就是我们实施组件化的最终目的。\n\n### 最新版本\n\n\u003e 2021-06-10补充：\n\u003e 因为我的错误操作，导致发布到MavenCentral的版本：\n\u003e \n\u003e * build-gradle：1.3.5\n\u003e * componentlib: 1.3.3\n\u003e * router-anno-compiler: 1.0.1 \n\u003e 均出现了Pom文件错误，遗失了dependency，再问题被修正前，可以按照hotfix-bad-pom分支的内容，做紧急修复。致歉 -- leobert\n\n\u003e 2021-05-23补充：\n\u003e 受JFrog运营策略影响，项目重新发布到MavenCentral，注意仓库变更\n\n[release-note\u0026change-logs](https://github.com/mqzhangw/JIMU/releases) 关注版本变更以及注意事项是个好习惯。\n\n模块|build-gradle|componentlib|router-anno-compiler|router-annotation\n---|---|---|---|---\n最新版本|[![Download](https://img.shields.io/maven-central/v/io.github.leobert-lan/jimu-build-gradle.svg?label=Maven%20Central)](https://search.maven.org/artifact/io.github.leobert-lan/jimu-build-gradle)|[![Download](https://img.shields.io/maven-central/v/io.github.leobert-lan/jimu-componentlib.svg?label=Maven%20Central)](https://search.maven.org/artifact/io.github.leobert-lan/jimu-componentlib)|[![Download](https://img.shields.io/maven-central/v/io.github.leobert-lan/jimu-router-anno-compiler.svg?label=Maven%20Central)](https://search.maven.org/artifact/io.github.leobert-lan/jimu-router-anno-compiler)|[![Download](https://img.shields.io/maven-central/v/io.github.leobert-lan/jimu-router-annotation.svg?label=Maven%20Central)](https://search.maven.org/artifact/io.github.leobert-lan/jimu-router-annotation)\n\n\n### 实现功能：\n- 组件可以单独调试\n- 杜绝组件之前相互耦合，代码完全隔离，彻底解耦\n- 组件之间通过接口+实现的方式进行数据传输\n- 使用scheme和host路由的方式进行activity之间的跳转\n- 自动生成路由跳转路由表\n- 任意组件可以充当host，集成其他组件进行集成调试\n- 可以动态对已集成的组件进行加载和卸载\n- 支持kotlin组件\n- 组件独立运行的Manifest可以基于“壳”和组件原始的Manifest合并生成（from version 1.3.4）\n- 组件初始化支持按序（from version 1.3.4）这部分基于[Maat](https://github.com/leobert-lan/Maat), [参考博客](https://juejin.im/post/6884492604370026503/)\n\n\n### 原理解析\n组件化设计思路 [浅谈Android组件化](https://mp.weixin.qq.com/s/RAOjrpie214w0byRndczmg)\n\n原理解释请参考文章[Android彻底组件化方案实践](http://www.jianshu.com/p/1b1d77f58e84)\n\ndemo解读请参考文章[Android彻底组件化demo发布](http://www.jianshu.com/p/59822a7b2fad)\n\n按序初始化业务组件请参考文章[组件化：代码隔离也难不倒组件的按序初始化 ](https://juejin.im/post/6884492604370026503/)\n\n单项目，多module背景下，依赖方式的优雅实践探索：[三思系列：组件化场景下module依赖优雅实践方案 ](https://juejin.cn/post/6925629544946892813)\n\n### 使用指南\n#### 1、主项目引用编译脚本\n在根目录的gradle.properties文件中，增加属性：\n\n```ini\nmainmodulename=app\n```\n其中mainmodulename是项目中的host工程，一般为app\n\n添加mavenCentral仓库\n\n在根目录的build.gradle中增加配置\n\n```gradle\nbuildscript {\n    dependencies {\n        classpath 'io.github.leobert-lan:jimu-build-gradle:A.B.C'\n    }\n}\n```\n*A.B.C是版本号，最新的版本号可以参考上面的MavenCentral外链*\n\n为每个组件引入依赖库，如果项目中存在basiclib等基础库，可以统一交给basiclib引入\n\n```gradle\ncompile 'io.github.leobert-lan:jimu-componentlib:A.B.C'\n```\n*注意GroupId和ArtifactId在重新发布到MavenCentral后已经变更*\n\n```gradle\n'componentLib'        : 'io.github.leobert-lan:jimu-componentlib:{version}',\n'router_anno'         : 'io.github.leobert-lan:jimu-router-annotation:{version}',\n'router_anno_compiler': 'io.github.leobert-lan:jimu-router-anno-compiler:{version}',\n```\n\n#### 2、拆分组件为module工程\n在每个组件的工程目录下新建文件gradle.properties文件，增加以下配置：\n\n```ini\nisRunAlone=true\ndebugComponent=sharecomponent\ncompileComponent=sharecomponent\n```\n上面三个属性分别对应是否单独调试、debug模式下依赖的组件，release模式下依赖的组件。具体使用方式请解释请参见上文第二篇文章\n\n#### 3、应用组件化编译脚本\n在组件和host的build.gradle都增加配置：\n\n```gradle\napply plugin: 'com.dd.comgradle'\n```\n\n注意：不需要在引用com.android.application或者com.android.library\n\n同时增加以下extension配置：\n\n```gradle\ncombuild {\n    applicationName = 'com.luojilab.reader.runalone.application.ReaderApplication'\n    isRegisterCompoAuto = true\n}\n```\n组件注册还支持反射的方式，有关isRegisterCompoAuto的解释请参见上文第二篇文章\n\n##### 1.3.4新特性\n\n```\ndef projectRoot = project.getRootProject().rootDir.absolutePath\n\ncombuild {\n    applicationName = 'com.luojilab.reader.runalone.application.ReaderApplication'\n    isRegisterCompoAuto = false\n\n    originalManifest = projectRoot + \"/readercomponent/src/main/AndroidManifest.xml\"\n\n    runAloneManifest = projectRoot + \"/readercomponent/src/main/runalone/AndroidManifest.xml\"\n    targetManifest = projectRoot + \"/readercomponent/src/main/runalone/mergedManifest.xml\"\n    //如果不需要合并，改为false\n    enableManifestMerge = true\n}\n\n```\n\n增加了5个可配项目：\n\n* useMaat 默认为true，本处没有写，如果你不打算使用Maat，务必改为false，否则会织入代码并发生ClassNotFoundException\n* originalManifest 原始manifest文件路径\n* runAloneManifest 一个壳manifest，用于指定独立运行时额外需要的权限、Application配置，启动Activity、额外的四大组件，metadata\n* targetManifest 合并后输出的manifest，需要先创建文件，runalone使用的manifest；*如不先创建会影响gradle任务，被认为是一个缺失manifest的Component！*\n* enableManifestMerge 如果是true，则会在合适的时机执行manifest合并功能，并且插件中增加的如：runaloneMergeDebugManifest等任务会执行合并，否则该任务并不会合并manifest文件\n\n#### 4、混淆\n在混淆文件中增加如下配置\n\n```\n-keep interface * {\n  \u003cmethods\u003e;\n}\n-keep class com.luojilab.component.componentlib.** {*;}\n-keep class com.luojilab.gen.router.** {*;}\n-keep class * implements com.luojilab.component.componentlib.router.ISyringe {*;}\n-keep class * implements com.luojilab.component.componentlib.applicationlike.IApplicationLike {*;}\n\n```\n\n*注意：com.luojilab.component.componentlib和com.luojilab.gen.router包可能在项目迁移的过程中发生过或即将发生变化，文档更新不一定及时，请手工确认一下生成类的包路径。*\n\n关于如何进行组件之间数据交互和UI跳转，请参看 [Wiki](https://github.com/mqzhangw/JIMU/wiki)\n关于消息中间件，请参考[v1.3.3releaseNote](https://github.com/mqzhangw/JIMU/releases/tag/v1.3.3)\n\n\n### 组件化讨论群\nJIMU的讨论群，群号693097923，欢迎大家加入：\n\n![进群请扫码](https://upload-images.jianshu.io/upload_images/6650461-6adc3ed96ebd8d70.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)\n\nPS:最近千人群满了，建议一些基础性问题仔细琢磨下文章，比较麻烦的问题提issue求助。\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmqzhangw%2Fjimu","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmqzhangw%2Fjimu","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmqzhangw%2Fjimu/lists"}