开源组件化方案JIMU
写在前面
公司为提高开发效率,降低模块之间的耦合,寻求一种高效、稳定的组件开发方案。有幸看到 JIMU ,现记录下使用步骤。
android studio 3.0之后,对模块的引入方式
一、模块划分
此方案把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_"
可单独调试的组件目录结构如下
runalone是固定写法,包含启动Activity和application,需要在Manifest中注册并指定theme。
service接口定义了组件对位提供数据的抽象方法。
applike是组件用于注册时使用的类,实现IApplicationLike接口,组件中唯一。
build-gradle插件ComCodeTransform类的transform()方法,会搜集所有IApplicationLike的实现类,达到自动注册的效果。
serviceimpl是对service接口的实现,至少有N+1个。
三、组件之间的跳转和传值
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;