Skip to content
[email protected] edited this page Aug 12, 2024 · 54 revisions

前言

本项目后面只会修复 bug 不会有功能的升级了. KComponent 也能间接的支持到 Java 的. 所以各位尽可能的用 KComponent

视频讲解(比较久之前的了, 建议看下文文档)

特殊说明!!!

  • app 模块在项目中既是一个壳工程也是一个业务模块.这点务必注意
  • App 会包含其他所有的业务模块
  • 而一般工程中会有一个 "BaseModule" 的基础业务模块,每一个业务模块都会依赖 "BaseModule"

依赖

下面所有的 <version> 请替换成上面的版本号

(工程)Project 级别的 build.gradle 中添加 maven 地址:

maven { url 'https://jitpack.io' }

在基础业务模块 BaseModule 或者每一个业务模块中添加 Component 的依赖使用.

//依赖:下面三种选择,选适合自己的一种即可

// -------------------------------------- 基础版本 --------------------------------------
api 'com.github.xiaojinzi123.Component:component-impl:<version>'
  
// ------------------------------------ RxJava2版本 ------------------------------------
// RxJava2 版本. 需要特别注意:RxJava2 的依赖需要自行在项目中添加依赖. 内部依赖是 compileOnly 的方式
api 'com.github.xiaojinzi123.Component:component-impl-rx:<version>'
api io.reactivex.rxjava2:rxjava:<2.x.x> // 这句记得在自己项目中依赖
  
// -------------------------------------- 协程版本 --------------------------------------
// 协程版本. 需要特别注意:协程的依赖需要自行在项目中添加依赖. 内部依赖是 compileOnly 的方式
api 'com.github.xiaojinzi123.Component:component-impl-ktx:<version>'
api 'org.jetbrains.kotlinx:kotlinx-coroutines-core:x.x.x' // 这句记得在自己项目中依赖

配置每一个业务组件(包括app)

配置每一个业务组件的 Host 名称和模块的加载优先级

下面配置的 HOST 的值可以是随便的一个名字,你只要保证每一个 Module 的名称是唯一的就可以了.

不一定和 Module 名称一样

    defaultConfig {
        ......
        javaCompileOptions {
            annotationProcessorOptions {
                // 配置业务模块的模块名称
                arguments += [
                    "HOST"     : project.getName(),
                    "Priority" : "0", // 这个字符串内必须是数字类型的. 表示模块的优先级, 值越大, 越先加载
                ]
            }
        }
    }

使用 Kotlin Kapt 1.5.20 请注意

由于 kapt 忽略了 javaCompilerOptions. 所以上一步配置模块名称的方式得变更一下

具体请移步 https://github.com/xiaojinzi123/Component/issues/98

kapt {
    arguments {
        arg("HOST", project.getName())
        arg("Priority", "0")
    }
}

必须配置生命周期类

v1.9.6 开始必须配置, 并且之前版本因为 kapt 升级导致注册失败. 所以强烈建议任何版本都配置 点我配置

每个业务组件中添加注解驱动器

annotationProcessor "com.github.xiaojinzi123.Component:component-compiler:<version>"

如果你的 build.gradle 中配置了 apply plugin: 'kotlin-android' 那你应该使用 kapt 而不是 annotationProcessor。如下:

kapt "com.github.xiaojinzi123.Component:component-compiler:<version>"

壳工程 AppApplication 配置如下

分两种方式,字节码加载方式反射方式,选一种即可。

特别注意:字节码加载方式和 Google 的 App Bundle 不兼容. 如果你使用了 App Bundle 请使用下面的反射方式

  1. 字节码加载方式
// 初始化
Component.init(BuildConfig.DEBUG, Config.with(this)
    // optimizeInit 表示是否使用 ASM 字节码技术加载模块, 默认是 false
    // 如果是 true,则下一步 Gradle 插件必选
    // 如果是 false,则可以忽略下一步 Gradle 插件
    .optimizeInit(true)
    // 自动加载所有模块, 打开此开关后下面无需手动注册了
    // 该配置需要 optimizeInit(true) 才会生效
    .autoRegisterModule(true) // 1.7.9+
    .build()
);
// 如果你依赖了 rx 版本,需要配置这句代码,否则删除这句
RxErrorIgnoreUtil.ignoreError(); 
// Debug 的包开启检查
if (BuildConfig.DEBUG) {
    // 框架还带有检查重复的路由和重复的拦截器等功能,在 `debug` 的时候开启它
    Component.check();
}
  1. 使用反射的方式加载模块
// 初始化
Component.init(BuildConfig.DEBUG, Config.with(this).build());
// 如果你依赖了 rx 版本,需要配置这句代码,否则删除这句
RxErrorIgnoreUtil.ignoreError(); 
// 注册其他业务模块,注册的字符串是上面各个业务模块配置在 build.gradle 中的 HOST
ModuleManager.getInstance().registerArr("component1","component2","user","help");
// 让框架在 Debug 的时候检查.
if (BuildConfig.DEBUG) {
    // 框架还带有检查重复的路由和重复的拦截器等功能,在 `debug` 的时候开启它
    Component.check();
}

Gradle 插件(可选)

如果你上一步 optimizeInit(true) 传入的是 true, 那么你必须配置此 Gradle 插件

在工程级别的 build.gradle 中添加 classpath (java7 或者 java8 选择其一)

classpath "com.github.xiaojinzi123.Component:component-plugin:<version>"
// 如果想使用最新的 toml 来管理. 可以查看 [#143 Issue](https://github.com/xiaojinzi123/Component/issues/143)

在壳工程 app 的 builde.gradle 中配置插件

// 这个插件必须在 apply plugin: 'com.android.application' 的下面, 在其他插件的前面!!!!!!
apply plugin: 'com.xiaojinzi.component.plugin'

混淆配置

# 小金子组件化框架 不要警告
-dontwarn com.xiaojinzi.component.**
# 所有本包下面的类和接口都不混淆
-keep class com.xiaojinzi.component.** {*;}
-keep interface com.xiaojinzi.component.** {*;}
#这些是让被标记的类不被混淆
-keep @com.xiaojinzi.component.anno.InterceptorAnno class * {*;}
-keep @com.xiaojinzi.component.anno.GlobalInterceptorAnno class * {*;}
-keep @com.xiaojinzi.component.anno.ConditionalAnno class * {*;}
-keep @com.xiaojinzi.component.anno.FragmentAnno class * {*;}
-keep @com.xiaojinzi.component.anno.ServiceAnno class * {*;}
-keep @com.xiaojinzi.component.anno.support.ComponentGeneratedAnno class * {*;}
-keep @com.xiaojinzi.component.anno.router.RouterApiAnno interface * {*;}
#保留生成的 Router Api
-keep class **.**RouterApiGenerated {*;}
#几个用户自定义或者自动生成到其他包下的应该不混淆
-keep class * implements com.xiaojinzi.component.impl.RouterInterceptor{*;}
-keep class * implements com.xiaojinzi.component.support.IBaseLifecycle{*;}
-keep class * implements com.xiaojinzi.component.application.IApplicationLifecycle{*;}
-keep class * implements com.xiaojinzi.component.application.IComponentApplication{*;}
-keep class * implements com.xiaojinzi.component.support.Inject{*;}
Clone this wiki locally