對於NDK開發學習已經完結,並且成功的做出相應的案例,銀行卡/身份證卡號識別,現在呢,偉大的學習路程又要開始了,接下來就是要學習系統源碼framework相關的知識。(只做個人學習總結,學過就留點痕跡~~,不做長篇大論,謝謝 ^_^ )
對於android源碼學習,最開始肯定要了解以下android系統是怎麼啓動的,這是對android系統啓動流程學習的個人總結,第一次學習源碼還是要有個輔助 比如:
- 源碼系列的書
- 源碼系列的博客
- 相關視頻講解
選擇一個學習方式,讓我們第一次學習不用像個無頭蒼蠅一樣亂撞,不知從何處學起。
我個人是根據書籍來學習的推薦大家: android進階xxx https://pan.baidu.com/s/1li1xj_XUDlpzAi4t79q3lA 提取碼: dft9
對於android系統啓動還是要有點c/c++基礎的,我只做總結,需要詳細學習瞭解的,可以去根據書籍來學習。
學習流程:
- 首先跟着書籍走一篇,把某整個模塊的流程摸清楚
- 在有了方向和大體流程,拋開書籍,自己根據源碼網站,再多看幾篇
- 一定要記住 源碼不是看 一篇 兩篇 就能懂得 時刻來安慰自己,生怕自己會放棄 ^_^
其實源碼在網頁上看 也聽方便的,可以按住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 對象,啓動引導/核心/其他 服務,