Kotlin + Flow 实现
支持 模 块化,按模块加载任务可 指定 工作 进程名称 ,main表示 仅在主 进程运行,all表示 在 所有 进程运行,默 认值all可 指定 任 务仅在 工作 线程执行可 指定 任 务仅在 调试模 式 执行可 指定 任 务在满足合 规条件 后 执行可 指定 任 务优先 级,决定同 模 块内无依赖同步 任 务的执行顺序可 指定 依 赖任务列表 ,能 检测循环依赖使用 Flow 调度任 务有 耗时统计
repositories {
maven { url "https://gitee.com/ezy/repo/raw/cosmo/"}
}
dependencies {
implementation "me.reezy.cosmo:init:0.8.0"
ksp "me.reezy.cosmo:init-ksp:0.8.0"
// 使用 init-startup 代替 init 可 以利用 Jetpack Startup 库自动初始 化
// 无需在 Application.onCreate 调用 InitManager.init()
implementation "me.reezy.cosmo:init-startup:0.8.0"
}
apply plugin: 'com.google.devtools.ksp'
ksp {
arg("moduleName", "YOUR_MODULE_NAME")
arg("packageName", "GENERATED_PACKAGE_NAME")
}
简单
InitManager.launch(app, debugMode, generatedPackageName, modules) {
add("task1") {
}
add("task2", depends = setOf(InitManager.USER_GRANTED)) {
}
add("task3", depends = setOf("task1")) {
}
}
@Init
InitTask
@Init
class OneInit : InitTask {
override fun execute(app: Application) {
Log.e(TAG, "this is ${javaClass.simpleName} in ${Thread.currentThread().name}")
}
}
@Init
@Target(AnnotationTarget.CLASS)
@Retention(AnnotationRetention.SOURCE)
annotation class Init(
val process: String = "main", // 指定 工作 进程名称 ,main 表示 仅在主 进程运行,all 表示 在 所有 进程运行
val leading: Boolean = false, // 是 否 前 置 任 务,前 置 任 务全部 执行完成 后 才 开始调度其它任 务
val background: Boolean = false, // 是 否 在 工作 线程执行任 务
val manual: Boolean = false, // 是 否 需要 手 动完成
val debugOnly: Boolean = false, // 是 否 仅在 DEBUG 模 式 执行任 务
val depends: Array<String> = [], // 依 赖的任 务列表
val priority: Short = 0,
)
kspInitLoader_$moduleName
),TaskList
class Task(
val name: String,
val leading: Boolean = false, // 是 否 前 置 任 务,前 置 任 务全部 执行完成 后 才 开始调度其它任 务
val background: Boolean = false, // 是 否 在 工作 线程执行任 务
val manual: Boolean = false, // 是 否 需要 手 动完成
val priority: Int = 0, // 任 务运行 的 优先级,值小的 先 执行
val depends: Set<String> = setOf(), // 依 赖的任 务列表
val block: (TaskInterface) -> Unit = {},
) {
val children: MutableSet<Task> = mutableSetOf() // 子 任 务列表
}
TaskList
负责持 有 和 添加 任 务TaskDag
负责调度任 务,支持 添加 开关任 务(没 有 业务仅作为开关,可 手 动触发完成 ,并偿试执行 其子任 务)- 无依赖的异步
任 务,在 子 线程并行执行 - 无依赖的
同 步 任 务,在 主 线程顺序执行 有 依 赖的任 务,确保无循环依赖,且被依 赖的任 务先执行
- 无依赖的异步
InitManager
负责找到各 模 块的任 务加载器并开始 启动初 始 化 ,它使用 了 一个合规开关来使相关任务在确定合规后执行
The Component is open-sourced software licensed under the Apache license.