做了不少NDK相關的工作,不知道別人有沒有同樣的困惑,經常在編譯C/C++代碼的時候會出一些error或者warning,然后在網上搜,發現在Android.mk或者Application.mk文件中加一些配置選項就能解決,但是加完之后卻不知道這些都是干什么用的,或者找不到系統學習的地方。我猜可能是開發NDK的程序員對於利用NDK寫代碼的程序員的能力太過自信,所以沒有給出什么參考資料,頂多就是NDK目錄下的Doc。這就導致在優化動態鏈接庫的時候,除了提升算法、代碼級優化,往往不知從何下手。對於這個問題我也一直很頭疼,不過最近算是有了點起色,下面是我個人的理解。
所謂的Android.mk和Application.mk其實和Linux系統中的makefile是非常接近,就是一種用於編譯比較大工程並配置編譯選項的文件。其中不同的部分一般都是NDK中自己添加的,這些在Doc里面基本都寫到了,剩下的部分就都是GCC編譯器的選項了,參考網站:
http://gcc.gnu.org/onlinedocs/gcc-4.8.1/gcc/index.html#toc_Invoking-GCC
http://gcc.gnu.org/onlinedocs/gcc-4.3.6/gnat_ugn_unw/Improving-Performance.html#Improving-Performance
在優化動態鏈接庫大小和速度的時候,其實主要就是LOCAL_CFLAGS和LOCAL_LDFLAGS這兩個,一般來說在LOCAL_CFLAGS后面追加-O1,O2,O3,Os,Ofast這幾個選項就差不多能滿足要求,如果感覺還是不滿意的話,可以自己再逐項進行優化,比如在LOCAL_CFLAGS追加-ffunction-sections和-fdata-sections,在LOCAL_LDFLAGS追加-Wl,--gc-sections編譯選項。這樣基本就差不多了。當然,要想進行深入的研究和優化,可能還要好好研究一下gnu官網給出的資料。