第1步:安装ccache工具
在Android源代码目录prebuilts/misc/linux-x86/ccache下面有ccache工具的源代码包拷出来(建议根目录),把它解压,然后参考里面的INSTALL.txt文档。操作如下命令(进入到解压的文件里面执行):
./configure
make
sudo make install
第2步:配置ccache环境
在~/.bashrc中添加(或者/etc/profile文件中):
export USE_CCACHE=1
export CCACHE_DIR=/<path_of_your_choice>/.ccache
默认情况下cache(缓存)会保存在~/.ccache目录下,如果主目录位于NFS或其他非本地文件系统上, 设置cache目录位置:
export CCACHE_DIR=<path-to-your-cache-directory>
注:配置.bashrc后注意source改文件,否则cache(缓存)会保存在~/.ccache目录下,而不是你设置的目录。
第3步: 使用Android源码prebuilts目录下面的ccache工具初始化该文件夹
推荐的cache目录大小为50-100GB,在命令行执行以下命令:
prebuilts/misc/linux-x86/ccache/ccache -M 50G
注:以上命令需要在你所下载的代码的根目录下面执行
该设置会保存到CCACHE_DIR中,且该命令是长效的,不会因系统重启而失效。使用ccache第一次编译后能够明显提高make clean以后再次的编译速度。使用ccache之后,第一次编译会时间久一点,之后每次编译速度都会有提升,降低所有使用gcc的编译时间,大约25%~30%。
第4步:你可以查看ccahe使用情况,看看上面的设置是否有效
ccache -s
注:可以通过ccache -s查看cache信息,如果满了可以用ccache -C清除所有。在满了状态下编译新codebase,将会旧的那个清除,这会降低效率,所以cache一定要设置正确!
第5步:开启kernel ccache
(1). 以上ccache只对编译android有效,kernel部分需要额外设置才行
(2). 找到alps/kernel/Makefile文件中的
AS = $(CROSS_COMPILE)as
LD = $(CROSS_COMPILE)ld
CC = $(CROSS_COMPILE)gcc
CPP = $(CC) -E
之后添加如下代码:
ifneq ($(USE_CCACHE),)
export CCACHE_COMPILERCHECK := content
export CCACHE_SLOPPINESS := time_macros,include_file_mtime,file_macro
export CCACHE_BASEDIR := /
ccache := $(strip $(wildcard $(PWD)/../prebuilts/misc/linux-x86/ccache/ccache))
ifdef ccache
ifneq ($(ccache),$(firstword $(CC)))
CC := $(ccache) $(CC)
endif
ccache =
endif
endif
(3). 这样在编译kernel时也可以享受到ccache带来编译时间的缩短。
以上方法优化后大约可降低50%的编译时间,也就是说优化前需要1小时编译时间,优化后半小时就完成了。
第6步: 共享ccache的缓存 (不共享的话忽略此步)
所有需要共享的用户请添加以下环境变量:
export CCACHE_DIR=<ccache缓存路径>
exportCACHE_UMASK=002
unsetCCACHE_HARDLINK
可以将以上添加到$HOME/.bashrc,保证打开的终端都已经加载以上的环境变量。其中< ccache缓存路径 >请替换为指定的绝对路径(必须是需要共享的用户都能读写的)。比如:/proj/.ccache
注意:由于多人同时写ccache缓存可能引起IO带宽不够反而降低效率,强烈建议服务器编译可以此配置,但是其他共享用户最好增加下面配置, 仅只读缓存内容。
export CCACHE_READONLY=1
设置好环境变量后,重新登入终端使环境变量生效,然后创建< ccache缓存路径 >,设置< ccache缓存路径 >的共享权限,在终端输入:
find $CCACHE_DIR -type d | xargs chmod g+s
完成前面的步骤后,就可以开始共享使用了,注意ccache空间要足够大,否则反而拉长编译时间。
如果遇到问题可以参考ccache的使用说明:http://ccache.samba.org/manual.html