Ⅰ 請教關於android移植的問題
一、概述
移植的工作一般的主要不外乎做以下這些事情:
A、有的現成好的直接選配
這個工作主要是熟悉該源碼的編譯系統,就是源碼自動化編譯是怎麼組織的。Linux環境下不外乎是Makefile及腳本。所以得熟悉這兩個方面的知識。
B、有的不好的代碼修改好後選配
這個工作不僅僅是要熟悉編譯系統,還要熟悉別人的代碼結構。一般牛X的軟體架構也牛X,所以主要是學習牛X的人設計的代碼結構,所謂的框架。框架懂了,再熟悉裡面的細節,就可以改了。
C、添加新代碼並選配
這個工作同樣要熟悉編譯系統及源碼結構。這個時候對框架可能不能僅僅限於知道,而且要深刻理解,按照牛人的思路來設計代碼。
所以Android的移植就可以簡單的說成有以下方面的工作:
A、熟悉android的編譯系統
主要是.mk文件的規則,這個官網及源碼中有文檔說明(development/Ndk/Docs/android-mk.txt),得好好研究清楚。
就源碼中的腳本,譬如:build/envsetup.sh
B、熟悉android的源碼目錄結構
system:根文件系統相關的一些代碼
packages:android的一些APP的源碼
frameworks:framework層代碼,不改動android源碼的話,主要就是app層調用hal層代碼的介面實現的源碼
hardware:hal層代碼
devices和vendor:廠商定製代碼
build:編譯系統的一些mk文件
out:是編譯輸出目錄
主要的一些目錄就是上面了,對於初學的話,差不多就足夠了。當然所有的都熟悉是最好了。
C、三個層次的代碼
要向android添加代碼的話,一般主要熟悉三個層次的代碼就差不多了。
APP<--->framework<--->HAL
APP:應用程序層次,主要是java代碼,通過跨平台的java編寫的代碼來完成需求邏輯對系統提出功能性要求,讓系統去完成相應的動作。
framework:cpp代碼,主要是提供給java調用的介面,這些介面通常是去調用到hal層的代碼。
HAL:登記一組供framework回調的函數,來完成一定的功能。
Ⅱ 拿到Android 項目源碼後,如何才能以最高效的速度看懂
1.顯然Eclipse不是閱讀Android源碼的好工具,不流暢,搜索低效,繼承性關系/調用關系都無法有效查看。推薦Source Insight,在這個工具幫助下,你才可以駕馭巨大數量的Android 源碼,你可以從容在Java,C++,C代碼間遨遊,你可以很快找到你需要的繼承關系。
順便,我們公司一直是Windows+Linux+Samba的工作模式。
2.宏觀上看,Android源碼分為功能實現上的縱向,和功能拓展上的橫向。在閱讀源碼時需要把握好著兩個思路。
譬如你需要研究音頻系統的實現原理,縱向:你需要從一個音樂的開始播放追蹤,一路下來,你發現Jni調用解碼庫,共享內存的創建和使用,路由的切換,音頻輸入設備的開啟,音頻流的開始。
3.Android的功能模塊絕大部分是C/S架構,你心裡一定需要有這個層級關系,你需要思路清晰地找到Server的位置,它才是你需要攻破的城。然後你才能發現HAL和Kernel一層層地剝離。
我大概在三個月前閱讀完Android UI系統的源碼,這是Android最復雜的部分,沒有之一。
我需要先找一個開頭,和UI有直接關系的就是最常見的Activity了吧,我就從它開始解剖。
我從Activity的創建入手,尋找Activity真正的創建位置,setContentview這個方法很明顯和UI有關,這兩方面一結合,我發現了ViewRoot和WindowManager的身影,沿著WM和WMS我發現了Surface,以及draw的函數,它居然在Activity 創建時出現的DeCorView上畫東西。藉助Source Insight我總結了UI Java層的橫向靜態圖。
完成這個靜態UML,我覺得我可以開始功能實現上追蹤了,這部分主要是C++的代碼(這也是我堅定勸阻的放棄Eclipse的原因),我沿著draw函數,看到了各個層級的關系,SurfaceSession的控制和事務處理,SharedBuffer讀寫控制,彪悍的SurfaceFlinger主宰一切,OpenGL ES的神筆馬良。FrameBuffer和FrameBufferDevice的圖像輸出。一氣呵成的完成了。