1. 程式人生 > >【安卓本卓】Android系統原始碼篇之(一)原始碼獲取、原始碼目錄結構及原始碼閱讀工具簡介

【安卓本卓】Android系統原始碼篇之(一)原始碼獲取、原始碼目錄結構及原始碼閱讀工具簡介

前言

古人常說,“熟讀唐詩三百首,不會作詩也會吟”,說明了大量閱讀詩歌名篇對學習作詩有非常大的幫助。做開發也一樣,Android原始碼是全世界最優秀的Android工程師編寫的程式碼,也是Android開發中絕對的權威所在。Android系統開源,且佔據了當今手機系統世界的絕大部分江山,各大手機廠商要做手機系統定製,就必須對Android系統原始碼非常熟悉,這就要求他們的工程師們去熟讀原始碼。即使是純第三方App的開發者,要想成為Android開發真正的行家裡手,也必須對系統原始碼有一定的研究。本系列文章將記錄筆者學習Android原始碼的理解和心得,以此來和廣大的同行們進行交流和相互提升。

       本篇文章是這一系列的第一篇,將主要記錄或者介紹Android原始碼的獲取,系統原始碼的巨集觀結構及內容,原始碼閱讀工具推薦及使用方法等內容。主要內容如下:

        

一、獲取Android系統原始碼

        Android原始碼的獲取方式有許多,既可以在Windows下去獲取,也可以Linux下去下載,比較常見的方法是在Linux下用repo工具去下載。筆者使用的方式是在Windows7系統下安裝Ubuntu16.04雙系統,然後採用repo工具去獲取的原始碼。其中每一個步驟都可以在網上找到很多資料,筆者不贅述,也不自己探索方法,這裡僅記錄下成功安裝獲取原始碼過程中參考的網頁、主要步驟以及碰到的若干問題,以供讀者和筆者自己以後參考使用。基本操作步驟如下:

  1、在Win7中分割槽

        在Windows7中為Ubuntu系統分割槽,參考了【

Win7下安裝Ubuntu16.04成雙系統】中第一節分割槽步驟。Android系統原始碼未編譯前就有大約20-30G大小,編譯後更大,所以一定要預留足夠的空間。

  2、製作Ubuntu U盤系統啟動盤

        參看網頁【Ubuntu16.04安裝基礎入門教程】前5步。Ubutu映象檔案從Ubutu官網下載即可,不過需要注意的是,要先弄清楚下載32位還是64位的系統:在主系統Win7桌面檢視“計算機”圖示屬性,可以看到系統的位數,如下圖所示:

        

       所以咱們在選擇Ubuntu系統的時候也選擇64位的。這裡筆者也有一個疑問,既然這裡Ubuntu和Win7是獨立的雙系統,那麼應該沒有必要兩個系統的位數必須一致吧,這裡筆者沒有研究過,讀者可以去查資料探索一下,當然,選擇同樣的位數總是會比較保險一點。在Ubuntu下載版本中,結尾為amd64的版本為64位系統,結尾為i386的版本為32位系統。

  3、U盤啟動並安裝Ubuntu系統

       在BIOS boot中將預設的硬碟啟動修改為U盤啟動,然後重啟即可進入到Ubuntu的安裝介面,根據需要一步一步進行即可。至於如何進入到BIOS設定介面,不同的主機板快捷鍵不一樣,筆者這裡不詳述,讀者根據主機板型號百度即可。安裝成功後,記得修改回來為預設硬碟啟動。

  4、Ubuntu中獲取原始碼

        參考【Aosp|映象使用幫助|清華大學開源映象站】,筆者選擇的是“使用每月更新的初始化包”。原始碼比較大,所以下載需要好幾個小時的時間,所以最好在晚上下載,避開網路使用高峰期。

  5、碰到的問題記錄

    (1)安裝完Ubuntu後,再重啟時,系統選項中找不到原Win7系統。

         安裝好Ubuntu後,我們希望再啟動電腦的時候出現一個系統選項,選擇是進入原Win7系統還是新安裝的Ubuntu系統。如提問中描述,找不到Win7系統選項入口,就無法進入到原來的Win7系統中。這種情況,請參考【Win7系統安裝Ubuntu系統後,不能進入Win7】。筆者曾多次碰到過這個問題,以為是把原Win7系統給覆蓋掉了,走過不少的彎路,後來找到連結中的方法才解決。

二、Android原始碼目錄結構

Android系統原始碼內容實在太廣,其目錄結構也實在龐大,每位開發者也無法做到對每一塊都弄明白,工作中接觸的也只是其中的一小部分。以下只從巨集觀上對系統原始碼的一級目錄進行介紹,後續再慢慢完善更細緻的內容。

        

三、Android系統架構和原始碼

       在筆者以前的部落格【朝花夕拾】Android效能篇之(五)Android虛擬機器第二大點中簡單介紹過Android的系統架構,其實在Native Libraries層Linux Kernel層之間還有一層——HAL層,即Hardware Abstract Layer,硬體抽象層。在眾多介紹Android系統架構的展示圖中,有的版本顯示HAL,有的沒有,讀者知道有這一層就好了。如下為Android原始碼官網【AOSP:Android Open Source Project 】中Android系統架構圖,就展示HAL。

        

       對於Android系統架構每一層,Android原始碼結構中都對應分配了目錄。下圖展示了在Android原始碼一級目錄中,各框架層和部分目錄的對應關係:

        

        理解Android系統結構和Android系統原始碼的對應關係,有助於幫助咱們理解Anroid系統原始碼。當然,這幅思維導圖中只介紹了原始碼一級目錄和系統架構的對應關係,深入各個目錄,每個系統架構層還可以找到很多原始碼與之對應,讀者可以再深入研究研究。與此同時,同一個目錄下的原始碼,也可能包含多個系統架構層,比如,frameworks層中就有frameworks/base/packages/SystemUI這個目錄,眾所周知,SystemUI是一款系統App,是屬於應用層的。所以,對某個目錄的功能,也不能一概而論。

四、Android原始碼閱讀工具

       選擇好的原始碼閱讀工具,可以讓工作事半功倍。如今市面上有許多工具來輔助閱讀原始碼,有線上閱讀的,比如:AndroidXRef、Android SDK Search等;也有本地閱讀的,比如:Source Insight等。同時,Google也提供了官方網站,用於指導開發者使用原始碼:【AOSP文件網站(中文版)https://source.android.google.cn/

  1、AndroidXRef

        前文也說過,Android原始碼非常龐大,下載原始碼也是非常耗用時間。我們可能經常碰到需要臨時檢視原始碼,而當前裝置上沒有的情況。幸運的是,有一些線上閱讀原始碼的網站,給開發者帶來了很大的便利,AndroidXRef就是其中一款備受青睞的原始碼線上閱讀網站【網址:http://androidxref.com/】。在這裡,筆者簡單介紹一下該網站的基本使用。

    (1)檢視並選擇系統版本

       進入首頁後,可以看到Google釋出的各個系統版本,按照發布時間排序,包括版本別名,版本號,核心號等,如下圖所示,開發者可以根據需要點選進入對應的版本。

        

    (2)原始碼查詢主介面功能點

       

    (3)搜尋條件的解鎖及使用

      1)Full Search

       進行全文搜尋,屬於模糊查詢,忽略大小寫,會匹配所有的單詞、字串、識別符號以及數字等,包括註釋在內。如下圖所示,為全文搜尋“Activity”的結果,也顯示了所在檔案的路徑,可以點選進入對應的檔案。

       

      2)Definition

       搜尋符號定義相關的程式碼。如下所示,同樣輸入“Activity”後,顯示的搜尋結果,“Activity”都是作為包名、類名或定義型別,方法名等出現的,可以和上面Full Search結果做對比。多次嘗試搜尋的結果來看,這裡會區別大小寫,搜尋的也是整個單詞,這裡搜尋會更精準一些。

       

      3)Symbol

       符號搜尋,主要用於搜尋類中的成員變數等,也是精確查詢,如下圖所示,就是根據成員變數“FEATURE_NO_TITLE”搜尋的結果。

       

       4)File Path

       搜尋原始碼檔名或路徑中包含搜尋條件字串的檔案,忽略大小寫。如下所示,顯示了檔案路徑或檔名中包含了“Activity”的結果。

       

      5)History

       該條件暫時沒發現怎麼使用,有寫帖子上甚至直接說該條件沒用,這裡筆者不做說明,也不舉例了。

       該部分能夠幫助開發人員快速定位到想要檢視的程式碼,熟練使用,能極大地提高效率。上述介紹的都是單一條件搜尋,開發人員可以根據實際情況對條件進行組合搜尋,這樣搜尋起來就更精準了,使用起來很簡單,這裡不再舉例子了。

  2、Android SDK Search

       該工具使用起來使得線上閱讀原始碼更方便,將API和原始碼完美結合起來。但是使用該工具,需要VPN,即需要FQ,訪問境外伺服器。這裡筆者就不詳細介紹了,能FQ的讀者,可以參考如下使用方法網址:【Android SDK Search 使用方法】。另外提供一個免費FQ工具,簡單易用:【藍燈(Lantern)】。

  3、Source Insight

       這是一款被開發者們廣泛使用和稱讚的本地原始碼閱讀軟體,除了閱讀,還可以方便地進行開發。Source Insight工具功能強大,操作複雜,以後會專門寫一篇文章來介紹它的使用,這裡篇幅有限,就不詳細介紹了。除此之外,還有很多開發工具可以用來閱讀原始碼,比如Eclipse,Android Studio等都可以用來閱讀系統原始碼,但這方面的功能無法和Source Insight相提並論,就不多做介紹了,把使用最廣泛,最專業的工具用好就可以了。