本文均屬自己閱讀源碼的點滴總結,轉賬請註明出處謝謝。
歡迎和大家交流。qq:1037701636 email:gzzaigcn2012@gmail.com
註:Hardware:A31,Software:Android4.2.2
俗話說,良好的開頭是成功的一半。研究Android龐大的系統代碼(話說編譯完4.2.2的源碼大概也就10多個G吧),工具上至少要高大上,心態上必要低奢內,本著Read The Fucking Code的不死精神,大腳大腳的向前走,死不要臉的讀下去。然後,然後,最終你就會看到那陽光是多麼的燦爛,撥開雲霧見天日的優越感瞬間會沖刷著你的最強大腦。
一.寫一下屬於我的Android4.2.2 FW等底層開發所需的基本工具與手段:
A.window級使用者:不建議虛擬機器,最好的機子編譯起來也會比較費時,恐怖的源碼啊。一般企業級裡面都會配有一台伺服器,開個50G的空間,安裝個Ubuntu12.04 64bit的虛擬機器,100G的空間基本就OK了。故使用的手段時本地Eclipse+SourceInsight+Cygwin+SecureCRT(SSH), 遠程配上Samba伺服器,加上那大的要死的Android源碼;
B.Linux級使用者:一般推薦直接PC上安裝個Ubuntu系統,編譯會省去很多時間的哦,32bit的10.04和64bit的12.04都是Google官方推薦的。Ubutnu+Wine+SourceInsight基本上也就是絕配了,話說真正的Linux大神都是Vim+Emacs+Eclipse是其最喜歡的。
遠程伺服器端配置Samba的過程記錄如下:
step1:Ubuntu卸載、安裝Samba命令。
卸載:sudo apt-get remove samba-commonsudo apt-get remove smbclientsudo apt-get remove samba安裝:sudo apt-get install sambasudo apt-get install smbfs
step2: Samba的配置,建立一個共用的目錄。
[A31_Android_SDK] //windows下登陸smb伺服器會顯示出的檔案名稱path = /home/android4.2.2 //指定共用目錄路徑,若不存在,則自己建立available = yesbrowseable = yespublic = yeswriteable = yesguest ok = yes
step3: Window下開啟一個網路檔案,方便SourceInsight的建立工程。
win7下的流程是電腦——>檔案——>添加一個網路位置——>伺服器IP/xxx(要共用的目錄名),列如:\\192.168.1.217\A31_Android_SDK。
注意點:
如果win下面出現xxx不允許訪問,您可能沒有許可權使用網路資源,,,等時,可採用cmd啟動windows命令列net use * /del /y 允許該命令即可。
C. 對SourceInsight的使用,Android源碼量大,故如果手動一次完全匯入的話,在同步源碼的各種符號連結時基本就是會報出記憶體不夠的錯誤。相比4.2.2的源碼,2.3的可以直接建立工程完全匯入,4以上的源碼建議將Framework, HardWare , Devices和System這幾個匯入即可,同步所需的時間不會很久。
二. C++的基礎開發知識在Android FrameWork層中的重要性
由於當初的C++學的比較粗糙,基本沒有OOP的思維,以前完全是按C的流式理念在編碼,故自己給自己補充了一些在FrameWork中中出現的C++的基礎知識。
2.1 C++中的類,成員變數和成員函數
類:Class Base,具備構造和解構函式,擁有Public,Protected,Private等成員屬性。
對象: Base mBase;
成員變數:原來標準的變數名編碼的習慣都是mxxx開頭的;
2.2 C++中的類模板和函數模板
C++的類模板,也稱之為參數化類別,其在Android裡面無處不在,典型的如SP,Binder類模板的基礎結構如下:
template <class T1, class T2, class T3>Class Base {};
Base類裡面的資料成員,成員函數的某些資料類型會由T1,T2,T3等來標定
類似的函數模板
template <typename T>T fun(){ return 0;}
2.3 C++符號的重載
在FW裡面用的比較多的運算子號重載主要是賦值=,指標->等,在SP裡面用的比較經典。
函數類型 operator 運算子(參數表)
{
函數的實現;
}
2.4.C++中”虛“的力量
基類、繼承、派生:Class Derived:Public Base,兒子與父親的關係,通過繼承屬性,衍生類別可以使用決定使用父類成員的範圍。
虛函數:一般在基類中帶有virtual的函數,虛函數的力量在於實現了C++中的一個多態的特性,使得對象在運行時才去決定調用的實際成員函數。
純虛函數:在虛函數的基礎上直接賦值為=0;
抽象類別:帶有的成員函數都為純虛函數,主要是定義介面,讓繼承的子類都實現,否則子類也只能成了抽象類別了。抽象類別不能new對象,可以使用指標和引用等。
2.5.C++中的這個this
C++中的this是個比較牛逼的東西,隨著對象的產生而就一直存在,無論你訪問哪個成員函數,編譯器都會自動將this指標作為參數傳入到對應的函數中。
2.6 C++中的結構體Struct
C看的多了,亦不知C++的結構體基本就是類的概念了,C++的結構體多作為Class的內部類,結構體內可以帶有成員函數。與類的區別就在於它的所以成員都是預設下都是Public的,區別與類的預設Private。
2.7.C++對象在記憶體中的布局
這個屬於C++較深層次的東西,從C的角度來理解,一個對象在調用建構函式時,預設開闢一個記憶體空間來維護這個對象,類的對象中是沒有關於普通成員函數的指標的,只有成員變數還有虛表指標。
先記錄到這裡,後續有新的內容再補充。