源碼學習總結《1》Android 系統啓動流程

對於NDK開發學習已經完結,並且成功的做出相應的案例,銀行卡/身份證卡號識別,現在呢,偉大的學習路程又要開始了,接下來就是要學習系統源碼framework相關的知識。(只做個人學習總結,學過就留點痕跡~~,不做長篇大論,謝謝 ^_^ )

對於android源碼學習,最開始肯定要了解以下android系統是怎麼啓動的,這是對android系統啓動流程學習的個人總結,第一次學習源碼還是要有個輔助 比如:

  1. 源碼系列的書
  2. 源碼系列的博客
  3. 相關視頻講解

選擇一個學習方式,讓我們第一次學習不用像個無頭蒼蠅一樣亂撞,不知從何處學起。

我個人是根據書籍來學習的推薦大家: android進階xxx  https://pan.baidu.com/s/1li1xj_XUDlpzAi4t79q3lA   提取碼: dft9

對於android系統啓動還是要有點c/c++基礎的,我只做總結,需要詳細學習瞭解的,可以去根據書籍來學習。

學習流程:

  1. 首先跟着書籍走一篇,把某整個模塊的流程摸清楚
  2. 在有了方向和大體流程,拋開書籍,自己根據源碼網站,再多看幾篇
  3. 一定要記住 源碼不是看 一篇 兩篇 就能懂得 時刻來安慰自己,生怕自己會放棄 ^_^

其實源碼在網頁上看 也聽方便的,可以按住ctrl鍵去查看索引的,看起來也是挺方便。推薦網站:http://androidxref.com/

根據自己情況去選擇源碼的版本從 1.6 - xxx 都有。 

 

系統啓動流程總結

註釋:

[*1] init.rc 文件是一個android初始化語言腳本(android init language),
裏面保存了service的命令:
格式 service + service name + service path + 屬性。
[*2] 調用init.cpp的main方法創建啓動所需要的文件夾和掛載文件,解析init.rc文件,
得到啓動service的名字/路徑/屬性等。利用ServiceParser解析service初始化腳本。
[*3] AndroidRunTime.start ("com.android.internal.os.Zygoteinit", args, zygote);
傳遞java層的Zygoteinit的包名到AndroidRunTime中。
[*4] 1.啓動虛擬機,2.爲虛擬機註冊JNI方法,3.利用JNI方法把com.android.internal.os.Zygoteinit 
轉化-> com/android/internal/os/Zygoteinit並且查找Zygoteinit類並調用Zygoteinit的main方法
(這樣 Zygote 就從 Native 層進入了 Java 框架層)。
[*5] 等待systemservice的進程創建完成之後,調用socket的 runSelectLoop(abiList)方法循環
等待AMS請求來創建新的應用進程。
[*6] 調用Looper.prepareMainLooper()創建Looper消息,加載動態.so庫,創建系統Context 
和 SystemServiceManager 對象,啓動引導/核心/其他 服務,

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章