跳转至

apps\hub\src\main\java\cn\nfarms\hub\HubApp.kt

源码路径:apps\hub\src\main\java\cn\nfarms\hub\HubApp.kt · 51 行

package cn.nfarms.hub

import android.app.Application
import android.content.Context
import cn.nfarms.core.secure.Secrets
import cn.nfarms.core.secure.SoftwareSecrets
import cn.nfarms.core.store.AppFiles
import cn.nfarms.hub.engine.HarnessRunner
import cn.nfarms.hub.task.TaskHistory
import cn.nfarms.hub.task.TaskScheduler
import java.io.File

/**
 * 手工依赖容器。
 *
 * 为什么没有 Hilt/Dagger:五个 App 都是单 Activity + 少量单例,
 * 引入注解处理器要 KSP + 几十 MB 依赖,换来的只是「少写几行构造」。
 * 这里一个 `by lazy` 就够,而且**启动快** —— 手机上冷启动时间是真的体感。
 */
class HubApp : Application() {
    lateinit var container: Container
        private set

    override fun onCreate() {
        super.onCreate()
        container = Container(this)
    }
}

class Container(private val context: Context) {
    val files by lazy { AppFiles.of(context, "hub") }

    /** `files/nfarms` 的绝对路径前缀 —— 界面要显示相对路径。 */
    fun filesDirPath(): String = context.filesDir.path

    val secrets: Secrets by lazy { SoftwareSecrets(context.packageName) }

    /** 模型/产物的根目录。 */
    val modelsDir: File by lazy { files.media("models").also { it.mkdirs() } }
    val outDir: File by lazy { files.media("out").also { it.mkdirs() } }
    val workDir: File by lazy { files.media("work").also { it.mkdirs() } }

    val scheduler by lazy {
        TaskScheduler(workDir, TaskHistory(File(files.root(), "task-history.json")))
    }

    val harness by lazy { HarnessRunner(workDir) }

    fun ctx(): Context = context
}