首先感謝各位兄弟姐妹們的耐心等待。本書預計在3月中旬上市發售。從今天開始,我將在部落格中連載此書的一些內容。注意,此處連載的是未經出版社編輯的原始稿件,所以樣子會有些非專業。
[要點:建議那些還在拿vim看代碼的兄弟,趕緊用source insight或者eclipse吧。
對於搞Framework的人,必須要掌握的技能就是用Eclipse調試System_server代碼
最後,沒有代碼,airpcap工具的兄弟,請下載本書資源]
第一章 準備工作
本章主要內容:
- 介紹本書的內容組成;
- 工具使用;
- 本書資源下載說明。
1.1 Android系統架構
Android是Google公司推出的一款手機開發平台。該平台本身是基於Linux核心的,圖1-1展示了這個系統的架構。
圖1-1 Android系統架構
從圖1-1可知,Android系統大體可分為四層,從下往上依次是:
- Linux核心層,目前Android 4.4(代號為KitKat)基於Linux核心3.4版本。
- Libraries層,這一層提供動態庫(也叫共用庫)、Android執行階段程式庫、Dalvik虛擬機器[1]等。從程式設計語言上來說,這一層大部分都是用C或C++寫的,所以也可以簡單地把它看成是Native層。
- Libraries層之上是Framework層,這一層大部分用Java語言編寫。它是Android平台上Java世界的基石。
- Framework層之上就是Applications層了,和使用者直接互動的就是這些應用程式,它們都是用Java開發的。
1.2 工具使用
本節介紹Android開發和源碼研究過程中的三件利器。
1.2.1 Source Insight的使用
Source Insight是閱讀源碼的必備工具,是一個Windows下的軟體,在Linux平台上可通過wine安裝。下面介紹一下如何在Source Insight中匯入源碼。
使用Source Insight時,需要建立一個源碼工程,通過功能表項目Project→New Project,可指定源碼的目錄。
提示 特別提醒讀者的是,很多讀者常把Android所有原始碼都加到工程中,這將導致Source Insight運行速度非常慢。
實際上,只需要將當前分析的源碼目錄加到工程即可。例如,建立一個Source Insight工程後,只把源碼/framework/base目錄加進去了。另外,當一個目錄下的源碼分析完後,可以通過Project→Add and Remove Project Files選項把無須再分析的目錄從工程中去掉。上述步驟1-2所示。
圖1-2 添加或刪除工程中的目錄
從圖1-2右邊的框可知:Source Insight支援動態添加或刪除目錄。通過這種方式可極大減少Source Insight的工作負擔。
提示:一般首先把framework/base下的目錄加到工程,以後如有需要,再把其他目錄加進來。另外,關於Source Insight其他提示,讀者可參考《深入理解Android:卷1》第1章。
1.2.2 Eclipse的使用
筆者一般使用Source Insight來查看Native代碼,而Android推薦的整合開發工具Eclipse卻既能查看Java代碼和Native代碼,也能調試系統核心進程。
1. 匯入Android Framework Java源碼
注意,這一步必須編譯完整個Android源碼才可以實施,步驟如下:
1) 將Android源碼目錄/development/ide/eclipse/.classpath複製到Android源碼根目錄。
2) 開啟Android源碼根目錄下的.classpath檔案。該檔案是供Eclipse使用的,其中儲存的是源碼目錄中各個模組的路徑。
由於我們只關心Framework相關的模組,因此可以把一些不是Framework的目錄從該檔案中注釋掉。同時,去掉不必要的模組也可加快Android源碼匯入速度。圖1-3所示為該檔案的部分內容。
圖1-3 .classpath檔案內容示意
然後,請讀者單擊Eclipse功能表列New->Java Project,彈出1-4所示的對話方塊。設定Location為Android 4.2源碼所在路徑。
圖1-4 匯入Android源碼
由於Android 4.2源碼檔案較多,匯入處理程序會持續較長一段時間。
提示:
1)匯入源碼前一定要取消Eclipse的自動編譯選項(通過功能表列Project→Build Project Automatically設定)。另外,源碼匯入完畢後,讀者千萬不要清理(clean)這個工程。清理會刪除之前源碼編譯所產生的檔案,導致後續又得重新編譯Android系統了。
2)筆者在本書的共用資源中提供了一個已經配置好的.classpath檔案,請讀者下載並使用它。
2. 匯入Android Native代碼
本節介紹如何在Eclipse中匯入Android Native代碼,其步驟如下所示:
- 匯入Android Framework中的Java檔案後,首先切換到C/C++視圖(通過單擊功能表列Window→Open Perspective→選擇C/C++)。
- 單擊功能表列New→C/C++,然後選擇Convert to a C/C++ project。1-5所示:
圖1-5 轉換成C++工程示意
按照圖1-5操作之後,之前的Java工程就被轉成了C++工程。不過讀者仍需要完成以下幾個步驟。
1) 通過Properties→C/C++ General→Paths and symbols,開啟該工程的路徑和符號設定對話。1-6所示。
圖1-6 路徑和符號設定
2)在圖1-6上邊的框中選擇Includes頁面,然後點擊下方框中的Import Settings,然後選擇4.2源碼/development/ide/eclipse/android-include-paths.xml以匯入路徑配置。
3) 同上,再選擇圖1-6中的Symbols頁面,然後通過下方框中的Import Settings以匯入4.2源碼/development/ide/eclipse/android-symbols.xml檔案。
以上配置好路徑和符號檔案後,讀者可進一步通過圖1-6上框中的Source Location頁面選擇此次需要匯入的C++檔案。這一步1-7所示。
圖1-7 過濾C++檔案
通過圖1-7中Add Folder選項,讀者可以選擇哪些目錄下的C++檔案被過濾掉。筆者目前僅匯入了frameworks目錄下的Native代碼。
當所有檔案都匯入完畢後,讀者通過右擊C++工程,然後選擇Index→Rebuild來重建Native代碼的索引。
至此,通過上述方法就能匯入Android中的Native代碼了。
3. 調試SystemServer
調試SystemServer的步驟如下:
1) 首先編譯Android源碼工程。編譯過程中會有很多警告。如果有錯誤,大部分原因是.classpath檔案將不需要的模組包含了進來。讀者可根據Eclipse的提示做相應處理。筆者配置的幾台機器基本都是一次配置就成功了。
2) 在Android源碼工程上單擊右鍵,依次單擊Debug As→Debug Configurations,彈出1-8所示的對話方塊,然後從左邊找到Remote Java Application一欄。
圖1-8 Debug配置框
3) 單擊圖1-8中黑框中的建立按鈕,然後按圖1-9中的黑框中的內容來設定該對話方塊。
圖1-9 Remote Java Application配置
由圖1-9所示,需要選擇Remote調試連接埠號碼為8600,Host類型為localhost。8600是SystemServer進程的調試連接埠號碼。Eclipse一旦串連到該連接埠,即可通過JDWP協議來調試SystemServer。
提示:讀者也可閱讀《深入理解Android:卷2》第1章來瞭解更多使用Eclipse的建議。
1.2.3 BusyBox的使用
BusyBox,號稱Linux平台上的“瑞士軍刀”,它提供了很多常用的工具,例如grep、find等。這些工具在標準Linux上都有,但Android系統卻去掉了其中的大多數工具。這導致了我們在偵錯工具、研究Android系統時步履維艱,所以就需要在手機上安裝BusyBox。
1. 下載BusyBox
可從網站http://www.busybox.net/downloads/binaries/1.21.1/下載已編譯好的BusyBox,1-10所示。
圖1-10 BusyBox下載
注意該網站已經根據不同平台編譯好了對應的BusyBox,我們可根據自己手機的情況下載對應的檔案。筆者下載了支援Galaxy Note 2的busybox-armv7l。
提升:arm v7表示ARM指令集為v7,目前ARM Cortex-A8/A9系列的CPU支援該指令集。
2. 安裝和使用BusyBox
下載完BusyBox後,需將它adb push到手機上。如:
adb push busybox /system/xbin #為了避免衝突,筆者push到了/system/xbin目錄下
cd /system/xbin #進入對應目錄
chmod 755 busybox #更改busybox許可權為可執行
busybox –-install . #安裝busybox
grep #執行busybox提供的grep命令,或者busybox xxx執行xxx命令也行
BusyBox安裝完了,如執行busybox命令,就會列印1-11的輸出。
圖1-11 BusyBox提供的工具
從中可看出,BusyBox提供了不少的工具,這樣,我們在研究Android系統時就如虎添翼了。
提示:本書共用資源中提供了busybox-armv7l的下載。
1.3 本書資源下載說明
為了減輕國內讀者無法從Android官網上下載源碼的煩惱,筆者在115網盤上分享了本書所使用的Android源碼及其他一些資源,1-12所示。
圖1-12 本書資源
圖1-12中:
- 4.2.2.tar.gz為4.2.2源碼壓縮包。請讀者特別注意,本書對wpa_supplicant的分析使用的是Android 4.1源碼中的wpa_supplicant,故筆者在external目錄中將4.1版本中的wpa_supplicant代碼複製到wpa_supplicant_8_4.1中。
- classpath為Android Java設定檔,使用時請將它改名為.classpath。
- busybox-armv7l是BusyBox。
- com.cb.eclipse.folding_1.0.6.jar是一個Eclipse的外掛程式,名叫Coffee Byte Java,它可以摺疊程式碼片段以方便閱讀[2]。
- 最後四個檔案為筆者研究Wi-Fi時利用Wi-Fi資料截獲工具AirPcap儲存的相關協議資料包,其中p2p_cap為測試P2P時儲存的資料包,wps_pbc和wps_pin為測試WSC PBC和PIN時儲存的資料包,wpa_supplicant_analysis為測試STA加入AP時所儲存的資料包。沒有AirPcap工具的讀者可通過Wireshark工具直接匯入這些資料以更直觀得方式來分析Wi-Fi。
最後,該資源的是http://115.com/lb/5lbdugrdt4r。另外,請讀者務必關注筆者的部落格blog.csdn.net/innost以擷取更新資訊。
[1] 4.4新增了一個名為ART的虛擬機器運行時,相信它的出現能提升應用程式的運行速度。
[2]其用法請參考《深入理解Android:卷2》第1章。其電子版為http://download.csdn.net/detail/innost/4408140。