kotlin源碼結(jié)構(gòu)層次詳解
協(xié)程源碼的結(jié)構(gòu)
在研究Kotlin源碼之前,得先搞懂Kotlin源碼結(jié)構(gòu)分布。不然找不到該看哪里的代碼??丛创a之前當(dāng)然先得有一個(gè)目標(biāo),最好是帶著這個(gè)目標(biāo)去看源碼才比較有針對(duì)性,抓主流程,不然可能會(huì)陷入浩瀚的源碼細(xì)節(jié)中。
協(xié)程源碼,按道理可以分成2個(gè)倉庫,一個(gè)是Kotlin倉庫,一個(gè)是Kotlin協(xié)程倉庫。
- Kotlin倉庫 https://github.com/JetBrains/kotlin
- 協(xié)程倉庫 kotlinx.coroutines https://github.com/Kotlin/kotlinx.coroutines
Kotlin倉庫中定義了協(xié)程的基礎(chǔ)元素,這些基礎(chǔ)元素非常關(guān)鍵,它們是構(gòu)建協(xié)程的基礎(chǔ)。而協(xié)程倉庫相當(dāng)于是用Kotlin倉庫中定義的基礎(chǔ)元素來實(shí)現(xiàn)協(xié)程的邏輯。
Kotlin協(xié)程源碼分為3層:
- 基礎(chǔ)層:Kotlin庫中定義的協(xié)程基礎(chǔ)元素。比如CancellationException、CombinedContext、Continuation、ContinuationInterceptor、CoroutineContext、SafeContinuation等。
- 中間層:協(xié)程倉庫中,協(xié)程框架的通用邏輯kotlinx.coroutine-common。比如Job、Deferred、Select、Channel、Flow。
- 平臺(tái)層:協(xié)程倉庫中,協(xié)程在特定平臺(tái)的實(shí)現(xiàn)。如JVM、JS、Native。
下面,我們來詳細(xì)了解一下這些層是怎么分布的。
基礎(chǔ)層
Kotlin庫中,協(xié)程的基礎(chǔ)層具體位置是在/kotlin/libraries/stdlib/src/kotlin/coroutines/
里面。官方把這些基礎(chǔ)元素放標(biāo)準(zhǔn)庫里面,是為了解耦。
- 通過這些基礎(chǔ)元素可以組合成各種協(xié)程框架,雖然目前是官方的協(xié)程框架組合的最好。
- 在基礎(chǔ)層定義好了API之后,協(xié)程庫在各自的平臺(tái)層才好有規(guī)可循,在這些API下面開發(fā)平臺(tái)相關(guān)的代碼。
中間層
在kotlin.coroutines庫中的/kotlinx.coroutines/kotlinx-coroutines-core/common/
子模塊下,是一些公共的邏輯。比如launch、async、withContext、Deferred、Job、NonCancellable、Channel、Flow、AbstractCoroutine,這些東西是對(duì)基礎(chǔ)層的元素進(jìn)行的封裝,使上手協(xié)程更容易。
在這些公共邏輯的源碼里,是不涉及平臺(tái)相關(guān)的邏輯的。
平臺(tái)層
因?yàn)镵otlin是跨平臺(tái)的,所以它的平臺(tái)相關(guān)的邏輯又分為了js、jvm、native,它們的目錄與common平級(jí),分別是:
js:kotlinx-coroutines-core/js/
jvm:kotlinx-coroutines-core/jvm/
native:kotlinx-coroutines-core/native/
我們重點(diǎn)關(guān)注一下jvm的就行,下面是jvm目錄下的代碼,其他平臺(tái)也需要實(shí)現(xiàn)其自己的線程池、事件循環(huán)、異步任務(wù)等。
. ├── AbstractTimeSource.kt ├── Builders.kt ├── CoroutineContext.kt ├── CoroutineExceptionHandlerImpl.kt ├── Debug.kt ├── DebugStrings.kt ├── DefaultExecutor.kt ├── Dispatchers.kt ├── EventLoop.kt //事件循環(huán) ├── Exceptions.kt ├── Executors.kt ├── Future.kt ├── Interruptible.kt ├── Runnable.kt //java.lang.Runnable ├── SchedulerTask.kt ├── ThreadContextElement.kt //線程池 ├── ThreadPoolDispatcher.kt ├── channels │?? ├── Actor.kt │?? └── TickerChannels.kt ├── debug │?? ├── AgentPremain.kt │?? └── internal │?? ├── AgentInstallationType.kt │?? ├── ConcurrentWeakMap.kt │?? ├── DebugCoroutineInfo.kt │?? ├── DebugCoroutineInfoImpl.kt │?? ├── DebugProbes.kt │?? ├── DebugProbesImpl.kt │?? ├── DebuggerInfo.kt │?? └── StackTraceFrame.kt ├── flow │?? └── internal │?? ├── FlowExceptions.kt │?? └── SafeCollector.kt ├── internal │?? ├── Concurrent.kt │?? ├── ExceptionsConstructor.kt │?? ├── FastServiceLoader.kt │?? ├── InternalAnnotations.kt │?? ├── LocalAtomics.kt │?? ├── MainDispatchers.kt │?? ├── ProbesSupport.kt │?? ├── ResizableAtomicArray.kt │?? ├── StackTraceRecovery.kt │?? ├── Synchronized.kt │?? ├── SystemProps.kt │?? ├── ThreadContext.kt │?? └── ThreadLocal.kt //java.lang.ThreadLocal └── scheduling ├── CoroutineScheduler.kt ├── Deprecated.kt ├── Dispatcher.kt ├── Tasks.kt └── WorkQueue.kt
以上就是kotlin源碼結(jié)構(gòu)層次詳解的詳細(xì)內(nèi)容,更多關(guān)于kotlin源碼結(jié)構(gòu)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Android操作存放在assets文件夾下SQLite數(shù)據(jù)庫的方法
這篇文章主要介紹了Android操作存放在assets文件夾下SQLite數(shù)據(jù)庫的方法,實(shí)例分析了Android操作SQLite數(shù)據(jù)庫的相關(guān)技巧,需要的朋友可以參考下2015-06-06解決Eclipse創(chuàng)建android項(xiàng)目無法正常預(yù)覽布局文件問題的方法
這篇文章主要介紹了解決Eclipse創(chuàng)建android項(xiàng)目無法正常預(yù)覽布局文件問題的方法,需要的朋友可以參考下2015-12-12SwipeRefreshLayout+RecyclerView實(shí)現(xiàn)上拉刷新和下拉刷新功能
這篇文章主要介紹了SwipeRefreshLayout+RecyclerView實(shí)現(xiàn)上拉刷新和下拉刷新功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-01-01android計(jì)時(shí)器,時(shí)間計(jì)算器的實(shí)現(xiàn)方法
android計(jì)時(shí)器,時(shí)間計(jì)算器的實(shí)現(xiàn)方法,需要的朋友可以參考一下2013-03-03Android應(yīng)用中使用ViewPager和ViewPager指示器來制作Tab標(biāo)簽
這篇文章主要介紹了Android中使用ViewPager和ViewPager指示器來制作Tab標(biāo)簽的方法,ViewPager指示器ViewPageIndicator是一個(gè)開源庫,文中舉了一個(gè)仿網(wǎng)易新聞客戶端Tab標(biāo)簽的例子,需要的朋友可以參考下2016-03-03android studio2.3如何編譯動(dòng)態(tài)庫的過程詳解
這篇文章主要給大家介紹了關(guān)于android studio 2.3如何編譯動(dòng)態(tài)庫的過程,文中通過示例代碼介紹的非常詳細(xì),對(duì)各位Android開發(fā)者們具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面跟著小編來一起學(xué)習(xí)學(xué)習(xí)吧。2017-08-08