移动架构04-组件化与Arouter
组件化是指让模块独立运行,并且自由调用其他模块的类。
大型项目中通常有很多模块,这些模快一般是library的形式,这样调试时就必须运行整个项目,很不方便。组件化就是让模块自由切换library和application,方便调试。另外,两个模块之间不能相互引用,这样就不能相互调用。组件化通过路由功能可以让他们相互调用。
一、独立运行
让模块独立运行就是让模块自由切换library和application,这需要在gradle中配置。
//根据isModule(定义在rootProject中)的值设置当前模式:集成或组件
if (isModule) {
apply plugin: 'com.android.application'
} else {
apply plugin: 'com.android.library'
}
android {
defaultConfig {
...
//添加一条 boolean类型的变量,用来指定当前模式:集成或组件.通过BuildConfig.isModule获取
buildConfigField("boolean", "isModule", String.valueOf(isModule))
//组件模式下,指定applicationId
if (isModule) {
applicationId appId['module1']
}
//资源配置
sourceSets {
main {
//指定manifest文件和java文件
if (isModule) {
manifest.srcFile 'src/main/module/AndroidManifest.xml'
java.srcDirs 'src/main/module/java', 'src/main/java'
} else {
manifest.srcFile 'src/main/AndroidManifest.xml'
}
}
}
}
}
总的来说,就是通过一个开关isModule来修改gradle的配置,切换模式与资源。
二、Arouter路由框架
路由功能使用阿里的Arouter。
配置Arouter时,需要在application模块(比如:DemoComponent1)和它依赖的library模块(比如:DemoComponent2)都进行配置。
1.添加依赖和配置
在application模块和library模块的build.gradle中添加如下配置:
android {
defaultConfig {
...
//设置moduleName,不添加会报错
javaCompileOptions {
annotationProcessorOptions {
arguments = [ moduleName : project.getName() ]
}
}
}
}
dependencies {
// 替换成最新版本, 需要注意的是api
// 要与compiler匹配使用,均使用最新版可以保证兼容
compile 'com.alibaba:arouter-api:x.x.x'
annotationProcessor 'com.alibaba:arouter-compiler:x.x.x'
...
}
2.初始化SDK
在application模块的Application中初始化ARouter
if (isDebug()) { // 这两行必须写在init之前,否则这些配置在init过程中将无效
ARouter.openLog(); // 打印日志
ARouter.openDebug(); // 开启调试模式(如果在InstantRun模式下运行,必须开启调试模式!线上版本需要关闭,否则有安全风险)
}
ARouter.init(mApplication); // 尽可能早,推荐在Application中初始化
3.添加注解
在application模块和library模块的需要路由的Activity中添加Route注解,注解必须设置两级,因为初始化路由模块是按分组进行的。
// 在支持路由的页面上添加注解(必选)
// 这里的路径需要注意的是至少需要有两级,/xx/xx
@Route(path = "/demo1/activityArouterDemo1")
public class ActivityArouterDemo1 extends AppCompatActivity {
...
}
4.发起路由操作
// 1. 应用内简单的跳转(通过URL跳转在'进阶用法'中)
ARouter.getInstance().build("/test/activity").navigation();
// 2. 跳转并携带参数
ARouter.getInstance().build("/test/1")
.withLong("key1", 666L)
.withString("key3", "888")
.withObject("key4", new Test("Jack", "Rose"))
.navigation();
5.添加混淆规则
-keep public class com.alibaba.android.arouter.routes.**{*;}
-keep class * implements com.alibaba.android.arouter.facade.template.ISyringe{*;}
# 如果使用了 byType 的方式获取 Service,需添加下面规则,保护接口
-keep interface * implements com.alibaba.android.arouter.facade.template.IProvider
# 如果使用了 单类注入,即不定义接口实现 IProvider,需添加下面规则,保护实现
-keep class * implements com.alibaba.android.arouter.facade.template.IProvider
6.使用 Gradle 插件实现路由表的自动加载
在根项目的build.gradle中添加arouter-register插件
buildscript {
repositories {
jcenter()
}
dependencies {
classpath "com.alibaba:arouter-register:1.0.0"
}
}
在application模块和library模块的build.gradle中应用arouter-register插件
apply plugin: 'com.alibaba.arouter'
可选使用,通过 ARouter 提供的注册插件进行路由表的自动加载,默认通过扫描 dex 的方式 进行加载。通过 gradle 插件进行自动注册(编译时注册),可以缩短初始化时间,解决应用加固导致无法直接访问 dex 文件,初始化失败的问题。需要注意的是,该插件必须搭配 api 1.3.0 使用!
最后
代码地址:https://gitee.com/yanhuo2008/AndroidCommon/tree/master/ToolRou
移动架构专题:https://www.jianshu.com/nb/25128604
喜欢请点赞,谢谢!