安卓移动架构04-组件化与Arouter

移动架构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

喜欢请点赞,谢谢!

你可能感兴趣的:(安卓移动架构04-组件化与Arouter)