Kotlin + Flow 實現的 Android 應用初始化任務啟動庫

語言: CN / TW / HK

theme: channing-cyan

特性

Kotlin + Flow 實現的 Android 應用初始化任務啟動庫。

  • 支援模組化,按模組載入任務
  • 可指定工作程序名稱,main 表示僅在主程序執行,all 表示在所有程序執行,預設值all
  • 可指定任務僅在工作執行緒執行
  • 可指定任務僅在除錯模式執行
  • 可指定任務在滿足合規條件後執行
  • 可指定任務優先順序,決定同模組內無依賴同步任務的執行順序
  • 可指定依賴任務列表,能檢測迴圈依賴
  • 使用 Flow 排程任務
  • 僅200多行程式碼,簡單明瞭
  • 有耗時統計

引入依賴

專案地址:https://github.com/czy1121/init

``` groovy repositories { maven { url "https://gitee.com/ezy/repo/raw/android_public/"} } dependencies { implementation "me.reezy.init:init:0.9.0" kapt "me.reezy.init:init-compiler:0.9.0"

// 使用 init-startup 代替 init 可以利用 Jetpack Startup 庫自動初始化
// 無需在 Application.onCreate 呼叫 InitManager.init()
implementation "me.reezy.init:init-startup:0.9.0"

} ```

使用

AndroidManifest.xml<application> 裡新增模組

xml <meta-data android:name="modules" android:value="app" />

通過註解 @InitInitTask 介面定義一個任務

kotlin @Init class OneInit : InitTask { override fun execute(app: Application) { Log.e(TAG, "this is ${javaClass.simpleName} in ${Thread.currentThread().name}") } }

通過註解 @Init 的引數配置任務資訊

kotlin @Target(AnnotationTarget.CLASS) @Retention(AnnotationRetention.SOURCE) annotation class Init( val process: String = "all", // 指定工作程序名稱,main 表示僅在主程序執行,all 表示在所有程序執行 val background: Boolean = false, // 是否在工作執行緒執行任務 val debugOnly: Boolean = false, // 是否僅在 DEBUG 模式執行任務 val compliance: Boolean = false, // 是否需要合規執行 val depends: Array<String> = [], // 依賴的任務列表 val priority: Short = 0 // )

APT會按模組收集任務資訊並生成任務載入器(InitLoader_$moduleName),任務載入器用於新增任務到TaskList

kotlin class Task( val name: String, // APT收集的任務名稱格式為 "$moduleName:${clazz.simpleName}" val background: Boolean = false, // 是否在工作執行緒執行任務 val priority: Int = 0, // 程序執行的優先順序,值小的先執行 val depends: Set<String> = setOf(), // 依賴的任務列表,同模組只需指定"${clazz.simpleName}",跨模組需要指定 "$moduleName:${clazz.simpleName}" val block: () -> Unit = {}, // 待執行的任務 ) { val children: MutableSet<Task> = mutableSetOf() // 子任務列表 }

核心類

  • TaskList 負責持有和新增任務
  • TaskManager 負責排程任務,支援新增開關任務(沒有業務僅作為開關,可手動觸發完成,並償試執行其子任務)
  • 無依賴的非同步任務,在子執行緒並行執行
  • 無依賴的同步任務,在主執行緒順序執行
  • 有依賴的任務,確保無迴圈依賴,且被依賴的任務先執行
  • InitManager 負責找到各模組的任務載入器並開始啟動初始化,它使用了一個合規開關來使相關任務在確定合規後執行

可以不使用 InitManager 收集任務

```kotlin val taskList = TaskList(app).apply { add("task1") { }
add("task2", depends = setOf("t1")) { }
add("task3", depends = setOf("task1")) { }
}

val manager = TaskManager(taskList, setOf("t1")) manager.start()

// ...

// 完成開關任務t1 manager.trigger("t1") ```