{"id":13428792,"url":"https://github.com/idisfkj/android-startup","last_synced_at":"2026-01-14T02:30:40.205Z","repository":{"id":38364163,"uuid":"281804607","full_name":"idisfkj/android-startup","owner":"idisfkj","description":"🔥The Android Startup library provides a straightforward, performant way to initialize components at the application startup. Both library developers and app developers can use Android Startup to streamline startup sequences and explicitly set the order of initialization.","archived":false,"fork":false,"pushed_at":"2022-02-09T01:39:53.000Z","size":498,"stargazers_count":1619,"open_issues_count":4,"forks_count":159,"subscribers_count":20,"default_branch":"master","last_synced_at":"2025-03-16T01:33:52.908Z","etag":null,"topics":["android","android-startup","async","kotlin","manifest","multi-process","startup","thread"],"latest_commit_sha":null,"homepage":"https://rousetime.com","language":"Kotlin","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/idisfkj.png","metadata":{"files":{"readme":"README-ch.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2020-07-22T23:33:51.000Z","updated_at":"2025-03-10T15:50:06.000Z","dependencies_parsed_at":"2022-07-13T18:20:58.993Z","dependency_job_id":null,"html_url":"https://github.com/idisfkj/android-startup","commit_stats":null,"previous_names":[],"tags_count":9,"template":false,"template_full_name":null,"purl":"pkg:github/idisfkj/android-startup","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/idisfkj%2Fandroid-startup","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/idisfkj%2Fandroid-startup/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/idisfkj%2Fandroid-startup/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/idisfkj%2Fandroid-startup/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/idisfkj","download_url":"https://codeload.github.com/idisfkj/android-startup/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/idisfkj%2Fandroid-startup/sbom","scorecard":{"id":481456,"data":{"date":"2025-08-11","repo":{"name":"github.com/idisfkj/android-startup","commit":"86a6f70363ec2ac5a25429534b2ac8dde379decb"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":2.9,"checks":[{"name":"Maintained","score":0,"reason":"0 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Dangerous-Workflow","score":-1,"reason":"no workflows found","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"Code-Review","score":0,"reason":"Found 0/30 approved changesets -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"Token-Permissions","score":-1,"reason":"No tokens found","details":null,"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"SAST","score":0,"reason":"no SAST tool detected","details":["Warn: no pull requests merged into dev branch"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}},{"name":"Binary-Artifacts","score":9,"reason":"binaries present in source code","details":["Warn: binary detected: gradle/wrapper/gradle-wrapper.jar:1"],"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"Pinned-Dependencies","score":-1,"reason":"no dependencies found","details":null,"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"Vulnerabilities","score":10,"reason":"0 existing vulnerabilities detected","details":null,"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Info: FSF or OSI recognized license: Apache License 2.0: LICENSE:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Signed-Releases","score":-1,"reason":"no releases found","details":null,"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"Branch-Protection","score":0,"reason":"branch protection not enabled on development/release branches","details":["Warn: branch protection not enabled for branch 'master'"],"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}}]},"last_synced_at":"2025-08-19T16:44:56.104Z","repository_id":38364163,"created_at":"2025-08-19T16:44:56.105Z","updated_at":"2025-08-19T16:44:56.105Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28408711,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-14T01:52:23.358Z","status":"online","status_checked_at":"2026-01-14T02:00:06.678Z","response_time":107,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["android","android-startup","async","kotlin","manifest","multi-process","startup","thread"],"created_at":"2024-07-31T01:01:05.251Z","updated_at":"2026-01-14T02:30:40.190Z","avatar_url":"https://github.com/idisfkj.png","language":"Kotlin","funding_links":[],"categories":["Libraries","New Feature","Kotlin"],"sub_categories":[],"readme":"中文｜[English](README.md)\n\n# android-startup\n[![Author](https://img.shields.io/badge/Author-idisfkj-orange.svg)](https://idisfkj.github.io/archives/)\n[![Platform](https://img.shields.io/badge/platform-android-lightgrey.svg)](https://www.android.com/)\n[![API](https://img.shields.io/badge/API-15%2B-brightgreen.svg?style=flat)](https://android-arsenal.com/api?level=15)\n[![Language](https://img.shields.io/badge/language-kotlin-ff4081.svg)](https://kotlinlang.org/)\n[![Release](https://img.shields.io/github/v/release/idisfkj/android-startup)](https://github.com/idisfkj/android-startup/releases)\n[![Code Size](https://img.shields.io/github/languages/code-size/idisfkj/android-startup?color=%23CDDC39)]()\n[![License](https://img.shields.io/badge/license-Apache%202-green.svg)](https://www.apache.org/licenses/LICENSE-2.0)\n\n`android-startup`提供一种在应用启动时能够更加简单、高效的方式来初始化组件。开发人员可以使用`android-startup`来简化启动序列，并显式地设置初始化顺序与组件之间的依赖关系。\n与此同时`android-startup`支持**同步与异步等待**，并通过有向无环图[拓扑排序](https://github.com/idisfkj/android-startup/blob/master/android-startup/src/main/java/com/rousetime/android_startup/sort/TopologySort.kt)的方式来保证内部依赖组件的初始化顺序。\n\n下面是一张与google的[App Startup](https://developer.android.com/topic/libraries/app-startup)功能对比的表格。\n\n|指标|App Startup|Android Startup|\n|:---:|:------:| :------:|\n|手动配置| ✅ | ✅ |\n|自动配置| ✅ | ✅ |\n|依赖支持| ✅ | ✅ |\n|闭环处理| ✅ | ✅ |\n|线程控制| ❌ | ✅ |\n|异步等待| ❌ | ✅ |\n|依赖回调| ❌ | ✅ |\n|手动通知| ❌ | ✅ |\n|拓扑优化| ❌ | ✅ |\n|耗时统计| ❌ | ✅ |\n|线程优先级| ❌ | ✅ |\n|多进程| ❌ | ✅ |\n\n\u003e 开源不易，希望朋友小手一抖，右上角来个star，感谢🙏\n\n## 相关文章\n\n[我为何弃用Jetpack的App Startup?](https://juejin.im/post/6859500445669752846)\n\n[Android Startup实现分析](https://juejin.im/post/6871006041262260237)\n\n[Android Startup最新进展](https://mp.weixin.qq.com/s?__biz=MzIzNTc5NDY4Nw==\u0026mid=2247484784\u0026idx=1\u0026sn=435833fade53cfbe62bf5b3e98e60d59\u0026chksm=e8e0fce0df9775f65748debdfc1b8f5013970d92c7e76ea2c7436240438c278fb62bfbbc6cf3\u0026token=630713225\u0026lang=zh_CN#rd)\n\n## 添加依赖\n将下面的依赖添加到`build.gradle`文件中:\n\n```\nrepositories {\n    mavenCentral()\n}\n\ndependencies {\n    implementation 'io.github.idisfkj:android-startup:1.1.0'\n}\n```\n\n\u003e 依赖版本的更新信息: [Release](https://github.com/idisfkj/android-startup/releases)\n\n## 快速使用\n\n![](./images/android_startup_diagram.png)\n\nandroid-startup提供了两种使用方式，在使用之前需要先定义初始化的组件。\n\n### 定义初始化的组件\n每一个初始化的组件都需要实现[AndroidStartup\u003cT\u003e](https://github.com/idisfkj/android-startup/blob/master/android-startup/src/main/java/com/rousetime/android_startup/AndroidStartup.kt)抽象类，它实现了`Startup\u003cT\u003e`接口，它主要有以下四个抽象方法：\n\n* `callCreateOnMainThread(): Boolean`用来控制`create()`方法调时所在的线程，返回true代表在主线程执行。\n\n* `waitOnMainThread(): Boolean`用来控制当前初始化的组件是否需要在主线程进行等待其完成。如果返回true，将在主线程等待，并且阻塞主线程。\n\n* `create(): T?`组件初始化方法，执行需要处理的初始化逻辑，支持返回一个`T`类型的实例。\n\n* `dependenciesByName(): List\u003cString\u003e?`返回`String`类型的`list`集合。用来表示当前组件在执行之前需要依赖的组件。\n\n例如，下面定义一个`SampleFirstStartup`类来实现`AndroidStartup\u003cString\u003e`抽象类:\n\n```\nclass SampleFirstStartup : AndroidStartup\u003cString\u003e() {\n\n    override fun callCreateOnMainThread(): Boolean = true\n\n    override fun waitOnMainThread(): Boolean = false\n\n    override fun create(context: Context): String? {\n        // todo something\n        return this.javaClass.simpleName\n    }\n\n    override fun dependenciesByName(): List\u003cString\u003e? {\n        return null\n    }\n\n}\n```\n因为`SampleFirstStartup`在执行之前不需要依赖其它组件，所以它的`dependenciesByName()`方法可以返回空，同时它会在主线程中执行。\n\n\u003e 注意：️虽然`waitOnMainThread()`返回了`false`，但由于它是在主线程中执行，而主线程默认是阻塞的，所以`callCreateOnMainThread()`返回`true`时，该方法设置将失效。\n\n假设你还需要定义`SampleSecondStartup`，它依赖于`SampleFirstStartup`。这意味着在执行`SampleSecondStartup`之前`SampleFirstStartup`必须先执行完毕。\n\n```\nclass SampleSecondStartup : AndroidStartup\u003cBoolean\u003e() {\n\n    override fun callCreateOnMainThread(): Boolean = false\n\n    override fun waitOnMainThread(): Boolean = true\n\n    override fun create(context: Context): Boolean {\n        // 模仿执行耗时\n        Thread.sleep(5000)\n        return true\n    }\n\n    override fun dependenciesByName(): List\u003cString\u003e {\n        return listOf(\"com.rousetime.sample.startup.SampleFirstStartup\")\n    }\n\n}\n```\n在`dependenciesByName()`方法中返回了`com.rousetime.sample.startup.SampleFirstStartup`，所以它能保证`SampleFirstStartup`优先执行完毕。\n它会在子线程中执行，但由于`waitOnMainThread()`返回了`true`，所以主线程会阻塞等待直到它执行完毕。\n\n例如，你还定义了[SampleThirdStartup](https://github.com/idisfkj/android-startup/blob/master/app/src/main/java/com/rousetime/sample/startup/SampleThirdStartup.kt)与[SampleFourthStartup](https://github.com/idisfkj/android-startup/blob/master/app/src/main/java/com/rousetime/sample/startup/SampleFourthStartup.kt)\n\n### Manifest中自动配置\n第一种初始化方法是在Manifest中进行自动配置。\n\n在Android Startup中提供了`StartupProvider`类，它是一个特殊的content provider，提供自动识别在manifest中配置的初始化组件。\n为了让其能够自动识别，需要在`StartupProvider`中定义`\u003cmeta-data\u003e`标签。其中的`name`为定义的组件类，`value`的值对应为`android.startup`。\n\n```\n\u003cprovider\n    android:name=\"com.rousetime.android_startup.provider.StartupProvider\"\n    android:authorities=\"${applicationId}.android_startup\"\n    android:exported=\"false\"\u003e\n\n    \u003cmeta-data\n        android:name=\"com.rousetime.sample.startup.SampleFourthStartup\"\n        android:value=\"android.startup\" /\u003e\n\n\u003c/provider\u003e\n```\n你不需要将`SampleFirstStartup`、`SampleSecondStartup`与`SampleThirdStartup`添加到`\u003cmeta-data\u003e`标签中。这是因为在`SampleFourthStartup`中，它的`dependenciesByName()`中依赖了这些组件。`StartupProvider`会自动识别已经声明的组件中依赖的其它组件。\n\n### Application中手动配置\n第二种初始化方法是在Application进行手动配置。\n\n手动初始化需要使用到`StartupManager.Builder()`。\n\n例如，如下代码使用`StartupManager.Builder()`进行初始化配置。\n\n```\nclass SampleApplication : Application() {\n\n    override fun onCreate() {\n        super.onCreate()\n        StartupManager.Builder()\n            .addStartup(SampleFirstStartup())\n            .addStartup(SampleSecondStartup())\n            .addStartup(SampleThirdStartup())\n            .addStartup(SampleFourthStartup())\n            .build(this)\n            .start()\n            .await()\n    }\n}\n```\n完整的示例代码，你可以通过查看[app](https://github.com/idisfkj/android-startup/tree/master/app)获取。\n\n运行示例代码，控制台将会产生如下日志:\n\n1. 排序优化之后的初始化顺序\n\n```\n*****/com.rousetime.sample D/StartupTrack: TopologySort result:\n    |================================================================\n    |         order          |    [1]\n    |----------------------------------------------------------------\n    |        Startup         |    SampleFirstStartup\n    |----------------------------------------------------------------\n    |   Dependencies size    |    0\n    |----------------------------------------------------------------\n    | callCreateOnMainThread |    true\n    |----------------------------------------------------------------\n    |    waitOnMainThread    |    false\n    |================================================================\n    |         order          |    [2]\n    |----------------------------------------------------------------\n    |        Startup         |    SampleSecondStartup\n    |----------------------------------------------------------------\n    |   Dependencies size    |    1\n    |----------------------------------------------------------------\n    | callCreateOnMainThread |    false\n    |----------------------------------------------------------------\n    |    waitOnMainThread    |    true\n    |================================================================\n    |         order          |    [3]\n    |----------------------------------------------------------------\n    |        Startup         |    SampleThirdStartup\n    |----------------------------------------------------------------\n    |   Dependencies size    |    2\n    |----------------------------------------------------------------\n    | callCreateOnMainThread |    false\n    |----------------------------------------------------------------\n    |    waitOnMainThread    |    false\n    |================================================================\n    |         order          |    [4]\n    |----------------------------------------------------------------\n    |        Startup         |    SampleFourthStartup\n    |----------------------------------------------------------------\n    |   Dependencies size    |    3\n    |----------------------------------------------------------------\n    | callCreateOnMainThread |    false\n    |----------------------------------------------------------------\n    |    waitOnMainThread    |    false\n    |================================================================\n```\n\n2. 各组件初始化所消耗的时间\n\n```\n*****/com.rousetime.sample D/StartupTrack: startup cost times detail:\n    |=================================================================\n    |      Startup Name       |   SampleFirstStartup\n    | ----------------------- | --------------------------------------\n    |   Call On Main Thread   |   true\n    | ----------------------- | --------------------------------------\n    |   Wait On Main Thread   |   false\n    | ----------------------- | --------------------------------------\n    |       Cost Times        |   0 ms\n    |=================================================================\n    |      Startup Name       |   SampleSecondStartup\n    | ----------------------- | --------------------------------------\n    |   Call On Main Thread   |   false\n    | ----------------------- | --------------------------------------\n    |   Wait On Main Thread   |   true\n    | ----------------------- | --------------------------------------\n    |       Cost Times        |   5001 ms\n    |=================================================================\n    |      Startup Name       |   SampleThirdStartup\n    | ----------------------- | --------------------------------------\n    |   Call On Main Thread   |   false\n    | ----------------------- | --------------------------------------\n    |   Wait On Main Thread   |   false\n    | ----------------------- | --------------------------------------\n    |       Cost Times        |   3007 ms\n    |=================================================================\n    |      Startup Name       |   SampleFourthStartup\n    | ----------------------- | --------------------------------------\n    |   Call On Main Thread   |   false\n    | ----------------------- | --------------------------------------\n    |   Wait On Main Thread   |   false\n    | ----------------------- | --------------------------------------\n    |       Cost Times        |   102 ms\n    |=================================================================\n    | Total Main Thread Times |   5008 ms\n    |=================================================================\n```\n\n## 更多\n\n### 可选配置\n\n* [LoggerLevel](https://github.com/idisfkj/android-startup/blob/master/android-startup/src/main/java/com/rousetime/android_startup/model/LoggerLevel.kt): 控制Android Startup中的日志输出，可选值包括`LoggerLevel.NONE`, `LoggerLevel.ERROR` and `LoggerLevel.DEBUG`。\n\n* [AwaitTimeout](https://github.com/idisfkj/android-startup/blob/master/android-startup/src/main/java/com/rousetime/android_startup/model/StartupConfig.kt): 控制Android Startup中主线程的超时等待时间，即阻塞的最长时间。\n\n* [StartupListener](https://github.com/idisfkj/android-startup/blob/master/android-startup/src/main/java/com/rousetime/android_startup/StartupListener.kt): Android Startup监听器，所有组件初始化完成之后该监听器会被调用。\n\n* [OpenStatistic](https://github.com/idisfkj/android-startup/blob/master/android-startup/src/main/java/com/rousetime/android_startup/model/StartupConfig.kt): 控制Android Startup是否开启对各个任务的耗时统计。\n\n#### Manifest中配置\n使用这些配置，你需要定义一个类去实现`StartupProviderConfig`接口，并且实现它的对应方法。\n\n```\nclass SampleStartupProviderConfig : StartupProviderConfig {\n\n    override fun getConfig(): StartupConfig =\n        StartupConfig.Builder()\n            .setLoggerLevel(LoggerLevel.DEBUG) // default LoggerLevel.NONE\n            .setAwaitTimeout(12000L) // default 10000L\n            .setOpenStatistics(true) // default true\n            .setListener(object : StartupListener {\n                override fun onCompleted(totalMainThreadCostTime: Long, costTimesModels: List\u003cCostTimesModel\u003e) {\n                    // can to do cost time statistics.\n                }\n            })\n            .build()\n}\n```\n与此同时，你还需要在manifest中进行配置`StartupProviderConfig`。\n\n```\n\u003cprovider\n    android:name=\"com.rousetime.android_startup.provider.StartupProvider\"\n    android:authorities=\"${applicationId}.android_startup\"\n    android:exported=\"false\"\u003e\n\n    \u003cmeta-data\n        android:name=\"com.rousetime.sample.startup.SampleStartupProviderConfig\"\n        android:value=\"android.startup.provider.config\" /\u003e\n\n\u003c/provider\u003e\n```\n经过上面的配置，`StartupProvider`会自动解析`SampleStartupProviderConfig`。\n\n#### Application中配置\n在Application需要借助`StartupManager.Builder()`进行配置。\n\n```\noverride fun onCreate() {\n    super.onCreate()\n\n    val config = StartupConfig.Builder()\n        .setLoggerLevel(LoggerLevel.DEBUG)\n        .setAwaitTimeout(12000L)\n        .setListener(object : StartupListener {\n            override fun onCompleted(totalMainThreadCostTime: Long, costTimesModels: List\u003cCostTimesModel\u003e) {\n                // can to do cost time statistics.\n            }\n        })\n        .build()\n\n    StartupManager.Builder()\n        .setConfig(config)\n        ...\n        .build(this)\n        .start()\n        .await()\n}\n```\n\n### [AndroidStartup](https://github.com/idisfkj/android-startup/blob/master/android-startup/src/main/java/com/rousetime/android_startup/AndroidStartup.kt)\n\n* `createExecutor(): Executor`: 如果定义的组件没有运行在主线程，那么可以通过该方法进行控制运行的子线程。\n\n* `onDependenciesCompleted(startup: Startup\u003c*\u003e, result: Any?)`: 该方法会在每一个依赖执行完毕之后进行回调。\n\n* `manualDispatch(): Boolean`: 返回`true`时，代表需要手动去通知依赖自身的子组件; 需要配合`onDispatch()`来使用。\n\n* `onDispatch()`: 配合`manualDispatch()`使用，通知依赖自身的子组件，开始执行子组件的初始化逻辑。\n\n### [StartupCacheManager](https://github.com/idisfkj/android-startup/blob/master/android-startup/src/main/java/com/rousetime/android_startup/manager/StartupCacheManager.kt)\n\n* `hadInitialized(zClass: Class\u003cout Startup\u003c*\u003e\u003e)`: 检验对应的组件是否已经初始化完成。\n\n* `obtainInitializedResult(zClass: Class\u003cout Startup\u003c*\u003e\u003e): T?`: 获取对应已经初始化的组件所返回的结果。\n\n* `remove(zClass: Class\u003cout Startup\u003c*\u003e\u003e)`: 清除对应组件的初始化缓存结果。\n\n* `clear()`: 清除所有组件初始化的缓存结果。\n\n### [Annotation](https://github.com/idisfkj/android-startup/tree/master/android-startup/src/main/java/com/rousetime/android_startup/annotation)\n\n* ThreadPriority: 设置`Startup`初始化的线程优先级。\n\n* MultipleProcess: 设置`Startup`初始化时所在的进程。\n\n## 示例\n\n* [Sync And Sync](https://github.com/idisfkj/android-startup/blob/master/app/src/main/java/com/rousetime/sample/SampleCommonActivity.kt): 同步与同步依赖的场景\n\n* [Sync And Async](https://github.com/idisfkj/android-startup/blob/master/app/src/main/java/com/rousetime/sample/SampleCommonActivity.kt): 同步与异步依赖的场景\n\n* [Async And Sync](https://github.com/idisfkj/android-startup/blob/master/app/src/main/java/com/rousetime/sample/SampleCommonActivity.kt): 异步与同步依赖的场景\n\n* [Async And Async](https://github.com/idisfkj/android-startup/blob/master/app/src/main/java/com/rousetime/sample/SampleCommonActivity.kt): 异步与异步依赖的场景\n\n* [Async And Async Await Main Thread](https://github.com/idisfkj/android-startup/blob/master/app/src/main/java/com/rousetime/sample/SampleCommonActivity.kt): 异步与异步依赖在主线程等候的场景\n\n* [Manual Dispatch](https://github.com/idisfkj/android-startup/blob/master/app/src/main/java/com/rousetime/sample/SampleCommonActivity.kt): 手动通知依赖完成的场景\n\n* [Thread Priority](https://github.com/idisfkj/android-startup/blob/master/app/src/main/java/com/rousetime/sample/SampleCommonActivity.kt): 改变线程优先级的场景\n\n* [Multiple Processes](https://github.com/idisfkj/android-startup/blob/master/app/src/main/java/com/rousetime/sample/SampleCommonActivity.kt): 多进程初始化的场景\n\n## 实战测试\n[AwesomeGithub](https://github.com/idisfkj/AwesomeGithub)中使用了`Android Startup`，优化配置的初始化时间与组件化开发的配置注入时机，使用前与使用后时间对比:\n\n|状态|启动页面|消耗时间|\n|---|------| ------|\n|使用前|WelcomeActivity|420ms|\n|使用后|WelcomeActivity|333ms|\n\n## 联系我\n微信搜索公众号【Android补给站】或者扫描下方二维码\n\n![](./images/wx.jpg)\n\nQQ交流群\n\n\u003cimg src=\"./images/qq.png\" width = \"258\" height = \"353\" alt=\"\" align=center /\u003e\n\n## License\n请查看[LICENSE](https://github.com/idisfkj/android-startup/blob/master/LICENSE)。\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fidisfkj%2Fandroid-startup","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fidisfkj%2Fandroid-startup","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fidisfkj%2Fandroid-startup/lists"}