高通Android環境中Linux內核會作為Android的一部分進行編譯,直接使用make即可一次性從頭編到尾。而有的平台比如Marvell,內核的編譯操作相對比較獨立,必須使用標准的內核編譯命令進行單獨編譯。一般來說,用高通的這種方式比較傻瓜化,一步到底的感覺;而用Marvell的方式用戶干預較多,靈活性也更大。當然這里不是比較他們孰優孰劣,對我來說這兩種方式各有千秋。在遇到具體問題時,有時還會覺得獨立編譯內核的方式比較方便,比如編譯內核模塊這一點上。
編譯內核模塊之前必須先編譯內核,編譯內核之前必須先指定內核配置。在獨立編譯內核情況下,編譯一遍內核后,可以直接使用 make module
來編譯內核模塊,如果修改了相應模塊文件,使用相同的命令也能很快的進行增量編譯。而在高通環境下,由於內核的編譯過程已經被集成到Android的編譯中,所以每次編譯內核或者內核模塊時,都必須通過Android的編譯環境進行啟用。雖然Android提供諸如 make bootimage
命令,可以只編譯bootimage相關內容,但是Android龐大的編譯體系在初始化時也會占用很多的時間。前段時間在調試一個獨立的內核模塊時就一直被這個問題困擾着,每次修改模塊代碼后都必須通過 make bootimage
來編譯。雖然只有一個文件,但是每次編譯都花費至少1min30sec,嚴重影響了開發進度。為此,自己參考內核模塊獨立編譯的Makefile和Android的環境特點寫了一個內核模塊編譯Makefile。
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
|
該Makefile默認會將當前目錄下的 my_module.c
文件編譯為內核模塊。同時,在編譯時會強制檢查Android的環境是否正確配置,如果沒有配置它會進行相應提示后退出編譯處理。編譯模塊時使用的內核配置是編譯Android時指定項目所配置的內核配置。如果內核還沒有編譯,則在編譯模塊之前會自動編譯內核主體。如果一切OK,則每次只會編譯修改過的模塊文件。編譯好后會將模塊文件單獨拷貝到當前目錄下的 package
目錄中,方便使用。
使用該編譯腳本后,模塊的編寫調試效率高了不少,至少每次編譯模塊都可以在5sec內搞定了。加上上機實測調試,也能在30sec內完成。生命很可貴,像我一樣當個懶人吧。