谈谈Android NDK中动态链接库(.so文件)的优化
做了不少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官网给出的资料。